Project
Loading...
Searching...
No Matches
GPUTPCTracker.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 GPUTPCTRACKER_H
16#define GPUTPCTRACKER_H
17
18#include "GPUTPCDef.h"
19
20#if !defined(GPUCA_GPUCODE)
21#include <iostream>
22#endif
23
24#include "GPUTPCHitId.h"
25#include "GPUTPCTrackingData.h"
26#include "GPUTPCTrackParam.h"
27#include "GPUTPCTracklet.h"
28#include "GPUProcessor.h"
29
30namespace o2::gpu
31{
32class GPUTPCSectorOutput;
33struct GPUTPCClusterData;
34struct GPUParam;
35class GPUTPCTrack;
36class GPUTPCTrackParam;
37class GPUTPCRow;
38
40{
41 public:
42#ifndef GPUCA_GPUCODE_DEVICE
43 GPUTPCTracker() = default;
45 GPUTPCTracker(const GPUTPCTracker&) = delete;
47
48 void SetSector(int32_t iSector);
51
55
56 // Debugging Stuff
57 void DumpTrackingData(std::ostream& out); // Dump Input Sector Data
58 void DumpLinks(std::ostream& out, int32_t phase); // Dump all links to file (for comparison after NeighboursFinder/Cleaner)
59 void DumpStartHits(std::ostream& out); // Same for Start Hits
60 void DumpHitWeights(std::ostream& out); //....
61 void DumpTrackHits(std::ostream& out); // Same for Track Hits
62 void DumpTrackletHits(std::ostream& out); // Same for Track Hits
63 void DumpOutput(std::ostream& out); // Similar for output
64#endif
65
67 GPUAtomic(uint32_t) nextStartHit; // Next Tracklet to process
68 };
69
71 GPUglobalref() char* gpumem; // Base pointer to GPU memory (Needed for OpenCL for verification)
72 };
73
75 commonMemoryStruct() : nStartHits(0), nTracklets(0), nRowHits(0), nTracks(0), nLocalTracks(0), nTrackHits(0), nLocalTrackHits(0), gpuParameters() {}
76 GPUAtomic(uint32_t) nStartHits; // number of start hits
77 GPUAtomic(uint32_t) nTracklets; // number of tracklets
78 GPUAtomic(uint32_t) nRowHits; // number of tracklet hits
79 GPUAtomic(uint32_t) nTracks; // number of reconstructed tracks
80 int32_t nLocalTracks; // number of reconstructed tracks before extrapolation tracking
81 GPUAtomic(uint32_t) nTrackHits; // number of track hits
82 int32_t nLocalTrackHits; // see above
84 };
85
87 {
88 return mData.ClusterData();
89 }
90 GPUhdi() const GPUTPCRow& Row(const GPUTPCHitId& HitId) const { return mData.Row(HitId.RowIndex()); }
91 GPUhdi() GPUglobalref() GPUTPCSectorOutput* Output() const { return mOutput; }
92 GPUhdni() GPUglobalref() commonMemoryStruct* CommonMemory() const
93 {
94 return (mCommonMem);
95 }
96
97 GPUdi() static void GetErrors2Seeding(const GPUParam& param, char sector, int32_t iRow, const GPUTPCTrackParam& t, float time, float& ErrY2, float& ErrZ2)
98 {
99 // param.GetClusterErrors2(sector, iRow, param.GetContinuousTracking() != 0. ? 125.f : t.Z(), t.SinPhi(), t.DzDs(), time, 0.f, 0.f, ErrY2, ErrZ2);
100 param.GetClusterErrorsSeeding2(sector, iRow, param.par.continuousTracking != 0.f ? 125.f : t.Z(), t.SinPhi(), t.DzDs(), time, ErrY2, ErrZ2);
101 }
102
103 GPUdi() void GetErrors2Seeding(int32_t iRow, const GPUTPCTrackParam& t, float time, float& ErrY2, float& ErrZ2) const
104 {
105 // Param().GetClusterErrors2(mISector, iRow, Param().GetContinuousTracking() != 0. ? 125.f : t.Z(), t.SinPhi(), t.DzDs(), time, 0.f, 0.f, ErrY2, ErrZ2);
106 Param().GetClusterErrorsSeeding2(mISector, iRow, Param().par.continuousTracking != 0.f ? 125.f : t.Z(), t.SinPhi(), t.DzDs(), time, ErrY2, ErrZ2);
107 }
108 GPUdi() void GetErrors2Seeding(int32_t iRow, float z, float sinPhi, float DzDs, float time, float& ErrY2, float& ErrZ2) const
109 {
110 // Param().GetClusterErrors2(mISector, iRow, Param().GetContinuousTracking() != 0. ? 125.f : z, sinPhi, DzDs, time, 0.f, 0.f, ErrY2, ErrZ2);
111 Param().GetClusterErrorsSeeding2(mISector, iRow, Param().par.continuousTracking != 0.f ? 125.f : z, sinPhi, DzDs, time, ErrY2, ErrZ2);
112 }
113
114 void SetupCommonMemory();
115 void* SetPointersDataLinks(void* mem);
116 void* SetPointersDataWeights(void* mem);
117 void* SetPointersDataScratch(void* mem);
118 void* SetPointersDataRows(void* mem);
119 void* SetPointersScratch(void* mem);
120 void* SetPointersScratchHost(void* mem);
121 void* SetPointersCommon(void* mem);
122 void* SetPointersTracklets(void* mem);
123 void* SetPointersOutput(void* mem);
125
126 int16_t MemoryResLinks() const { return mMemoryResLinks; }
127 int16_t MemoryResScratchHost() const { return mMemoryResScratchHost; }
128 int16_t MemoryResCommon() const { return mMemoryResCommon; }
129 int16_t MemoryResTracklets() const { return mMemoryResTracklets; }
130 int16_t MemoryResOutput() const { return mMemoryResOutput; }
131 int16_t MemoryResSectorScratch() const { return mMemoryResSectorScratch; }
132
133 void SetMaxData(const GPUTrackingInOutPointers& io);
134 void UpdateMaxData();
135
136 GPUhd() int32_t ISector() const { return mISector; }
137
138 GPUhd() GPUconstantref() const GPUTPCTrackingData& Data() const { return mData; }
140 {
141 return mData;
142 }
143
144 GPUhd() GPUglobalref() const GPUTPCRow& Row(int32_t rowIndex) const { return mData.Row(rowIndex); }
145
146 GPUhd() uint32_t NHitsTotal() const { return mData.NumberOfHits(); }
147 GPUhd() uint32_t NMaxTracklets() const { return mNMaxTracklets; }
148 GPUhd() uint32_t NMaxRowHits() const { return mNMaxRowHits; }
149 GPUhd() uint32_t NMaxTracks() const { return mNMaxTracks; }
150 GPUhd() uint32_t NMaxTrackHits() const { return mNMaxTrackHits; }
151 GPUhd() uint32_t NMaxStartHits() const { return mNMaxStartHits; }
152 GPUhd() uint32_t NMaxRowStartHits() const { return mNMaxRowStartHits; }
153
154 GPUd() void SetHitLinkUpData(const GPUTPCRow& row, int32_t hitIndex, calink v) { mData.SetHitLinkUpData(row, hitIndex, v); }
155 GPUd() void SetHitLinkDownData(const GPUTPCRow& row, int32_t hitIndex, calink v) { mData.SetHitLinkDownData(row, hitIndex, v); }
156 GPUd() calink HitLinkUpData(const GPUTPCRow& row, int32_t hitIndex) const { return mData.HitLinkUpData(row, hitIndex); }
157 GPUd() calink HitLinkDownData(const GPUTPCRow& row, int32_t hitIndex) const { return mData.HitLinkDownData(row, hitIndex); }
158
159 GPUd() GPUglobalref() const cahit2* HitData(const GPUTPCRow& row) const { return mData.HitData(row); }
160 GPUd() GPUglobalref() const calink* HitLinkUpData(const GPUTPCRow& row) const { return mData.HitLinkUpData(row); }
161 GPUd() GPUglobalref() const calink* HitLinkDownData(const GPUTPCRow& row) const { return mData.HitLinkDownData(row); }
162 GPUd() GPUglobalref() const calink* FirstHitInBin(const GPUTPCRow& row) const { return mData.FirstHitInBin(row); }
163
164 GPUd() int32_t FirstHitInBin(const GPUTPCRow& row, int32_t binIndex) const { return mData.FirstHitInBin(row, binIndex); }
165
166 GPUd() cahit HitDataY(const GPUTPCRow& row, int32_t hitIndex) const { return mData.HitDataY(row, hitIndex); }
167 GPUd() cahit HitDataZ(const GPUTPCRow& row, int32_t hitIndex) const { return mData.HitDataZ(row, hitIndex); }
168 GPUd() cahit2 HitData(const GPUTPCRow& row, int32_t hitIndex) const { return mData.HitData(row, hitIndex); }
169
170 GPUhd() int32_t HitInputID(const GPUTPCRow& row, int32_t hitIndex) const { return mData.ClusterDataIndex(row, hitIndex); }
171
180 GPUdi() static int32_t CalculateHitWeight(int32_t NHits, float chi2)
181 {
182 const float chi2_suppress = 6.f;
183 float weight = (((float)NHits * (chi2_suppress - chi2 / 500.f)) * (1e9f / chi2_suppress / 160.f));
184 if (weight < 0.f || weight > 2e9f) {
185 return 0;
186 }
187 return ((int32_t)weight);
188 // return( (NHits << 16) + num);
189 }
190 GPUd() void MaximizeHitWeight(const GPUTPCRow& row, int32_t hitIndex, int32_t weight) { mData.MaximizeHitWeight(row, hitIndex, weight); }
191 GPUd() void SetHitWeight(const GPUTPCRow& row, int32_t hitIndex, int32_t weight) { mData.SetHitWeight(row, hitIndex, weight); }
192 GPUd() int32_t HitWeight(const GPUTPCRow& row, int32_t hitIndex) const { return mData.HitWeight(row, hitIndex); }
193
194 GPUhd() GPUglobalref() GPUAtomic(uint32_t) * NTracklets() const { return &mCommonMem->nTracklets; }
195 GPUhd() GPUglobalref() GPUAtomic(uint32_t) * NRowHits() const { return &mCommonMem->nRowHits; }
196 GPUhd() GPUglobalref() GPUAtomic(uint32_t) * NStartHits() const { return &mCommonMem->nStartHits; }
197
198 GPUhd() GPUglobalref() const GPUTPCHitId& TrackletStartHit(int32_t i) const { return mTrackletStartHits[i]; }
199 GPUhd() GPUglobalref() const GPUTPCHitId* TrackletStartHits() const { return mTrackletStartHits; }
200 GPUhd() GPUglobalref() GPUTPCHitId* TrackletStartHits() { return mTrackletStartHits; }
201 GPUhd() GPUglobalref() GPUTPCHitId* TrackletTmpStartHits() const { return mTrackletTmpStartHits; }
202 GPUhd() GPUglobalref() const GPUTPCTracklet& Tracklet(int32_t i) const { return mTracklets[i]; }
203 GPUhd() GPUglobalref() GPUTPCTracklet* Tracklets() const { return mTracklets; }
204 GPUhd() GPUglobalref() calink* TrackletRowHits() const { return mTrackletRowHits; }
205
206 GPUhd() GPUglobalref() GPUAtomic(uint32_t) * NTracks() const { return &mCommonMem->nTracks; }
207 GPUhd() GPUglobalref() GPUTPCTrack* Tracks() const { return mTracks; }
208 GPUhd() GPUglobalref() GPUAtomic(uint32_t) * NTrackHits() const { return &mCommonMem->nTrackHits; }
209 GPUhd() GPUglobalref() GPUTPCHitId* TrackHits() const { return mTrackHits; }
210
211 GPUhd() GPUglobalref() GPUTPCRow* TrackingDataRows() const { return (mData.Rows()); }
212 GPUhd() GPUglobalref() int32_t* RowStartHitCountOffset() const { return (mRowStartHitCountOffset); }
213 GPUhd() GPUglobalref() StructGPUParameters* GPUParameters() const { return (&mCommonMem->gpuParameters); }
214 GPUhd() StructGPUParametersConst* GPUParametersConst()
215 {
216 return (&mGPUParametersConst);
217 }
218 GPUhd() const StructGPUParametersConst* GetGPUParametersConst() const { return (&mGPUParametersConst); }
219 GPUhd() void SetGPUTextureBase(GPUglobalref() const void* val) { mData.SetGPUTextureBase(val); }
220
222 int32_t fTtrack; // Track ID
223 float fSortVal; // Value to sort for
224 };
225
226 void* LinkTmpMemory() { return mLinkTmpMemory; }
227
228#ifdef GPUCA_TRACKLET_CONSTRUCTOR_DO_PROFILE
229 char* mStageAtSync = nullptr; // Temporary performance variable: Pointer to array storing current stage for every thread at every sync point
230#endif
231
232 private:
236 char* mLinkTmpMemory = nullptr; // tmp memory for hits after neighbours finder
237
238 int32_t mISector = -1; // Number of sector
239
240 GPUTPCTrackingData mData; // The TrackingData object. It is used to encapsulate the storage in memory from the access
241
242 uint32_t mNMaxStartHits = 0;
243 uint32_t mNMaxRowStartHits = 0;
244 uint32_t mNMaxTracklets = 0;
245 uint32_t mNMaxRowHits = 0;
246 uint32_t mNMaxTracks = 0;
247 uint32_t mNMaxTrackHits = 0;
248 uint16_t mMemoryResLinks = (uint16_t)-1;
249 uint16_t mMemoryResScratch = (uint16_t)-1;
250 uint16_t mMemoryResScratchHost = (uint16_t)-1;
251 uint16_t mMemoryResCommon = (uint16_t)-1;
252 uint16_t mMemoryResTracklets = (uint16_t)-1;
253 uint16_t mMemoryResOutput = (uint16_t)-1;
254 uint16_t mMemoryResSectorScratch = (uint16_t)-1;
255
256 // GPU Temp Arrays
257 GPUglobalref() int32_t* mRowStartHitCountOffset = nullptr; // Offset, length and new offset of start hits in row
258 GPUglobalref() GPUTPCHitId* mTrackletTmpStartHits = nullptr; // Unsorted start hits
259 GPUglobalref() char* mGPUTrackletTemp = nullptr; // Temp Memory for GPU Tracklet Constructor
260
261 StructGPUParametersConst mGPUParametersConst; // Parameters for GPU if this is a GPU tracker
262
263 // event
264 GPUglobalref() commonMemoryStruct* mCommonMem = nullptr; // common event memory
265 GPUglobalref() GPUTPCHitId* mTrackletStartHits = nullptr; // start hits for the tracklets
266 GPUglobalref() GPUTPCTracklet* mTracklets = nullptr; // tracklets
267 GPUglobalref() calink* mTrackletRowHits = nullptr; // Hits for each Tracklet in each row
268 GPUglobalref() GPUTPCTrack* mTracks = nullptr; // reconstructed tracks
269 GPUglobalref() GPUTPCHitId* mTrackHits = nullptr; // array of track hit numbers
270
271 // output
272 GPUglobalref() GPUTPCSectorOutput* mOutput; // address of pointer pointing to SectorOutput Object
273 void* mOutputMemory; // Pointer to output memory if stored internally
274
275 static int32_t StarthitSortComparison(const void* a, const void* b);
276};
277} // namespace o2::gpu
278
279#endif // GPUTPCTRACKER_H
uint64_t phase
Definition RawEventData.h:7
int32_t i
#define GPUAtomic(type)
GPUconstantref() const GPUConstantMem *mConstantMem
GPUd() GPUconstantref() const GPUConstantMem *GetConstantMem() const
GPUhd() uint32_t NMaxRowHits() const
GPUhd() GPUglobalref() int32_t *RowStartHitCountOffset() const
GPUd() void SetHitWeight(const GPUTPCRow &row
GPUd() calink HitLinkDownData(const GPUTPCRow &row
GPUhd() GPUglobalref() GPUAtomic(uint32_t) *NStartHits() const
GPUhdni() GPUglobalref() commonMemoryStruct *CommonMemory() const
GPUhd() GPUglobalref() StructGPUParameters *GPUParameters() const
void * SetPointersScratchHost(void *mem)
GPUhd() uint32_t NMaxTrackHits() const
int16_t MemoryResTracklets() const
GPUd() int32_t HitWeight(const GPUTPCRow &row
void * SetPointersDataWeights(void *mem)
char int32_t const GPUTPCTrackParam float float & ErrY2
GPUhd() GPUglobalref() const GPUTPCHitId &TrackletStartHit(int32_t i) const
void * SetPointersDataRows(void *mem)
void * SetPointersOutput(void *mem)
float float float DzDs
GPUhd() GPUglobalref() GPUTPCTrack *Tracks() const
int16_t MemoryResLinks() const
GPUhd() uint32_t NMaxTracks() const
void SetMaxData(const GPUTrackingInOutPointers &io)
GPUhd() GPUglobalref() GPUTPCHitId *TrackletStartHits()
void DumpOutput(std::ostream &out)
void * SetPointersDataLinks(void *mem)
int16_t MemoryResOutput() const
GPUd() void SetHitLinkDownData(const GPUTPCRow &row
GPUhd() GPUglobalref() const GPUTPCRow &Row(int32_t rowIndex) const
void * SetPointersDataScratch(void *mem)
void DumpTrackHits(std::ostream &out)
GPUhd() GPUglobalref() GPUAtomic(uint32_t) *NTracklets() const
GPUTPCTracker(const GPUTPCTracker &)=delete
GPUd() GPUglobalref() const cahit2 *HitData(const GPUTPCRow &row) const
GPUhd() GPUglobalref() GPUTPCHitId *TrackletTmpStartHits() const
GPUd() GPUglobalref() const calink *HitLinkUpData(const GPUTPCRow &row) const
GPUhdi() GPUglobalref() GPUTPCSectorOutput *Output() const
GPUd() cahit2 HitData(const GPUTPCRow &row
GPUhd() GPUglobalref() const GPUTPCTracklet &Tracklet(int32_t i) const
GPUhdi() const GPUTPCRow &Row(const GPUTPCHitId &HitId) const
int16_t MemoryResSectorScratch() const
void InitializeRows(const GPUParam *param)
GPUd() cahit HitDataZ(const GPUTPCRow &row
GPUhd() GPUglobalref() GPUAtomic(uint32_t) *NTrackHits() const
GPUhdi() GPUconstantref() GPUTPCTrackingData &Data()
void DumpLinks(std::ostream &out, int32_t phase)
void DumpStartHits(std::ostream &out)
GPUhd() uint32_t NMaxStartHits() const
GPUhd() GPUglobalref() GPUTPCTracklet *Tracklets() const
int16_t MemoryResScratchHost() const
GPUhdi() GPUglobalref() const GPUTPCClusterData *ClusterData() const
GPUd() void SetHitLinkUpData(const GPUTPCRow &row
GPUhd() uint32_t NMaxRowStartHits() const
GPUdi() void GetErrors2Seeding(int32_t iRow
GPUhd() GPUglobalref() GPUTPCHitId *TrackHits() const
GPUhd() GPUglobalref() const GPUTPCHitId *TrackletStartHits() const
GPUhd() uint32_t NHitsTotal() const
GPUhd() GPUglobalref() GPUAtomic(uint32_t) *NRowHits() const
GPUhd() const StructGPUParametersConst *GetGPUParametersConst() const
void DumpHitWeights(std::ostream &out)
void * SetPointersCommon(void *mem)
GPUhd() GPUglobalref() GPUAtomic(uint32_t) *NTracks() const
int16_t MemoryResCommon() const
GPUTPCTracker & operator=(const GPUTPCTracker &)=delete
GPUd() GPUglobalref() const calink *FirstHitInBin(const GPUTPCRow &row) const
char int32_t const GPUTPCTrackParam float float float & ErrZ2
char int32_t const GPUTPCTrackParam float time
void * SetPointersTracklets(void *mem)
char int32_t const GPUTPCTrackParam & t
GPUhd() int32_t ISector() const
GPUhd() GPUglobalref() calink *TrackletRowHits() const
GPUhd() GPUconstantref() const GPUTPCTrackingData &Data() const
GPUhd() uint32_t NMaxTracklets() const
GPUhd() int32_t HitInputID(const GPUTPCRow &row
void * SetPointersScratch(void *mem)
void DumpTrackingData(std::ostream &out)
void DumpTrackletHits(std::ostream &out)
GPUd() cahit HitDataY(const GPUTPCRow &row
GPUhd() GPUglobalref() GPUTPCRow *TrackingDataRows() const
GPUhd() void SetGPUTextureBase(GPUglobalref() const void *val)
void SetSector(int32_t iSector)
const GPUTPCTrackParam float float float &ErrZ2 const
GPUd() GPUglobalref() const calink *HitLinkDownData(const GPUTPCRow &row) const
GPUhd() StructGPUParametersConst *GPUParametersConst()
GPUd() void MaximizeHitWeight(const GPUTPCRow &row
void InitializeRows(const GPUParam &p)
const GLdouble * v
Definition glcorearb.h:832
GLuint GLuint GLfloat weight
Definition glcorearb.h:5477
GLboolean GLboolean GLboolean b
Definition glcorearb.h:1233
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLuint GLfloat * val
Definition glcorearb.h:1582
GLenum GLfloat param
Definition glcorearb.h:271
GLboolean GLboolean GLboolean GLboolean a
Definition glcorearb.h:1233
GLdouble GLdouble GLdouble z
Definition glcorearb.h:843
uint32_t cahit
Definition GPUTPCDef.h:31
uint32_t calink
Definition GPUTPCDef.h:30
std::vector< int > row