1 // @(#) $Id: AliHLTTPCCAStartHitsFinder.cxx 27042 2008-07-02 12:06:02Z richterm $
2 // **************************************************************************
3 // This file is property of and copyright by the ALICE HLT Project *
4 // ALICE Experiment at CERN, All rights reserved. *
6 // Primary Authors: David Rohr <drohr@kip.uni-heidelberg.de> *
7 // for The ALICE HLT Project. *
9 // Permission to use, copy, modify and distribute this software and its *
10 // documentation strictly for non-commercial purposes is hereby granted *
11 // without fee, provided that the above copyright notice appears in all *
12 // copies and that both the copyright notice and this permission notice *
13 // appear in the supporting documentation. The authors make no claims *
14 // about the suitability of this software for any purpose. It is *
15 // provided "as is" without express or implied warranty. *
17 //***************************************************************************
19 #include "AliHLTTPCCAStartHitsSorter.h"
20 #include "AliHLTTPCCATracker.h"
22 GPUd() void AliHLTTPCCAStartHitsSorter::Thread
23 ( int nBlocks, int nThreads, int iBlock, int iThread, int iSync,
24 AliHLTTPCCASharedMemory &s, AliHLTTPCCATracker &tracker )
26 //Sorts the Start Hits by Row Index and create RowBlock Data
29 const int gpuFixedBlockCount = tracker.GPUParametersConst()->fGPUFixedBlockCount;
30 const int tmpNRows = tracker.Param().NRows() - 6;
31 int nRows = iBlock == 29 ? (tmpNRows - (tmpNRows / 30) * 29) : (tmpNRows / 30);
32 int nStartRow = (tmpNRows / 30) * iBlock + 1;
35 int previousBlockEndTracklet = 0;
36 int nCurrentBlock = 0;
38 for (int ir = 1;ir < tracker.Param().NRows() - 5;ir++)
41 startOffset2 += tracker.RowStartHitCountOffset()[ir].x;
43 if (iBlock == nBlocks - 1 && nCurrentBlock < gpuFixedBlockCount)
45 startOffset += tracker.RowStartHitCountOffset()[ir].x;
46 for (int i = previousBlockEndTracklet + HLTCA_GPU_THREAD_COUNT - HLTCA_GPU_TRACKLET_CONSTRUCTOR_NMEMTHREDS;i <= startOffset;i += HLTCA_GPU_THREAD_COUNT - HLTCA_GPU_TRACKLET_CONSTRUCTOR_NMEMTHREDS)
48 if (previousBlockEndTracklet / (HLTCA_GPU_THREAD_COUNT - HLTCA_GPU_TRACKLET_CONSTRUCTOR_NMEMTHREDS) != i / (HLTCA_GPU_THREAD_COUNT - HLTCA_GPU_TRACKLET_CONSTRUCTOR_NMEMTHREDS))
50 tracker.BlockStartingTracklet()[nCurrentBlock].x = previousBlockEndTracklet;
51 tracker.BlockStartingTracklet()[nCurrentBlock++].y = HLTCA_GPU_THREAD_COUNT - HLTCA_GPU_TRACKLET_CONSTRUCTOR_NMEMTHREDS;
52 previousBlockEndTracklet += HLTCA_GPU_THREAD_COUNT - HLTCA_GPU_TRACKLET_CONSTRUCTOR_NMEMTHREDS;
53 if (nCurrentBlock == gpuFixedBlockCount)
59 if ((ir + 1) % HLTCA_GPU_SCHED_ROW_STEP == 0 && nCurrentBlock < gpuFixedBlockCount)
61 if (previousBlockEndTracklet != startOffset)
63 tracker.BlockStartingTracklet()[nCurrentBlock].x = previousBlockEndTracklet;
64 tracker.BlockStartingTracklet()[nCurrentBlock++].y = startOffset - previousBlockEndTracklet;
65 previousBlockEndTracklet = startOffset;
68 if (nCurrentBlock == gpuFixedBlockCount)
70 tracker.GPUParameters()->fScheduleFirstDynamicTracklet = previousBlockEndTracklet;
74 if (iBlock == nBlocks - 1)
76 if (nCurrentBlock < gpuFixedBlockCount)
78 tracker.BlockStartingTracklet()[nCurrentBlock].x = previousBlockEndTracklet;
79 tracker.BlockStartingTracklet()[nCurrentBlock++].y = startOffset - previousBlockEndTracklet;
80 tracker.GPUParameters()->fScheduleFirstDynamicTracklet = startOffset;
82 for (int i = nCurrentBlock;i < HLTCA_GPU_BLOCK_COUNT;i++)
84 tracker.BlockStartingTracklet()[i].x = 0;
85 tracker.BlockStartingTracklet()[i].y = 0;
88 s.fStartOffset = startOffset2;
90 s.fStartRow = nStartRow;
92 } else if ( iSync == 1 ) {
93 int startOffset = s.fStartOffset;
94 for (int ir = 0;ir < s.fNRows;ir++)
96 AliHLTTPCCAHitId *const startHits = tracker.TrackletStartHits();
97 AliHLTTPCCAHitId *const tmpStartHits = tracker.TrackletTmpStartHits();
98 const int tmpLen = tracker.RowStartHitCountOffset()[ir + s.fStartRow].x; //Length of hits in row stored by StartHitsFinder
99 const int tmpOffset = tracker.RowStartHitCountOffset()[ir + s.fStartRow].y; //Offset of first hit in row of unsorted array by StartHitsFinder
101 tracker.RowStartHitCountOffset()[ir + s.fStartRow].z = startOffset; //Store New Offset Value of sorted array
103 for (int j = iThread;j < tmpLen;j += nThreads)
105 startHits[startOffset + j] = tmpStartHits[tmpOffset + j];
107 startOffset += tmpLen;