Project
Loading...
Searching...
No Matches
GPUReconstruction.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
14
15#if !defined(GPURECONSTRUCTION_H) && !defined(__OPENCL__)
16#define GPURECONSTRUCTION_H
17
18#include <cstddef>
19#include <cstdio>
20#include <cstring>
21#include <string>
22#include <memory>
23#include <iosfwd>
24#include <vector>
25#include <functional>
26#include <unordered_map>
27#include <unordered_set>
28#include <atomic>
29
30#include "GPUDataTypesIO.h"
31#include "GPUMemoryResource.h"
32#include "GPUOutputControl.h"
33#include "GPUParam.h"
34#include "GPUConstantMem.h"
36#include "GPUDef.h"
37
38namespace o2::its
39{
40template <int>
41class TrackerTraits;
42template <int>
43class VertexerTraits;
44template <int>
45class TimeFrame;
46} // namespace o2::its
47
48namespace o2::gpu
49{
50class GPUChain;
51struct GPUMemorySizeScalers;
52struct GPUReconstructionPipelineContext;
53struct GPUReconstructionThreading;
54class GPUROOTDumpCore;
55class ThrustVolatileAllocator;
56struct GPUDefParameters;
57class GPUMemoryResource;
58struct GPUSettingsDeviceBackend;
59struct GPUSettingsGRP;
60struct GPUSettingsProcessing;
61struct GPUSettingsRec;
62struct GPUSettingsRecDynamic;
63struct GPUMemoryReuse;
64
65namespace gpu_reconstruction_kernels
66{
67struct deviceEvent;
68class threadContext;
69} // namespace gpu_reconstruction_kernels
70
72{
73 protected:
74 class LibraryLoader; // These must be the first members to ensure correct destructor order!
75 std::shared_ptr<LibraryLoader> mMyLib = nullptr;
76 std::vector<GPUMemoryResource> mMemoryResources;
77 std::vector<std::unique_ptr<GPUChain>> mChains;
78
79 public:
80 virtual ~GPUReconstruction();
83
84 // General definitions
85 constexpr static uint32_t NSECTORS = GPUTPCGeometry::NSECTORS;
86
93
94 static constexpr const char* const GEOMETRY_TYPE_NAMES[] = {"INVALID", "ALIROOT", "O2"};
95#ifdef GPUCA_RUN2
96 static constexpr GeometryType geometryType = GeometryType::ALIROOT;
97#else
98 static constexpr GeometryType geometryType = GeometryType::O2;
99#endif
100
101 enum retValValue : uint32_t { ok = 0,
102 error = 1,
105 abort = 4 };
106 static DeviceType GetDeviceType(const char* type);
107 enum InOutPointerType : uint32_t { CLUSTER_DATA = 0,
121 TPC_ZS = 14,
127 static constexpr const char* const IOTYPENAMES[] = {"TPC HLT Clusters", "TPC Sector Tracks", "TPC Sector Track Clusters", "TPC Cluster MC Labels", "TPC Track MC Informations", "TPC Tracks", "TPC Track Clusters", "TRD Tracks", "TRD Tracklets",
128 "TPC Raw Clusters", "TPC Native Clusters", "TRD Tracklet MC Labels", "TPC Compressed Clusters", "TPC Digit", "TPC ZS Page", "TPC Native Clusters MC Labels", "TPC Digit MC Labeels",
129 "TRD Spacepoints", "TRD Triggerrecords", "TF Settings"};
131
132 // Functionality to create an instance of GPUReconstruction for the desired device
134 static GPUReconstruction* CreateInstance(DeviceType type = DeviceType::CPU, bool forceType = true, GPUReconstruction* master = nullptr);
135 static GPUReconstruction* CreateInstance(int32_t type, bool forceType, GPUReconstruction* master = nullptr) { return CreateInstance((DeviceType)type, forceType, master); }
136 static GPUReconstruction* CreateInstance(const char* type, bool forceType, GPUReconstruction* master = nullptr);
137 static bool CheckInstanceAvailable(DeviceType type, bool verbose);
138
139 enum class krnlDeviceType : int32_t { CPU = 0,
140 Device = 1,
141 Auto = -1 };
142
143 // Global steering functions
144 template <class T, typename... Args>
145 T* AddChain(Args... args);
146
147 int32_t Init();
148 int32_t Finalize();
149 int32_t Exit();
150
151 void DumpSettings(const char* dir = "");
152 int32_t ReadSettings(const char* dir = "");
153
154 void PrepareEvent();
155 virtual int32_t RunChains() = 0;
158 int32_t registerMemoryForGPU(const void* ptr, size_t size);
159 int32_t unregisterMemoryForGPU(const void* ptr);
160 virtual void* getGPUPointer(void* ptr) { return ptr; }
161 virtual void startGPUProfiling() {}
162 virtual void endGPUProfiling() {}
163 int32_t GPUChkErrA(const int64_t error, const char* file, int32_t line, bool failOnError);
164 int32_t CheckErrorCodes(bool cpuOnly = false, bool forceShowErrors = false, std::vector<std::array<uint32_t, 4>>* fillErrors = nullptr);
165 void RunPipelineWorker();
167 void DrainPipeline();
168
169 // Helpers for memory allocation
171 template <class T>
172 int16_t RegisterMemoryAllocation(T* proc, void* (T::*setPtr)(void*), int32_t type, const char* name = "", const GPUMemoryReuse& re = GPUMemoryReuse());
174 size_t AllocateRegisteredMemory(GPUProcessor* proc, bool resetCustom = false);
175
176 size_t AllocateRegisteredMemory(int16_t res, GPUOutputControl* control = nullptr);
178 void* AllocateDirectMemory(size_t size, int32_t type);
180 void* AllocateVolatileMemory(size_t size, bool device);
182 void FreeRegisteredMemory(GPUProcessor* proc, bool freeCustom = false, bool freePermanent = false);
183 void FreeRegisteredMemory(int16_t res);
184 void ClearAllocatedMemory(bool clearOutputs = true);
188 void PushNonPersistentMemory(uint64_t tag);
189 void PopNonPersistentMemory(RecoStep step, uint64_t tag, const GPUProcessor* proc = nullptr);
194 void ComputeReuseMax(GPUProcessor* proc);
196 void PrintMemoryOverview();
197 void PrintMemoryMax();
198 void SetMemoryExternalInput(int16_t res, void* ptr);
200
201 // Helpers to fetch processors from other shared libraries
202 virtual void GetITSTraits(std::unique_ptr<o2::its::TrackerTraits<7>>* trackerTraits, std::unique_ptr<o2::its::VertexerTraits<7>>* vertexerTraits, std::unique_ptr<o2::its::TimeFrame<7>>* timeFrame);
203 bool slavesExist() { return mSlaves.size() || mMaster; }
204 int slaveId() { return mSlaveId; }
205
206 // Getters / setters for parameters
208 bool IsGPU() const { return GetDeviceType() != DeviceType::INVALID_DEVICE && GetDeviceType() != DeviceType::CPU; }
209 const GPUParam& GetParam() const;
212 const GPUSettingsGRP& GetGRPSettings() const { return *mGRPSettings; }
214 const GPUSettingsProcessing& GetProcessingSettings() const { return *mProcessingSettings; }
215 const GPUCalibObjectsConst& GetCalib() const;
216 bool IsInitialized() const { return mInitialized; }
217 void SetSettings(float solenoidBzNominalGPU, const GPURecoStepConfiguration* workflow = nullptr);
218 void SetSettings(const GPUSettingsGRP* grp, const GPUSettingsRec* rec = nullptr, const GPUSettingsProcessing* proc = nullptr, const GPURecoStepConfiguration* workflow = nullptr);
219 void SetResetTimers(bool reset); // May update also after Init()
220 void SetDebugLevelTmp(int32_t level); // Temporarily, before calling SetSettings()
221 void UpdateSettings(const GPUSettingsGRP* g, const GPUSettingsProcessing* p = nullptr, const GPUSettingsRecDynamic* d = nullptr);
222 void UpdateDynamicSettings(const GPUSettingsRecDynamic* d);
224 void SetOutputControl(void* ptr, size_t size);
225 void SetInputControl(void* ptr, size_t size);
227 uint32_t NStreams() const { return mNStreams; }
228 const void* DeviceMemoryBase() const { return mDeviceMemoryBase; }
229 virtual const GPUDefParameters& getGPUParameters(bool doGPU) const = 0;
230
235 int32_t getRecoStepNum(RecoStep step, bool validCheck = true);
236 int32_t getGeneralStepNum(GeneralStep step, bool validCheck = true);
237
238 void setErrorCodeOutput(std::vector<std::array<uint32_t, 4>>* v) { mOutputErrorCodes = v; }
239 std::vector<std::array<uint32_t, 4>>* getErrorCodeOutput() { return mOutputErrorCodes; }
240
241 // Registration of GPU Processors
242 template <class T>
243 void RegisterGPUProcessor(T* proc, bool deviceSlave);
244 template <class T>
245 void SetupGPUProcessor(T* proc, bool allocate);
246 void RegisterGPUDeviceProcessor(GPUProcessor* proc, GPUProcessor* slaveProcessor);
248
249 // Support / Debugging
250 virtual void PrintKernelOccupancies() {}
252 double GetStatWallTime() { return mStatWallTime; }
253 void setDebugDumpCallback(std::function<void()>&& callback = std::function<void()>(nullptr));
254 bool triggerDebugDump();
255 std::string getDebugFolder(const std::string& prefix = ""); // empty string = no debug
256
257 // Threading
258 std::shared_ptr<GPUReconstructionThreading> mThreading;
259 static int32_t getHostThreadIndex();
260 int32_t GetMaxBackendThreads() const { return mMaxBackendThreads; }
261
263 template <typename T>
265 {
266 return alignedAllocator<char, constants::GPU_BUFFER_ALIGNMENT>::allocate(n); // Note that char is correct, since the buffer is a char buffer
267 }
268
269 protected:
272 GPUReconstruction(const GPUSettingsDeviceBackend& cfg); // Constructor
273 int32_t InitPhaseBeforeDevice();
274 virtual int32_t InitDevice() = 0;
275 int32_t InitPhasePermanentMemory();
276 int32_t InitPhaseAfterDevice();
277 void WriteConstantParams(int32_t stream = -1);
278 virtual int32_t ExitDevice() = 0;
279 virtual size_t WriteToConstantMemory(size_t offset, const void* src, size_t size, int32_t stream = -1, gpu_reconstruction_kernels::deviceEvent* ev = nullptr) = 0;
280 void UpdateMaxMemoryUsed();
281 int32_t EnqueuePipeline(bool terminate = false);
283 virtual int32_t GPUChkErrInternal(const int64_t error, const char* file, int32_t line) const { return 0; }
284
285 virtual int32_t registerMemoryForGPU_internal(const void* ptr, size_t size) = 0;
286 virtual int32_t unregisterMemoryForGPU_internal(const void* ptr) = 0;
287
288 // Management for GPU thread contexts
289 virtual std::unique_ptr<gpu_reconstruction_kernels::threadContext> GetThreadContext() = 0;
290
291 // Private helpers for library loading
292 static std::shared_ptr<LibraryLoader>* GetLibraryInstance(DeviceType type, bool verbose);
293 static std::string getBackendVersions();
294
295 // Private helper functions for memory management
296 size_t AllocateRegisteredMemoryHelper(GPUMemoryResource* res, void*& ptr, void*& memorypool, void* memorybase, size_t memorysize, void* (GPUMemoryResource::*SetPointers)(void*) const, void*& memorypoolend, const char* device);
298
299 // Private helper functions for reading / writing / allocating IO buffer from/to file
300 template <class T, class S>
301 uint32_t DumpData(FILE* fp, const T* const* entries, const S* num, InOutPointerType type);
302 template <class T, class S>
303 size_t ReadData(FILE* fp, const T** entries, S* num, std::unique_ptr<T[]>* mem, InOutPointerType type, T** nonConstPtrs = nullptr);
304 template <class T>
305 T* AllocateIOMemoryHelper(size_t n, const T*& ptr, std::unique_ptr<T[]>& u);
306 int16_t RegisterMemoryAllocationHelper(GPUProcessor* proc, void* (GPUProcessor::*setPtr)(void*), int32_t type, const char* name, const GPUMemoryReuse& re);
307
308 // Private helper functions to dump / load flat objects
309 template <class T>
310 void DumpFlatObjectToFile(const T* obj, const char* file);
311 template <class T>
312 std::unique_ptr<T> ReadFlatObjectFromFile(const char* file);
313 template <class T>
314 void DumpStructToFile(const T* obj, const char* file);
315 template <class T>
316 void DumpDynamicStructToFile(const T* obj, size_t dynamicSize, const char* file);
317 template <class T>
318 std::unique_ptr<T> ReadStructFromFile(const char* file, T* obj = nullptr, bool* errorOnMissing = nullptr, bool allowSmaller = false);
319 template <class T, auto F>
321
322 // Others
323 virtual RecoStepField AvailableGPURecoSteps() { return RecoStep::AllRecoSteps; }
324 virtual bool CanQueryMaxMemory() { return false; }
325
326 // Pointers to tracker classes
328 const GPUConstantMem* processors() const { return mHostConstantMem.get(); }
329 GPUParam& param();
330 std::unique_ptr<GPUConstantMem> mHostConstantMem;
332
333 // Settings
334 std::unique_ptr<GPUSettingsGRP> mGRPSettings; // Global Run Parameters
335 std::unique_ptr<GPUSettingsDeviceBackend> mDeviceBackendSettings; // Processing Parameters (at constructor level)
336 std::unique_ptr<GPUSettingsProcessing> mProcessingSettings; // Processing Parameters (at init level)
337 GPUOutputControl mOutputControl; // Controls the output of the individual components
338 GPUOutputControl mInputControl; // Prefefined input memory location for reading standalone dumps
339 std::unique_ptr<GPUMemorySizeScalers> mMemoryScalers; // Scalers how much memory will be needed
340
342
343 std::string mDeviceName = "CPU";
344
345 // Ptrs to host and device memory;
346 void* mHostMemoryBase = nullptr; // Ptr to begin of large host memory buffer
347 void* mHostMemoryPermanent = nullptr; // Ptr to large host memory buffer offset by permanently allocated memory
348 void* mHostMemoryPool = nullptr; // Ptr to next free location in host memory buffer
349 void* mHostMemoryPoolEnd = nullptr; // Ptr to end of pool
350 void* mHostMemoryPoolBlocked = nullptr; // Ptr to end of pool
351 size_t mHostMemorySize = 0; // Size of host memory buffer
352 size_t mHostMemoryUsedMax = 0; // Maximum host memory size used over time
353 void* mDeviceMemoryBase = nullptr; // Same for device ...
354 void* mDeviceMemoryPermanent = nullptr; // ...
355 void* mDeviceMemoryPool = nullptr; // ...
356 void* mDeviceMemoryPoolEnd = nullptr; // ...
357 void* mDeviceMemoryPoolBlocked = nullptr; // ...
358 size_t mDeviceMemorySize = 0; // ...
359 size_t mDeviceMemoryUsedMax = 0; // ...
360 void* mVolatileMemoryStart = nullptr; // Ptr to beginning of temporary volatile memory allocation, nullptr if uninitialized
361 bool mDeviceMemoryAsVolatile = false; // Make device memory allocations volatile
362
363 std::unordered_set<const void*> mRegisteredMemoryPtrs; // List of pointers registered for GPU
364
365 GPUReconstruction* mMaster = nullptr; // Ptr to a GPUReconstruction object serving as master, sharing GPU memory, events, etc.
366 std::vector<GPUReconstruction*> mSlaves; // Ptr to slave GPUReconstructions
367 int mSlaveId = -1; // Id of this slave (-1 for master)
368
369 // Others
370 bool mInitialized = false;
371 bool mInErrorHandling = false;
372 uint32_t mStatNEvents = 0;
373 uint32_t mNEventsProcessed = 0;
374 double mStatKernelTime = 0.;
375 double mStatWallTime = 0.;
376 double mStatCPUTime = 0.;
377 std::shared_ptr<GPUROOTDumpCore> mROOTDump;
378 std::vector<std::array<uint32_t, 4>>* mOutputErrorCodes = nullptr;
379
380 int32_t mMaxBackendThreads = 0; // Maximum number of threads that may be running, on CPU or GPU
381 int32_t mGPUStuck = 0; // Marks that the GPU is stuck, skip future events
382 int32_t mNStreams = 1; // Number of parallel GPU streams
383 int32_t mMaxHostThreads = 0; // Maximum number of OMP threads
384
385 // Management for GPUProcessors
393 std::vector<ProcessorData> mProcessors;
395 MemoryReuseMeta() = default;
396 MemoryReuseMeta(GPUProcessor* p, uint16_t r) : proc(p), res{r} {}
397 GPUProcessor* proc = nullptr;
398 std::vector<uint16_t> res;
399 };
400 std::unordered_map<GPUMemoryReuse::ID, MemoryReuseMeta> mMemoryReuse1to1;
401 std::vector<std::tuple<void*, void*, size_t, size_t, uint64_t>> mNonPersistentMemoryStack; // hostPoolAddress, devicePoolAddress, individualAllocationCount, directIndividualAllocationCound, tag
402 std::vector<GPUMemoryResource*> mNonPersistentIndividualAllocations;
403 std::vector<std::unique_ptr<char[], alignedDefaultBufferDeleter>> mNonPersistentIndividualDirectAllocations;
404 std::vector<std::unique_ptr<char[], alignedDefaultBufferDeleter>> mDirectMemoryChunks;
405 std::vector<std::unique_ptr<char[], alignedDefaultBufferDeleter>> mVolatileChunks;
406 std::atomic_flag mMemoryMutex = ATOMIC_FLAG_INIT;
407
408 std::unique_ptr<GPUReconstructionPipelineContext> mPipelineContext;
409
410 // Helpers for loading device library via dlopen
412 {
413 public:
415 LibraryLoader(const LibraryLoader&) = delete;
416 const LibraryLoader& operator=(const LibraryLoader&) = delete;
417
418 private:
419 friend class GPUReconstruction;
420 LibraryLoader(const char* lib, const char* func);
421 int32_t LoadLibrary();
422 int32_t CloseLibrary();
424
425 const char* mLibName;
426 const char* mFuncName;
427 void* mGPULib;
428 void* mGPUEntry;
429 };
430 static std::shared_ptr<LibraryLoader> sLibCUDA, sLibHIP, sLibOCL;
431
432 // Debugging
433 struct debugInternal;
434 static std::unique_ptr<debugInternal> mDebugData;
435 bool mDebugEnabled = false;
436 void debugInit();
437 void debugExit();
438
440};
441
442template <class T, typename... Args>
443inline T* GPUReconstruction::AddChain(Args... args)
444{
445 mChains.emplace_back(new T(this, args...));
446 return (T*)mChains.back().get();
447}
448
449template <class T>
450inline int16_t GPUReconstruction::RegisterMemoryAllocation(T* proc, void* (T::*setPtr)(void*), int32_t type, const char* name, const GPUMemoryReuse& re)
451{
452 return RegisterMemoryAllocationHelper(proc, static_cast<void* (GPUProcessor::*)(void*)>(setPtr), type, name, re);
453}
454
455template <class T>
456inline void GPUReconstruction::RegisterGPUProcessor(T* proc, bool deviceSlave)
457{
458 mProcessors.emplace_back(proc, static_cast<void (GPUProcessor::*)()>(&T::RegisterMemoryAllocation), static_cast<void (GPUProcessor::*)()>(&T::InitializeProcessor), static_cast<void (GPUProcessor::*)(const GPUTrackingInOutPointers& io)>(&T::SetMaxData));
460 proc->InitGPUProcessor(this, processorType);
461}
462
463template <class T>
464inline void GPUReconstruction::SetupGPUProcessor(T* proc, bool allocate)
465{
466 static_assert(sizeof(T) > sizeof(GPUProcessor), "Need to setup derived class");
467 if (allocate) {
468 proc->SetMaxData(GetIOPtrs());
469 }
470 if (proc->mGPUProcessorType != GPUProcessor::PROCESSOR_TYPE_DEVICE && proc->mLinkedProcessor) {
471 std::memcpy((void*)proc->mLinkedProcessor, (const void*)proc, sizeof(*proc));
472 proc->mLinkedProcessor->InitGPUProcessor((GPUReconstruction*)this, GPUProcessor::PROCESSOR_TYPE_DEVICE, proc);
473 }
474 if (allocate) {
475 AllocateRegisteredMemory(proc, true);
476 } else {
478 }
479}
480
481} // namespace o2::gpu
482
483#endif
int32_t i
uint32_t res
Definition RawData.h:0
TBranch * ptr
double num
const LibraryLoader & operator=(const LibraryLoader &)=delete
LibraryLoader(const LibraryLoader &)=delete
GPURecoStepConfiguration mRecoSteps
std::vector< std::array< uint32_t, 4 > > * getErrorCodeOutput()
void SetupGPUProcessor(T *proc, bool allocate)
static DeviceType GetDeviceType(const char *type)
std::unordered_set< const void * > mRegisteredMemoryPtrs
int16_t RegisterMemoryAllocationHelper(GPUProcessor *proc, void *(GPUProcessor::*setPtr)(void *), int32_t type, const char *name, const GPUMemoryReuse &re)
std::vector< std::unique_ptr< GPUChain > > mChains
void * AllocateVolatileMemory(size_t size, bool device)
ThrustVolatileAllocator getThrustVolatileDeviceAllocator()
std::unique_ptr< GPUMemorySizeScalers > mMemoryScalers
void AllocateRegisteredForeignMemory(int16_t res, GPUReconstruction *rec, GPUOutputControl *control=nullptr)
std::unique_ptr< T > ReadStructFromFile(const char *file, T *obj=nullptr, bool *errorOnMissing=nullptr, bool allowSmaller=false)
void SetInputControl(void *ptr, size_t size)
GPUConstantMem * mDeviceConstantMem
void ConstructGPUProcessor(GPUProcessor *proc)
virtual void * getGPUPointer(void *ptr)
std::shared_ptr< GPUROOTDumpCore > mROOTDump
static uint32_t getNIOTypeMultiplicity(InOutPointerType type)
const GPUSettingsDeviceBackend & GetDeviceBackendSettings() const
void ComputeReuseMax(GPUProcessor *proc)
void SetMemoryExternalInput(int16_t res, void *ptr)
int32_t getGeneralStepNum(GeneralStep step, bool validCheck=true)
static T * alignedDefaultBufferAllocator(size_t n)
std::string getDebugFolder(const std::string &prefix="")
static constexpr uint32_t NSECTORS
RecoStepField GetRecoStepsGPU() const
void RegisterGPUDeviceProcessor(GPUProcessor *proc, GPUProcessor *slaveProcessor)
uint32_t DumpData(FILE *fp, const T *const *entries, const S *num, InOutPointerType type)
std::vector< GPUReconstruction * > mSlaves
static std::shared_ptr< LibraryLoader > sLibHIP
std::vector< std::tuple< void *, void *, size_t, size_t, uint64_t > > mNonPersistentMemoryStack
std::unique_ptr< T > ReadFlatObjectFromFile(const char *file)
void UpdateDynamicSettings(const GPUSettingsRecDynamic *d)
std::unique_ptr< GPUSettingsDeviceBackend > mDeviceBackendSettings
std::vector< GPUMemoryResource > mMemoryResources
void RegisterGPUProcessor(T *proc, bool deviceSlave)
void setDebugDumpCallback(std::function< void()> &&callback=std::function< void()>(nullptr))
static std::shared_ptr< LibraryLoader > * GetLibraryInstance(DeviceType type, bool verbose)
std::unique_ptr< GPUReconstructionPipelineContext > mPipelineContext
std::unique_ptr< GPUConstantMem > mHostConstantMem
void ResetRegisteredMemoryPointers(GPUProcessor *proc)
void DumpStructToFile(const T *obj, const char *file)
void AllocateRegisteredMemoryInternal(GPUMemoryResource *res, GPUOutputControl *control, GPUReconstruction *recPool)
InOutTypeField GetRecoStepsInputs() const
void DumpDynamicStructToFile(const T *obj, size_t dynamicSize, const char *file)
std::vector< std::unique_ptr< char[], alignedDefaultBufferDeleter > > mVolatileChunks
static bool CheckInstanceAvailable(DeviceType type, bool verbose)
virtual int32_t registerMemoryForGPU_internal(const void *ptr, size_t size)=0
virtual size_t WriteToConstantMemory(size_t offset, const void *src, size_t size, int32_t stream=-1, gpu_reconstruction_kernels::deviceEvent *ev=nullptr)=0
std::unordered_map< GPUMemoryReuse::ID, MemoryReuseMeta > mMemoryReuse1to1
std::shared_ptr< LibraryLoader > mMyLib
std::vector< ProcessorData > mProcessors
void * AllocateVolatileDeviceMemory(size_t size)
virtual int32_t InitDevice()=0
void SetSettings(float solenoidBzNominalGPU, const GPURecoStepConfiguration *workflow=nullptr)
const GPUCalibObjectsConst & GetCalib() const
const GPUTrackingInOutPointers GetIOPtrs() const
const GPUConstantMem * processors() const
virtual std::unique_ptr< gpu_reconstruction_kernels::threadContext > GetThreadContext()=0
GPUReconstruction(const GPUReconstruction &)=delete
static constexpr GeometryType geometryType
static std::shared_ptr< LibraryLoader > sLibOCL
T * AllocateIOMemoryHelper(size_t n, const T *&ptr, std::unique_ptr< T[]> &u)
void WriteConstantParams(int32_t stream=-1)
int16_t RegisterMemoryAllocation(T *proc, void *(T::*setPtr)(void *), int32_t type, const char *name="", const GPUMemoryReuse &re=GPUMemoryReuse())
void setErrorCodeOutput(std::vector< std::array< uint32_t, 4 > > *v)
void FreeRegisteredMemory(GPUProcessor *proc, bool freeCustom=false, bool freePermanent=false)
static GPUReconstruction * CreateInstance(const GPUSettingsDeviceBackend &cfg)
GPUMemoryResource & Res(int16_t num)
virtual RecoStepField AvailableGPURecoSteps()
static constexpr const char *const IOTYPENAMES[]
GPUReconstruction & operator=(const GPUReconstruction &)=delete
static GPUReconstruction * GPUReconstruction_Create_CPU(const GPUSettingsDeviceBackend &cfg)
void PopNonPersistentMemory(RecoStep step, uint64_t tag, const GPUProcessor *proc=nullptr)
void UpdateSettings(const GPUSettingsGRP *g, const GPUSettingsProcessing *p=nullptr, const GPUSettingsRecDynamic *d=nullptr)
RecoStepField GetRecoSteps() const
gpudatatypes::GeneralStep GeneralStep
virtual int32_t RunChains()=0
int32_t CheckErrorCodes(bool cpuOnly=false, bool forceShowErrors=false, std::vector< std::array< uint32_t, 4 > > *fillErrors=nullptr)
const GPUParam & GetParam() const
void ClearAllocatedMemory(bool clearOutputs=true)
static constexpr const char *const GEOMETRY_TYPE_NAMES[]
const GPUConstantMem & GetConstantMem() const
virtual int32_t ExitDevice()=0
std::unique_ptr< GPUSettingsGRP > mGRPSettings
std::unique_ptr< GPUSettingsProcessing > mProcessingSettings
const void * DeviceMemoryBase() const
void PushNonPersistentMemory(uint64_t tag)
InOutTypeField GetRecoStepsOutputs() const
size_t ReadData(FILE *fp, const T **entries, S *num, std::unique_ptr< T[]> *mem, InOutPointerType type, T **nonConstPtrs=nullptr)
int32_t getRecoStepNum(RecoStep step, bool validCheck=true)
static std::unique_ptr< debugInternal > mDebugData
virtual int32_t unregisterMemoryForGPU_internal(const void *ptr)=0
GPUMemorySizeScalers * MemoryScalers()
void BlockStackedMemory(GPUReconstruction *rec)
const GPUSettingsProcessing & GetProcessingSettings() const
void DumpSettings(const char *dir="")
std::vector< std::unique_ptr< char[], alignedDefaultBufferDeleter > > mNonPersistentIndividualDirectAllocations
void * AllocateDirectMemory(size_t size, int32_t type)
void DumpFlatObjectToFile(const T *obj, const char *file)
virtual void GetITSTraits(std::unique_ptr< o2::its::TrackerTraits< 7 > > *trackerTraits, std::unique_ptr< o2::its::VertexerTraits< 7 > > *vertexerTraits, std::unique_ptr< o2::its::TimeFrame< 7 > > *timeFrame)
int32_t unregisterMemoryForGPU(const void *ptr)
virtual const GPUDefParameters & getGPUParameters(bool doGPU) const =0
static GPUReconstruction * CreateInstance(int32_t type, bool forceType, GPUReconstruction *master=nullptr)
int32_t registerMemoryForGPU(const void *ptr, size_t size)
static std::shared_ptr< LibraryLoader > sLibCUDA
const GPUSettingsGRP & GetGRPSettings() const
void SetDebugLevelTmp(int32_t level)
size_t AllocateRegisteredMemoryHelper(GPUMemoryResource *res, void *&ptr, void *&memorypool, void *memorybase, size_t memorysize, void *(GPUMemoryResource::*SetPointers)(void *) const, void *&memorypoolend, const char *device)
std::vector< std::unique_ptr< char[], alignedDefaultBufferDeleter > > mDirectMemoryChunks
int32_t EnqueuePipeline(bool terminate=false)
std::shared_ptr< GPUReconstructionThreading > mThreading
std::vector< GPUMemoryResource * > mNonPersistentIndividualAllocations
gpudatatypes::RecoStep RecoStep
aligned_unique_buffer_ptr< T > ReadDynamicStructFromFile(const char *file)
virtual int32_t GPUChkErrInternal(const int64_t error, const char *file, int32_t line) const
int32_t GPUChkErrA(const int64_t error, const char *file, int32_t line, bool failOnError)
GPUOutputControl & OutputControl()
size_t AllocateRegisteredMemory(GPUProcessor *proc, bool resetCustom=false)
gpudatatypes::DeviceType DeviceType
gpudatatypes::GeometryType GeometryType
int32_t ReadSettings(const char *dir="")
void SetOutputControl(const GPUOutputControl &v)
std::vector< std::array< uint32_t, 4 > > * mOutputErrorCodes
static constexpr uint32_t NSECTORS
GLdouble n
Definition glcorearb.h:1982
GLenum func
Definition glcorearb.h:778
GLenum src
Definition glcorearb.h:1767
GLsizeiptr size
Definition glcorearb.h:659
const GLdouble * v
Definition glcorearb.h:832
GLuint const GLchar * name
Definition glcorearb.h:781
GLint GLint GLsizei GLint GLenum GLenum type
Definition glcorearb.h:275
GLintptr offset
Definition glcorearb.h:660
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLboolean GLboolean g
Definition glcorearb.h:1233
GLboolean r
Definition glcorearb.h:1233
GLuint GLuint stream
Definition glcorearb.h:1806
bitfield< InOutType, uint32_t > InOutTypeField
bitfield< RecoStep, uint32_t > RecoStepField
GPUReconstruction * rec
gpudatatypes::RecoStepField steps
gpudatatypes::InOutTypeField inputs
gpudatatypes::RecoStepField stepsGPUMask
gpudatatypes::InOutTypeField outputs
ProcessorData(GPUProcessor *p, void(GPUProcessor::*r)(), void(GPUProcessor::*i)(), void(GPUProcessor::*d)(const GPUTrackingInOutPointers &))
void(GPUProcessor::* SetMaxData)(const GPUTrackingInOutPointers &)
static T * allocate(std::size_t n)