2 // ************************************************************************
3 // This file is property of and copyright by the ALICE HLT Project *
4 // ALICE Experiment at CERN, All rights reserved. *
5 // See cxx source for full Copyright notice *
7 //*************************************************************************
9 #ifndef ALIHLTTPCCATRACKLETCONSTRUCTOR_H
10 #define ALIHLTTPCCATRACKLETCONSTRUCTOR_H
13 #define HLTCA_GPU_USE_INT short
15 #define HLTCA_GPU_USE_INT int
16 #endif //HLTCA_GPUCODE
18 #include "AliHLTTPCCADef.h"
19 #include "AliHLTTPCCAGPUConfig.h"
20 #include "AliHLTTPCCATrackParam.h"
23 * @class AliHLTTPCCATrackletConstructor
26 MEM_CLASS_PRE() class AliHLTTPCCATracker;
28 class AliHLTTPCCATrackletConstructor
32 class AliHLTTPCCAThreadMemory
34 friend class AliHLTTPCCATrackletConstructor; //! friend class
36 #if !defined(HLTCA_GPUCODE)
37 AliHLTTPCCAThreadMemory()
38 : fItr( 0 ), fFirstRow( 0 ), fLastRow( 0 ), fStartRow( 0 ), fEndRow( 0 ), fCurrIH( 0 ), fGo( 0 ), fStage( 0 ), fNHits( 0 ), fNMissed( 0 ), fLastY( 0 ), fLastZ( 0 )
39 #ifdef HLTCA_GPU_ALTERNATIVE_SCHEDULER
40 , fIRow(0), fIRowEnd(0)
44 AliHLTTPCCAThreadMemory( const AliHLTTPCCAThreadMemory& /*dummy*/ )
45 : fItr( 0 ), fFirstRow( 0 ), fLastRow( 0 ), fStartRow( 0 ), fEndRow( 0 ), fCurrIH( 0 ), fGo( 0 ), fStage( 0 ), fNHits( 0 ), fNMissed( 0 ), fLastY( 0 ), fLastZ( 0 )
46 #ifdef HLTCA_GPU_ALTERNATIVE_SCHEDULER
47 , fIRow(0), fIRowEnd(0)
50 AliHLTTPCCAThreadMemory& operator=( const AliHLTTPCCAThreadMemory& /*dummy*/ ) { return *this; }
51 #endif //!HLTCA_GPUCODE
54 //WARNING: This data is copied element by element in CopyTrackletTempData. Changes to members of this class must be reflected in CopyTrackletTempData!!!
55 int fItr; // track index
56 int fFirstRow; // first row index
57 int fLastRow; // last row index
58 int fStartRow; // first row index
59 int fEndRow; // first row index
60 int fCurrIH; // indef of the current hit
61 bool fGo; // do fit/searching flag
62 int fStage; // reco stage
63 int fNHits; // n track hits
64 int fNMissed; // n missed hits during search
65 float fLastY; // Y of the last fitted cluster
66 float fLastZ; // Z of the last fitted cluster
67 #if defined(HLTCA_GPU_ALTERNATIVE_SCHEDULER)
68 int fIRow; //current row for alt sched
69 int fIRowEnd; //last row for current alt sched iteration
73 //Structure to store track parameters and temporary thread variables in global memory when rescheduling
74 MEM_CLASS_PRE2() struct AliHLTTPCCAGPUTempMemory
76 #if !defined(HLTCA_GPUCODE)
77 AliHLTTPCCAGPUTempMemory() : fThreadMem(), fParam() {}
79 AliHLTTPCCAThreadMemory fThreadMem;// thread memory
80 MEM_LG2(AliHLTTPCCATrackParam) fParam;// parameters
83 MEM_CLASS_PRE() class AliHLTTPCCASharedMemory
85 friend class AliHLTTPCCATrackletConstructor; // friend class
87 #if !defined(HLTCA_GPUCODE)
88 AliHLTTPCCASharedMemory()
89 : fNextTrackletFirst(0), fNextTrackletCount(0), fNextTrackletFirstRun(0)
90 #if defined(HLTCA_GPU_ALTERNATIVE_SCHEDULER) && !defined(HLTCA_GPU_ALTERNATIVE_SCHEDULER_SIMPLE)
94 #ifndef HLTCA_GPU_ALTERNATIVE_SCHEDULER
95 for( int i=0; i<HLTCA_GPU_THREAD_COUNT_CONSTRUCTOR / HLTCA_GPU_WARP_SIZE + 1; i++)fStartRows[i] = 0;
96 for( int i=0; i<HLTCA_GPU_THREAD_COUNT_CONSTRUCTOR / HLTCA_GPU_WARP_SIZE + 1; i++) fEndRows[i]=0;
100 AliHLTTPCCASharedMemory( const AliHLTTPCCASharedMemory& /*dummy*/ )
101 : fNextTrackletFirst(0), fNextTrackletCount(0), fNextTrackletFirstRun(0)
102 #if defined(HLTCA_GPU_ALTERNATIVE_SCHEDULER) && !defined(HLTCA_GPU_ALTERNATIVE_SCHEDULER_SIMPLE)
103 ,fTrackletStorePos(0)
106 #ifndef HLTCA_GPU_ALTERNATIVE_SCHEDULER
107 for( int i=0; i<HLTCA_GPU_THREAD_COUNT_CONSTRUCTOR / HLTCA_GPU_WARP_SIZE + 1; i++)fStartRows[i] = 0;
108 for( int i=0; i<HLTCA_GPU_THREAD_COUNT_CONSTRUCTOR / HLTCA_GPU_WARP_SIZE + 1; i++) fEndRows[i]=0;
112 AliHLTTPCCASharedMemory& operator=( const AliHLTTPCCASharedMemory& /*dummy*/ ) { return *this; }
113 #endif //HLTCA_GPUCODE
116 MEM_LG(AliHLTTPCCARow) fRows[HLTCA_ROW_COUNT]; // rows
117 int fNextTrackletFirst; //First tracklet to be processed by CUDA block during next iteration
118 int fNextTrackletCount; //Number of Tracklets to be processed by CUDA block during next iteration
119 int fNextTrackletFirstRun; //First run for dynamic scheduler?
120 //Use IFDEF to save GPU shared memory
121 #ifdef HLTCA_GPU_ALTERNATIVE_SCHEDULER
122 #ifndef HLTCA_GPU_ALTERNATIVE_SCHEDULER_SIMPLE
123 int fTrackletStorePos; //position in temporary storage
124 AliHLTTPCCATrackletConstructor::MEM_LG(AliHLTTPCCAGPUTempMemory) swapMemory[HLTCA_GPU_ALTSCHED_MIN_THREADS]; //temporary swap space for scheduling
126 #elif defined(HLTCA_GPU_RESCHED)
127 int fNextTrackletStupidDummy; //Shared Dummy variable to access
128 int fStartRows[HLTCA_GPU_THREAD_COUNT_CONSTRUCTOR / HLTCA_GPU_WARP_SIZE + 1]; // start rows
129 int fEndRows[HLTCA_GPU_THREAD_COUNT_CONSTRUCTOR / HLTCA_GPU_WARP_SIZE + 1]; // end rows
131 int fNTracklets; // Total number of tracklets
133 #ifdef HLTCA_GPU_TRACKLET_CONSTRUCTOR_DO_PROFILE
134 int fMaxSync; //temporary shared variable during profile creation
135 #endif //HLTCA_GPU_TRACKLET_CONSTRUCTOR_DO_PROFILE
137 int fTrackletStoreCount[2][HLTCA_ROW_COUNT / HLTCA_GPU_SCHED_ROW_STEP + 1];//Number of tracklets to store in tracklet pool for rescheduling
140 MEM_CLASS_PRE2() GPUd() static void InitTracklet( register MEM_LG2(AliHLTTPCCATrackParam) &tParam );
142 MEM_CLASS_PRE2() GPUd() static void UpdateTracklet
143 ( int nBlocks, int nThreads, int iBlock, int iThread,
144 MEM_LOCAL(GPUsharedref() AliHLTTPCCASharedMemory) &s, AliHLTTPCCAThreadMemory &r, GPUconstant() MEM_CONSTANT(AliHLTTPCCATracker) &tracker, MEM_LG2(AliHLTTPCCATrackParam) &tParam, int iRow );
146 MEM_CLASS_PRE23() GPUd() static void StoreTracklet
147 ( int nBlocks, int nThreads, int iBlock, int iThread,
148 MEM_LOCAL(GPUsharedref() AliHLTTPCCASharedMemory) &s, AliHLTTPCCAThreadMemory &r, GPUconstant() MEM_LG2(AliHLTTPCCATracker) &tracker, MEM_LG3(AliHLTTPCCATrackParam) &tParam );
150 MEM_CLASS_PRE2() GPUd() static bool CheckCov(register MEM_LG2(AliHLTTPCCATrackParam) &tParam);
153 GPUd() static void AliHLTTPCCATrackletConstructorGPU(GPUconstant() MEM_CONSTANT(AliHLTTPCCATracker) *pTracker, GPUsharedref() AliHLTTPCCATrackletConstructor::MEM_LOCAL(AliHLTTPCCASharedMemory)& sMem);
154 MEM_CLASS_PRE2() GPUd() static void AliHLTTPCCATrackletConstructorGPUPP(MEM_LG2(AliHLTTPCCATracker) *pTracker);
155 #ifndef HLTCA_GPU_ALTERNATIVE_SCHEDULER
156 GPUd() static int FetchTracklet(GPUconstant() AliHLTTPCCATracker &tracker, GPUshared() AliHLTTPCCASharedMemory &sMem, int Reverse, int RowBlock, int &mustInit);
157 GPUd() static void AliHLTTPCCATrackletConstructorInit(int iTracklet, AliHLTTPCCATracker &tracke);
159 GPUd() static int FetchTracklet(GPUconstant() MEM_CONSTANT(AliHLTTPCCATracker) &tracker, GPUsharedref() MEM_LOCAL(AliHLTTPCCASharedMemory) &sMem, AliHLTTPCCAThreadMemory &rMem, MEM_PLAIN(AliHLTTPCCATrackParam) &tParam);
161 MEM_TEMPLATE4() GPUd() static void CopyTrackletTempData( MEM_TYPE(AliHLTTPCCAThreadMemory) &rMemSrc, MEM_TYPE2(AliHLTTPCCAThreadMemory) &rMemDst, MEM_TYPE3(AliHLTTPCCATrackParam) &tParamSrc, MEM_TYPE4(AliHLTTPCCATrackParam) &tParamDst);
163 GPUd() static void AliHLTTPCCATrackletConstructorCPU(AliHLTTPCCATracker &tracker);
164 GPUd() static int AliHLTTPCCATrackletConstructorGlobalTracking(AliHLTTPCCATracker &tracker, AliHLTTPCCATrackParam& tParam, int startrow, int increment);
165 #endif //HLTCA_GPUCODE
167 GPUd() static bool SAVE() { return 1; }
170 #endif //ALIHLTTPCCATRACKLETCONSTRUCTOR_H