Project
Loading...
Searching...
No Matches
GPUChainTracking.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#ifndef GPUCHAINTRACKING_H
16#define GPUCHAINTRACKING_H
17
18#include "GPUChain.h"
19#include "GPUDataTypes.h"
20#include <atomic>
21#include <mutex>
22#include <functional>
23#include <array>
24#include <vector>
25#include <utility>
26
27namespace o2::trd
28{
29class GeometryFlat;
30} // namespace o2::trd
31
32namespace o2::tpc
33{
34struct ClusterNativeAccess;
35struct ClusterNative;
36class CalibdEdxContainer;
37} // namespace o2::tpc
38
39namespace o2::base
40{
41class MatLayerCylSet;
42} // namespace o2::base
43
44namespace o2::gpu
45{
46//class GPUTRDTrackerGPU;
47class GPUTPCGPUTracker;
48class GPUDisplayInterface;
49class GPUQA;
50class GPUTPCClusterStatistics;
51class GPUTRDGeometry;
52class TPCFastTransform;
53class GPUTrackingInputProvider;
54struct GPUChainTrackingFinalContext;
55struct GPUTPCCFChainContext;
56struct GPUNewCalibValues;
57struct GPUTriggerOutputs;
58
60{
61 friend class GPUReconstruction;
62
63 public:
66 void RegisterGPUProcessors() override;
67 int32_t Init() override;
68 int32_t PrepareEvent() override;
69 int32_t Finalize() override;
70 int32_t RunChain() override;
71 void MemorySize(size_t& gpuMem, size_t& pageLockedHostMem) override;
72 int32_t CheckErrorCodes(bool cpuOnly = false, bool forceShowErrors = false, std::vector<std::array<uint32_t, 4>>* fillErrors = nullptr) override;
73 bool SupportsDoublePipeline() override { return true; }
74 int32_t FinalizePipelinedProcessing() override;
75 void ClearErrorCodes(bool cpuOnly = false);
76 int32_t DoQueuedUpdates(int32_t stream, bool updateSlave = true); // Forces doing queue calib updates, don't call when you are not sure you are allowed to do so!
77 bool QARanForTF() const { return mFractionalQAEnabled; }
78
79 // Structures for input and output data
81
82 struct InOutMemory {
87
88 std::unique_ptr<uint64_t[]> tpcZSpages;
89 std::unique_ptr<char[]> tpcZSpagesChar; // Same as above, but as char (needed for reading dumps, but deprecated, since alignment can be wrong) // TODO: Fix alignment
90 std::unique_ptr<char[]> tpcCompressedClusters; // TODO: Fix alignment
91 std::unique_ptr<GPUTrackingInOutZS> tpcZSmeta;
92 std::unique_ptr<GPUTrackingInOutZS::GPUTrackingInOutZSMeta> tpcZSmeta2;
93 std::unique_ptr<o2::tpc::Digit[]> tpcDigits[NSECTORS];
94 std::unique_ptr<GPUTrackingInOutDigits> digitMap;
95 std::unique_ptr<GPUTPCClusterData[]> clusterData[NSECTORS];
96 std::unique_ptr<AliHLTTPCRawCluster[]> rawClusters[NSECTORS];
97 std::unique_ptr<o2::tpc::ClusterNative[]> clustersNative;
98 std::unique_ptr<o2::tpc::ClusterNativeAccess> clusterNativeAccess;
99 std::unique_ptr<GPUTPCTrack[]> sectorTracks[NSECTORS];
100 std::unique_ptr<GPUTPCHitId[]> sectorClusters[NSECTORS];
101 std::unique_ptr<AliHLTTPCClusterMCLabel[]> mcLabelsTPC;
102 std::unique_ptr<GPUTPCMCInfo[]> mcInfosTPC;
103 std::unique_ptr<GPUTPCMCInfoCol[]> mcInfosTPCCol;
104 std::unique_ptr<GPUTPCGMMergedTrack[]> mergedTracks;
105 std::unique_ptr<GPUTPCGMMergedTrackHit[]> mergedTrackHits;
106 std::unique_ptr<GPUTPCGMMergedTrackHitXYZ[]> mergedTrackHitsXYZ;
107 std::unique_ptr<GPUTRDTrackletWord[]> trdTracklets;
108 std::unique_ptr<GPUTRDSpacePoint[]> trdSpacePoints;
109 std::unique_ptr<float[]> trdTriggerTimes;
110 std::unique_ptr<int32_t[]> trdTrackletIdxFirst;
111 std::unique_ptr<uint8_t[]> trdTrigRecMask;
112 std::unique_ptr<GPUTRDTrackGPU[]> trdTracks;
113 std::unique_ptr<char[]> clusterNativeMC;
114 std::unique_ptr<o2::dataformats::ConstMCTruthContainerView<o2::MCCompLabel>> clusterNativeMCView;
115 std::unique_ptr<char[]> tpcDigitsMC[NSECTORS];
116 std::unique_ptr<o2::dataformats::ConstMCTruthContainerView<o2::MCCompLabel>[]> tpcDigitMCView;
117 std::unique_ptr<GPUTPCDigitsMCInput> tpcDigitMCMap;
118 std::unique_ptr<o2::dataformats::ConstMCTruthContainer<o2::MCCompLabel>> clusterNativeMCBuffer;
119 std::unique_ptr<GPUSettingsTF[]> settingsTF;
121
122 // Read / Dump / Clear Data
123 void ClearIOPointers();
124 void AllocateIOMemory();
125 using GPUChain::DumpData;
126 void DumpData(const char* filename);
127 using GPUChain::ReadData;
128 int32_t ReadData(const char* filename);
129 void DumpSettings(const char* dir = "") override;
130 void ReadSettings(const char* dir = "") override;
131
132 // Converter / loader functions
136 void ConvertZSEncoder(int32_t version);
137 void ConvertZSFilter(bool zs12bit);
138
139 // Getters for external usage of tracker classes
143 const GPUTPCGMMerger& GetTPCMerger() const { return processors()->tpcMerger; }
146 const GPUQA* GetQA() const { return mQAFromForeignChain ? mQAFromForeignChain->mQA.get() : mQA.get(); }
148 int32_t ForceInitQA();
150 const GPUSettingsDisplay* GetEventDisplayConfig() const { return mConfigDisplay; }
151 const GPUSettingsQA* GetQAConfig() const { return mConfigQA; }
152
153 // Processing functions
154 int32_t RunTPCClusterizer(bool synchronizeOutput = true);
155 int32_t ForwardTPCDigits();
156 int32_t RunTPCTrackingSectors();
157 int32_t RunTPCTrackingMerger(bool synchronizeOutput = true);
158 template <int32_t I>
159 int32_t RunTRDTracking();
160 template <int32_t I, class T = GPUTRDTracker>
161 int32_t DoTRDGPUTracking(T* externalInstance = nullptr);
162 int32_t RunTPCCompression();
163 int32_t RunTPCDecompression();
164 int32_t RunRefit();
165
166 // Getters / setters for parameters
175 void SetTPCFastTransform(std::unique_ptr<TPCFastTransform>&& tpcFastTransform, std::unique_ptr<CorrectionMapsHelper>&& tpcTransformHelper);
176 void SetMatLUT(std::unique_ptr<o2::base::MatLayerCylSet>&& lut);
177 void SetTRDGeometry(std::unique_ptr<o2::trd::GeometryFlat>&& geo);
180 void SetO2Propagator(const o2::base::Propagator* prop);
182 void SetCalibObjects(const GPUCalibObjects& obj) { memcpy((void*)&processors()->calibObjects, (const void*)&obj, sizeof(obj)); }
185 void SetFinalInputCallback(std::function<void()> v) { mWaitForFinalInputs = v; }
186
187 const GPUSettingsDisplay* mConfigDisplay = nullptr; // Abstract pointer to Standalone Display Configuration Structure
188 const GPUSettingsQA* mConfigQA = nullptr; // Abstract pointer to Standalone QA Configuration Structure
190
191 protected:
203 void UpdateGPUCalibObjects(int32_t stream, const GPUCalibObjectsConst* ptrMask = nullptr);
204 void UpdateGPUCalibObjectsPtrs(int32_t stream);
205
206 struct eventStruct // Must consist only of void* ptr that will hold the GPU event ptrs!
207 {
212 };
213
215 void* dst;
216 void* src;
217 size_t size;
219 };
220
221 GPUChainTracking(GPUReconstruction* rec, uint32_t maxTPCHits = GPUCA_MAX_CLUSTERS, uint32_t maxTRDTracklets = GPUCA_MAX_TRD_TRACKLETS);
222
223 int32_t ReadEvent(uint32_t iSector, int32_t threadId);
224 void WriteOutput(int32_t iSector, int32_t threadId);
225 int32_t ExtrapolationTracking(uint32_t iSector, int32_t threadId, bool synchronizeOutput = true);
226
227 int32_t PrepareProfile();
228 int32_t DoProfile();
230 void PrintMemoryStatistics() override;
231 void PrepareDebugOutput();
232 void PrintDebugOutput();
233 void PrintOutputStat();
234
235 bool ValidateSteps();
236 bool ValidateSettings();
237
238 // Pointers to tracker classes
239 GPUTrackingFlatObjects mFlatObjectsShadow; // Host copy of flat objects that will be used on the GPU
240 GPUTrackingFlatObjects mFlatObjectsDevice; // flat objects that will be used on the GPU
241 std::unique_ptr<GPUTrackingInputProvider> mInputsHost;
242 std::unique_ptr<GPUTrackingInputProvider> mInputsShadow;
243
244 // Display / QA
245 bool mDisplayRunning = false;
246 std::unique_ptr<GPUDisplayInterface> mEventDisplay;
248 std::unique_ptr<GPUQA> mQA;
249 std::unique_ptr<GPUTPCClusterStatistics> mCompressionStatistics;
250
251 // Ptr to detector / calibration objects
252 std::unique_ptr<TPCFastTransform> mTPCFastTransformU; // Global TPC fast transformation object
253 std::unique_ptr<TPCFastTransform> mTPCFastTransformRefU; // Global TPC fast transformation ref object
254 std::unique_ptr<TPCFastTransform> mTPCFastTransformMShapeU; // Global TPC fast transformation for M-shape object
255 std::unique_ptr<CorrectionMapsHelper> mTPCFastTransformHelperU; // Global TPC fast transformation helper object
256 std::unique_ptr<TPCPadGainCalib> mTPCPadGainCalibU; // TPC gain calibration and cluster finder parameters
257 std::unique_ptr<TPCZSLinkMapping> mTPCZSLinkMappingU; // TPC Mapping data required by ZS Link decoder
258 std::unique_ptr<o2::tpc::CalibdEdxContainer> mdEdxCalibContainerU; // TPC dEdx calibration container
259 std::unique_ptr<o2::base::MatLayerCylSet> mMatLUTU; // Material Lookup Table
260 std::unique_ptr<o2::trd::GeometryFlat> mTRDGeometryU; // TRD Geometry
261
262 // Ptrs to internal buffers
263 std::unique_ptr<o2::tpc::ClusterNativeAccess> mClusterNativeAccess;
265 std::unique_ptr<GPUTriggerOutputs> mTriggerBuffer;
266
267 // (Ptrs to) configuration objects
268 std::unique_ptr<GPUTPCCFChainContext> mCFContext;
270 std::unique_ptr<GPUCalibObjectsConst> mNewCalibObjects;
272 std::unique_ptr<GPUNewCalibValues> mNewCalibValues;
273
274 // Upper bounds for memory allocation
275 uint32_t mMaxTPCHits = 0;
276 uint32_t mMaxTRDTracklets = 0;
277
278 // Debug
279 std::unique_ptr<std::ofstream> mDebugFile;
280
281 // Synchronization and Locks
283 volatile int32_t mSectorSelectorReady = 0;
284 std::array<int8_t, NSECTORS> mWriteOutputDone;
285
286 std::vector<outputQueueEntry> mOutputQueue;
287
288 private:
289 int32_t RunChainFinalize();
290 void SanityCheck();
291 int32_t RunTPCTrackingSectors_internal();
292 int32_t RunTPCClusterizer_prepare(bool restorePointers);
293#ifdef GPUCA_TPC_GEOMETRY_O2
294 std::pair<uint32_t, uint32_t> RunTPCClusterizer_transferZS(int32_t iSector, const CfFragment& fragment, int32_t lane);
295 void RunTPCClusterizer_compactPeaks(GPUTPCClusterFinder& clusterer, GPUTPCClusterFinder& clustererShadow, int32_t stage, bool doGPU, int32_t lane);
296 std::pair<uint32_t, uint32_t> TPCClusterizerDecodeZSCount(uint32_t iSector, const CfFragment& fragment);
297 std::pair<uint32_t, uint32_t> TPCClusterizerDecodeZSCountUpdate(uint32_t iSector, const CfFragment& fragment);
298 void TPCClusterizerEnsureZSOffsets(uint32_t iSector, const CfFragment& fragment);
299#endif
300 void RunTPCTrackingMerger_MergeBorderTracks(int8_t withinSector, int8_t mergeMode, GPUReconstruction::krnlDeviceType deviceType);
301 void RunTPCTrackingMerger_Resolve(int8_t useOrigTrackParam, int8_t mergeAll, GPUReconstruction::krnlDeviceType deviceType);
302 void RunTPCClusterFilter(o2::tpc::ClusterNativeAccess* clusters, std::function<o2::tpc::ClusterNative*(size_t)> allocator, bool applyClusterCuts);
303 bool NeedTPCClustersOnGPU();
304
305 std::mutex mMutexUpdateCalib;
306 std::unique_ptr<GPUChainTrackingFinalContext> mPipelineFinalizationCtx;
307 GPUChainTrackingFinalContext* mPipelineNotifyCtx = nullptr;
308 std::function<void()> mWaitForFinalInputs;
309
310 int32_t OutputStream() const { return mRec->NStreams() - 2; }
311};
312} // namespace o2::gpu
313
314#endif
int32_t i
#define GPUCA_MAX_TRD_TRACKLETS
#define GPUCA_MAX_CLUSTERS
#define GPUCA_MAX_STREAMS
GPUChain * chain
uint32_t version
Definition RawData.h:8
void SetMatLUT(std::unique_ptr< o2::base::MatLayerCylSet > &&lut)
void SetQAFromForeignChain(GPUChainTracking *chain)
std::unique_ptr< o2::base::MatLayerCylSet > mMatLUTU
int32_t ExtrapolationTracking(uint32_t iSector, int32_t threadId, bool synchronizeOutput=true)
const CorrectionMapsHelper * GetTPCTransformHelper() const
const GPUTPCGMMerger & GetTPCMerger() const
const o2::base::Propagator * GetDeviceO2Propagator()
std::unique_ptr< o2::tpc::ClusterNativeAccess > mClusterNativeAccess
void SetCalibObjects(const GPUCalibObjects &obj)
void SetTRDGeometry(std::unique_ptr< o2::trd::GeometryFlat > &&geo)
void SetCalibObjects(const GPUCalibObjectsConst &obj)
const o2::base::Propagator * GetO2Propagator() const
std::unique_ptr< TPCFastTransform > mTPCFastTransformMShapeU
GPUChainTracking * mQAFromForeignChain
void SetO2Propagator(const o2::base::Propagator *prop)
std::unique_ptr< GPUQA > mQA
void ReadSettings(const char *dir="") override
const GPUTPCTracker * GetTPCSectorTrackers() const
GPUTPCTracker * GetTPCSectorTrackers()
std::unique_ptr< CorrectionMapsHelper > mTPCFastTransformHelperU
GPUTrackingFlatObjects mFlatObjectsDevice
int32_t RunTPCClusterizer(bool synchronizeOutput=true)
void SetTRDGeometry(const o2::trd::GeometryFlat *geo)
const GPUTRDGeometry * GetTRDGeometry() const
std::unique_ptr< TPCFastTransform > mTPCFastTransformRefU
void UpdateGPUCalibObjectsPtrs(int32_t stream)
void DumpData(const char *filename)
int32_t RunTPCTrackingMerger(bool synchronizeOutput=true)
std::unique_ptr< GPUTrackingInputProvider > mInputsHost
GPUTPCGMMerger & GetTPCMerger()
void SetMatLUT(const o2::base::MatLayerCylSet *lut)
std::unique_ptr< GPUTPCClusterStatistics > mCompressionStatistics
const o2::base::MatLayerCylSet * GetMatLUT() const
GPUTRDTrackerGPU * GetTRDTrackerGPU()
std::array< GPUOutputControl *, GPUTrackingOutputs::count()> mSubOutputControls
std::unique_ptr< std::ofstream > mDebugFile
std::unique_ptr< GPUTriggerOutputs > mTriggerBuffer
std::vector< outputQueueEntry > mOutputQueue
void SetUpdateCalibObjects(const GPUCalibObjectsConst &obj, const GPUNewCalibValues &vals)
volatile int32_t mSectorSelectorReady
bool SupportsDoublePipeline() override
void SetFinalInputCallback(std::function< void()> v)
const GPUSettingsDisplay * GetEventDisplayConfig() const
std::unique_ptr< GPUCalibObjectsConst > mNewCalibObjects
const TPCPadGainCalib * GetTPCPadGainCalib() const
std::unique_ptr< TPCPadGainCalib > mTPCPadGainCalibU
std::unique_ptr< o2::tpc::CalibdEdxContainer > mdEdxCalibContainerU
std::unique_ptr< o2::trd::GeometryFlat > mTRDGeometryU
std::unique_ptr< TPCZSLinkMapping > mTPCZSLinkMappingU
int32_t DoTRDGPUTracking(T *externalInstance=nullptr)
GPUTrackingFlatObjects mFlatObjectsShadow
const GPUSettingsDisplay * mConfigDisplay
void RegisterPermanentMemoryAndProcessors() override
void RegisterGPUProcessors() override
const GPUSettingsQA * GetQAConfig() const
void ClearErrorCodes(bool cpuOnly=false)
const GPUQA * GetQA() const
void MemorySize(size_t &gpuMem, size_t &pageLockedHostMem) override
std::unique_ptr< GPUTPCCFChainContext > mCFContext
void SetTPCFastTransform(std::unique_ptr< TPCFastTransform > &&tpcFastTransform, std::unique_ptr< CorrectionMapsHelper > &&tpcTransformHelper)
void WriteOutput(int32_t iSector, int32_t threadId)
void SetSubOutputControl(int32_t i, GPUOutputControl *v)
int32_t DoQueuedUpdates(int32_t stream, bool updateSlave=true)
std::unique_ptr< GPUNewCalibValues > mNewCalibValues
int32_t CheckErrorCodes(bool cpuOnly=false, bool forceShowErrors=false, std::vector< std::array< uint32_t, 4 > > *fillErrors=nullptr) override
std::unique_ptr< TPCFastTransform > mTPCFastTransformU
GPUDisplayInterface * GetEventDisplay()
int32_t PrepareEvent() override
void UpdateGPUCalibObjects(int32_t stream, const GPUCalibObjectsConst *ptrMask=nullptr)
int32_t ReadEvent(uint32_t iSector, int32_t threadId)
GPUTrackingInOutPointers & mIOPtrs
struct o2::gpu::GPUChainTracking::InOutMemory mIOMem
int32_t ReadData(const char *filename)
const o2::tpc::CalibdEdxContainer * GetdEdxCalibContainer() const
std::array< int8_t, NSECTORS > mWriteOutputDone
std::unique_ptr< GPUTrackingInputProvider > mInputsShadow
const GPUSettingsQA * mConfigQA
int32_t FinalizePipelinedProcessing() override
std::unique_ptr< GPUDisplayInterface > mEventDisplay
const TPCZSLinkMapping * GetTPCZSLinkMapping() const
void DumpSettings(const char *dir="") override
GPUReconstruction::RecoStep RecoStep
Definition GPUChain.h:29
uint32_t DumpData(FILE *fp, const T *const *entries, const S *num, InOutPointerType type)
Definition GPUChain.h:139
GPUConstantMem * processors()
Definition GPUChain.h:80
GPUReconstructionCPU * mRec
Definition GPUChain.h:75
static constexpr int32_t NSECTORS
Definition GPUChain.h:54
size_t ReadData(FILE *fp, const T **entries, S *num, std::unique_ptr< T[]> *mem, InOutPointerType type, T **nonConstPtrs=nullptr)
Definition GPUChain.h:144
GPUReconstruction * rec()
Definition GPUChain.h:62
const GLdouble * v
Definition glcorearb.h:832
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLuint GLuint stream
Definition glcorearb.h:1806
Global TPC definitions and constants.
Definition SimTraits.h:167
std::string filename()
S< o2::trd::GeometryFlat >::type * trdGeometry
S< o2::tpc::CalibdEdxContainer >::type * dEdxCalibContainer
S< TPCZSLinkMapping >::type * tpcZSLinkMapping
S< TPCPadGainCalib >::type * tpcPadGain
S< o2::base::PropagatorImpl< float > >::type * o2Propagator
S< o2::base::MatLayerCylSet >::type * matLUT
S< CorrectionMapsHelper >::type * fastTransformHelper
std::unique_ptr< o2::tpc::Digit[]> tpcDigits[NSECTORS]
std::unique_ptr< char[]> tpcCompressedClusters
std::unique_ptr< GPUTPCMCInfo[]> mcInfosTPC
std::unique_ptr< char[]> tpcDigitsMC[NSECTORS]
std::unique_ptr< GPUTRDTrackletWord[]> trdTracklets
std::unique_ptr< o2::dataformats::ConstMCTruthContainerView< o2::MCCompLabel >[]> tpcDigitMCView
std::unique_ptr< GPUTPCMCInfoCol[]> mcInfosTPCCol
std::unique_ptr< GPUTPCGMMergedTrackHit[]> mergedTrackHits
std::unique_ptr< int32_t[]> trdTrackletIdxFirst
std::unique_ptr< GPUTPCGMMergedTrack[]> mergedTracks
std::unique_ptr< AliHLTTPCClusterMCLabel[]> mcLabelsTPC
std::unique_ptr< GPUTPCGMMergedTrackHitXYZ[]> mergedTrackHitsXYZ
std::unique_ptr< o2::dataformats::ConstMCTruthContainerView< o2::MCCompLabel > > clusterNativeMCView
std::unique_ptr< GPUTrackingInOutDigits > digitMap
std::unique_ptr< GPUTPCClusterData[]> clusterData[NSECTORS]
std::unique_ptr< o2::tpc::ClusterNative[]> clustersNative
std::unique_ptr< GPUTPCDigitsMCInput > tpcDigitMCMap
InOutMemory & operator=(InOutMemory &&)
std::unique_ptr< float[]> trdTriggerTimes
std::unique_ptr< uint64_t[]> tpcZSpages
std::unique_ptr< GPUTPCTrack[]> sectorTracks[NSECTORS]
std::unique_ptr< GPUTRDSpacePoint[]> trdSpacePoints
std::unique_ptr< GPUTrackingInOutZS > tpcZSmeta
std::unique_ptr< o2::dataformats::ConstMCTruthContainer< o2::MCCompLabel > > clusterNativeMCBuffer
std::unique_ptr< uint8_t[]> trdTrigRecMask
std::unique_ptr< o2::tpc::ClusterNativeAccess > clusterNativeAccess
std::unique_ptr< AliHLTTPCRawCluster[]> rawClusters[NSECTORS]
std::unique_ptr< GPUTPCHitId[]> sectorClusters[NSECTORS]
std::unique_ptr< GPUSettingsTF[]> settingsTF
std::unique_ptr< char[]> tpcZSpagesChar
std::unique_ptr< GPUTRDTrackGPU[]> trdTracks
std::unique_ptr< GPUTrackingInOutZS::GPUTrackingInOutZSMeta > tpcZSmeta2
GPUTRDTrackerGPU trdTrackerGPU
GPUTPCTracker tpcTrackers[GPUCA_NSECTORS]
GPUCalibObjectsConst calibObjects
static constexpr size_t count()
std::vector< Cluster > clusters