Line data Source code
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. *
5 : // *
6 : // Primary Authors: Sergey Gorbunov <sergey.gorbunov@kip.uni-heidelberg.de> *
7 : // Ivan Kisel <kisel@kip.uni-heidelberg.de> *
8 : // for The ALICE HLT Project. *
9 : // *
10 : // Permission to use, copy, modify and distribute this software and its *
11 : // documentation strictly for non-commercial purposes is hereby granted *
12 : // without fee, provided that the above copyright notice appears in all *
13 : // copies and that both the copyright notice and this permission notice *
14 : // appear in the supporting documentation. The authors make no claims *
15 : // about the suitability of this software for any purpose. It is *
16 : // provided "as is" without express or implied warranty. *
17 : // *
18 : //***************************************************************************
19 :
20 : #include "AliHLTTPCCAStartHitsFinder.h"
21 : #include "AliHLTTPCCATracker.h"
22 : #include "AliHLTTPCCAMath.h"
23 :
24 : GPUdi() void AliHLTTPCCAStartHitsFinder::Thread
25 : ( int /*nBlocks*/, int nThreads, int iBlock, int iThread, int iSync,
26 : GPUsharedref() MEM_LOCAL(AliHLTTPCCASharedMemory) &s, GPUconstant() MEM_CONSTANT(AliHLTTPCCATracker) &tracker )
27 : {
28 : // find start hits for tracklets
29 :
30 0 : if ( iSync == 0 ) {
31 0 : if ( iThread == 0 ) {
32 0 : s.fNRows = tracker.Param().NRows();
33 0 : s.fIRow = iBlock + 1;
34 0 : s.fNRowStartHits = 0;
35 0 : if ( s.fIRow <= s.fNRows - 4 ) {
36 0 : s.fNHits = tracker.Row( s.fIRow ).NHits();
37 0 : if ( s.fNHits >= ALIHLTTPCCASTARTHITSFINDER_MAX_FROWSTARTHITS ) s.fNHits = ALIHLTTPCCASTARTHITSFINDER_MAX_FROWSTARTHITS - 1;
38 0 : } else s.fNHits = -1;
39 : }
40 0 : } else if ( iSync == 1 ) {
41 : #ifdef HLTCA_GPUCODE
42 : GPUsharedref() volatile int *xxx = &(s.fIRow);
43 : GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &row = tracker.Row( *xxx );
44 : GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &rowUp = tracker.Row( (*xxx) + 2 );
45 : #else
46 0 : const AliHLTTPCCARow &row = tracker.Row( s.fIRow );
47 0 : const AliHLTTPCCARow &rowUp = tracker.Row( s.fIRow + 2 );
48 : #endif
49 0 : for ( int ih = iThread; ih < s.fNHits; ih += nThreads ) {
50 0 : if (tracker.HitLinkDownData(row, ih) < 0 && tracker.HitLinkUpData(row, ih) >= 0 && tracker.HitLinkUpData(rowUp, tracker.HitLinkUpData(row, ih)) >= 0) {
51 0 : int oldNRowStartHits = CAMath::AtomicAddShared( &s.fNRowStartHits, 1 );
52 : #ifdef HLTCA_GPUCODE
53 : s.fRowStartHits[oldNRowStartHits].Set( *xxx, ih );
54 : #else
55 0 : s.fRowStartHits[oldNRowStartHits].Set( s.fIRow, ih );
56 : #endif
57 0 : }
58 : }
59 0 : } else if ( iSync == 2 ) {
60 0 : if ( iThread == 0 ) {
61 0 : int nOffset = CAMath::AtomicAdd( tracker.NTracklets(), s.fNRowStartHits );
62 : #ifdef HLTCA_GPUCODE
63 : if (nOffset + s.fNRowStartHits >= HLTCA_GPU_MAX_TRACKLETS)
64 : {
65 : tracker.GPUParameters()->fGPUError = HLTCA_GPU_ERROR_TRACKLET_OVERFLOW;
66 : CAMath::AtomicExch( tracker.NTracklets(), 0 );
67 : nOffset = 0;
68 : }
69 : #endif
70 0 : s.fNOldStartHits = nOffset;
71 : #ifdef HLTCA_GPU_SORT_STARTHITS
72 : GPUsharedref() volatile int *yyy = &(s.fIRow);
73 : tracker.RowStartHitCountOffset()[*yyy].x = s.fNRowStartHits;
74 : tracker.RowStartHitCountOffset()[*yyy].y = nOffset;
75 : #endif
76 0 : }
77 0 : } else if ( iSync == 3 ) {
78 : #ifdef HLTCA_GPU_SORT_STARTHITS
79 : GPUglobalref() AliHLTTPCCAHitId *const startHits = tracker.TrackletTmpStartHits();
80 : #else
81 0 : GPUglobalref() AliHLTTPCCAHitId *const startHits = tracker.TrackletStartHits();
82 : #endif
83 0 : for ( int ish = iThread; ish < s.fNRowStartHits; ish += nThreads ) {
84 0 : startHits[s.fNOldStartHits+ish] = s.fRowStartHits[ish];
85 : }
86 0 : }
87 0 : }
88 :
|