]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/TPCLib/tracking-ca/AliHLTTPCCATrackletConstructor.h
Declaration of fabs
[u/mrichter/AliRoot.git] / HLT / TPCLib / tracking-ca / AliHLTTPCCATrackletConstructor.h
1 //-*- Mode: C++ -*-
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                               *
6 //                                                                        *
7 //*************************************************************************
8
9 #ifndef ALIHLTTPCCATRACKLETCONSTRUCTOR_H
10 #define ALIHLTTPCCATRACKLETCONSTRUCTOR_H
11
12 #ifdef HLTCA_GPUCODE
13 #define HLTCA_GPU_USE_INT short
14 #else
15 #define HLTCA_GPU_USE_INT int
16 #endif //HLTCA_GPUCODE
17
18 #include "AliHLTTPCCADef.h"
19 #include "AliHLTTPCCAGPUConfig.h"
20 #include "AliHLTTPCCATrackParam.h"
21
22 /**
23  * @class AliHLTTPCCATrackletConstructor
24  *
25  */
26 class AliHLTTPCCATracker;
27
28 class AliHLTTPCCATrackletConstructor
29 {
30   public:
31
32     class  AliHLTTPCCAThreadMemory
33     {
34       friend class AliHLTTPCCATrackletConstructor; //! friend class
35       public:
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)
41 #endif
42                 {}
43
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)
48 #endif
49                 {}
50         AliHLTTPCCAThreadMemory& operator=( const AliHLTTPCCAThreadMemory& /*dummy*/ ) { return *this; }
51 #endif //!HLTCA_GPUCODE
52
53       protected:
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
70 #endif
71     };
72
73         //Structure to store track parameters and temporary thread variables in global memory when rescheduling
74         struct AliHLTTPCCAGPUTempMemory
75         {
76           AliHLTTPCCAThreadMemory fThreadMem;// thread memory
77           AliHLTTPCCATrackParam fParam;// parameters
78         };
79         
80         class   AliHLTTPCCASharedMemory
81     {
82       friend class AliHLTTPCCATrackletConstructor; // friend class
83       public:
84 #if !defined(HLTCA_GPUCODE)
85         AliHLTTPCCASharedMemory()
86                         : fNextTrackletFirst(0), fNextTrackletCount(0), fNextTrackletFirstRun(0), fNTracklets(0) {
87 #ifndef HLTCA_GPU_ALTERNATIVE_SCHEDULER
88           for( int i=0; i<HLTCA_GPU_THREAD_COUNT / HLTCA_GPU_WARP_SIZE + 1; i++)fStartRows[i] = 0;
89           for( int i=0; i<HLTCA_GPU_THREAD_COUNT / HLTCA_GPU_WARP_SIZE + 1; i++) fEndRows[i]=0;
90 #endif
91         }
92
93         AliHLTTPCCASharedMemory( const AliHLTTPCCASharedMemory& /*dummy*/ )
94           : fNextTrackletFirst(0), fNextTrackletCount(0), fNextTrackletFirstRun(0), fNTracklets(0) {
95 #ifndef HLTCA_GPU_ALTERNATIVE_SCHEDULER
96           for( int i=0; i<HLTCA_GPU_THREAD_COUNT / HLTCA_GPU_WARP_SIZE + 1; i++)fStartRows[i] = 0;
97           for( int i=0; i<HLTCA_GPU_THREAD_COUNT / HLTCA_GPU_WARP_SIZE + 1; i++) fEndRows[i]=0;
98 #endif
99         }
100
101       AliHLTTPCCASharedMemory& operator=( const AliHLTTPCCASharedMemory& /*dummy*/ ) { return *this; }
102 #endif //HLTCA_GPUCODE
103
104       protected:
105       AliHLTTPCCARow fRows[HLTCA_ROW_COUNT]; // rows
106       int fNextTrackletFirst; //First tracklet to be processed by CUDA block during next iteration
107       int fNextTrackletCount; //Number of Tracklets to be processed by CUDA block during next iteration
108       int fNextTrackletFirstRun; //First run for dynamic scheduler?
109           //Use IFDEF to save GPU shared memory
110 #ifdef HLTCA_GPU_ALTERNATIVE_SCHEDULER
111 #ifndef HLTCA_GPU_ALTERNATIVE_SCHEDULER_SIMPLE
112           int fTrackletStorePos; //position in temporary storage
113           AliHLTTPCCATrackletConstructor::AliHLTTPCCAGPUTempMemory swapMemory[HLTCA_GPU_ALTSCHED_MIN_THREADS]; //temporary swap space for scheduling
114 #endif
115 #elif defined(HLTCA_GPU_RESCHED)
116       int fNextTrackletStupidDummy; //Shared Dummy variable to access
117       int fStartRows[HLTCA_GPU_THREAD_COUNT / HLTCA_GPU_WARP_SIZE + 1]; // start rows
118       int fEndRows[HLTCA_GPU_THREAD_COUNT / HLTCA_GPU_WARP_SIZE + 1]; // end rows
119 #endif
120       int fNTracklets; // Total number of tracklets
121
122 #ifdef HLTCA_GPU_TRACKLET_CONSTRUCTOR_DO_PROFILE
123       int fMaxSync; //temporary shared variable during profile creation
124 #endif //HLTCA_GPU_TRACKLET_CONSTRUCTOR_DO_PROFILE
125
126       int fTrackletStoreCount[2][HLTCA_ROW_COUNT / HLTCA_GPU_SCHED_ROW_STEP + 1];//Number of tracklets to store in tracklet pool for rescheduling
127     };
128
129         GPUd() static void InitTracklet ( AliHLTTPCCATrackParam &tParam );
130
131     GPUd() static void UpdateTracklet
132     ( int nBlocks, int nThreads, int iBlock, int iThread,
133       AliHLTTPCCASharedMemory &s, AliHLTTPCCAThreadMemory &r, AliHLTTPCCATracker &tracker, AliHLTTPCCATrackParam &tParam, int iRow );
134
135     GPUd() static void StoreTracklet
136     ( int nBlocks, int nThreads, int iBlock, int iThread,
137       AliHLTTPCCASharedMemory &s, AliHLTTPCCAThreadMemory &r, AliHLTTPCCATracker &tracker, AliHLTTPCCATrackParam &tParam );
138
139         GPUd() static bool CheckCov(AliHLTTPCCATrackParam &tParam);
140
141 #ifdef HLTCA_GPUCODE
142         GPUd() static void AliHLTTPCCATrackletConstructorGPU(AliHLTTPCCATracker *pTracker);
143         GPUd() static void AliHLTTPCCATrackletConstructorGPUPP(AliHLTTPCCATracker *pTracker);
144 #ifndef HLTCA_GPU_ALTERNATIVE_SCHEDULER
145         GPUd() static int FetchTracklet(AliHLTTPCCATracker &tracker, AliHLTTPCCASharedMemory &sMem, int Reverse, int RowBlock, int &mustInit);
146         GPUd() static void AliHLTTPCCATrackletConstructorInit(int iTracklet, AliHLTTPCCATracker &tracke);
147 #else
148         GPUd() static int FetchTracklet(AliHLTTPCCATracker &tracker, AliHLTTPCCASharedMemory &sMem, AliHLTTPCCAThreadMemory &rMem, AliHLTTPCCATrackParam &tParam);
149 #endif
150         GPUd() static void CopyTrackletTempData( AliHLTTPCCAThreadMemory &rMemSrc, AliHLTTPCCAThreadMemory &rMemDst, AliHLTTPCCATrackParam &tParamSrc, AliHLTTPCCATrackParam &tParamDst);
151 #else
152         GPUd() static void AliHLTTPCCATrackletConstructorCPU(AliHLTTPCCATracker &tracker);
153         GPUd() static int AliHLTTPCCATrackletConstructorGlobalTracking(AliHLTTPCCATracker &tracker, AliHLTTPCCATrackParam& tParam, int startrow, int increment);
154 #endif //HLTCA_GPUCODE
155
156     GPUd() static bool SAVE() { return 1; }
157 };
158
159 #endif //ALIHLTTPCCATRACKLETCONSTRUCTOR_H