Project
Loading...
Searching...
No Matches
GPUTPCTrackletSelector.cxx
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
16#include "GPUTPCTrack.h"
17#include "GPUTPCTracker.h"
18#include "GPUTPCTrackParam.h"
19#include "GPUTPCTracklet.h"
20#include "GPUCommonMath.h"
21
22using namespace o2::gpu;
23
24template <>
25GPUdii() void GPUTPCTrackletSelector::Thread<0>(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread, GPUsharedref() GPUSharedMemory& s, processorType& GPUrestrict() tracker)
26{
27 // select best tracklets and kill clones
28
29 if (iThread == 0) {
30 s.mNTracklets = *tracker.NTracklets();
31 s.mNThreadsTotal = nThreads * nBlocks;
32 s.mItr0 = nThreads * iBlock;
33 }
34 GPUbarrier();
35
37 const float maxSharedFrac = tracker.Param().rec.tpc.trackletMaxSharedFraction;
38
39 for (int32_t itr = s.mItr0 + iThread; itr < s.mNTracklets; itr += s.mNThreadsTotal) {
41
42 GPUglobalref() GPUTPCTracklet& GPUrestrict() tracklet = tracker.Tracklets()[itr];
43
44 int32_t firstRow = tracklet.FirstRow();
45 int32_t lastRow = tracklet.LastRow();
46
47 const int32_t w = tracklet.HitWeight();
48
49 int32_t irow = firstRow;
50
51 uint32_t gap = 0;
52 uint32_t nShared = 0;
53 uint32_t nHits = 0;
54 const uint32_t minHits = tracker.Param().rec.tpc.minNClustersTrackSeed == -1 ? GPUCA_TRACKLET_SELECTOR_MIN_HITS_B5(tracklet.Param().QPt() * tracker.Param().qptB5Scaler) : tracker.Param().rec.tpc.minNClustersTrackSeed;
55 const uint32_t sharingMinNorm = minHits * tracker.Param().rec.tpc.trackletMinSharedNormFactor;
56 float maxShared = maxSharedFrac * sharingMinNorm;
57
58 GPUCA_UNROLL(, U(1))
59 for (irow = firstRow; irow <= lastRow && lastRow - irow + nHits >= minHits; irow++) {
60 calink ih = tracker.TrackletRowHits()[tracklet.FirstHit() + (irow - firstRow)];
61 if (ih != CALINK_DEAD_CHANNEL) {
62 gap++;
63 }
64 if (ih != CALINK_INVAL && ih != CALINK_DEAD_CHANNEL) {
65 GPUglobalref() const GPUTPCRow& row = tracker.Row(irow);
66 const bool own = (tracker.HitWeight(row, ih) <= w);
67 const bool sharedOK = nShared <= (nHits < sharingMinNorm ? maxShared : nHits * maxSharedFrac);
68 if (own || sharedOK) { // SG!!!
69 gap = 0;
70#pragma GCC diagnostic push
71#pragma GCC diagnostic ignored "-Wtype-limits"
72 const bool inShared = nHits < (uint32_t)GPUCA_PAR_TRACKLET_SELECTOR_HITS_REG_SIZE;
73#pragma GCC diagnostic pop
75 if (inShared) {
76 s.mHits[nHits][iThread].Set(irow, ih);
77 }
78 }
79 if (!inShared) {
80 trackHits[nHits - GPUCA_PAR_TRACKLET_SELECTOR_HITS_REG_SIZE].Set(irow, ih);
81 }
82 nHits++;
83 if (!own) {
84 nShared++;
85 }
86 }
87 }
88
89 if (gap > tracker.Param().rec.tpc.trackFollowingMaxRowGap || irow == lastRow) { // store
90 if (nHits >= minHits) {
91 uint32_t nFirstTrackHit = CAMath::AtomicAdd(tracker.NTrackHits(), (uint32_t)nHits);
92 if (nFirstTrackHit + nHits > tracker.NMaxTrackHits()) {
93 tracker.raiseError(GPUErrors::ERROR_TRACK_HIT_OVERFLOW, tracker.ISector(), nFirstTrackHit + nHits, tracker.NMaxTrackHits());
94 CAMath::AtomicExch(tracker.NTrackHits(), tracker.NMaxTrackHits());
95 return;
96 }
97 uint32_t itrout = CAMath::AtomicAdd(tracker.NTracks(), 1u);
98 if (itrout >= tracker.NMaxTracks()) {
99 tracker.raiseError(GPUErrors::ERROR_TRACK_OVERFLOW, tracker.ISector(), itrout, tracker.NMaxTracks());
100 CAMath::AtomicExch(tracker.NTracks(), tracker.NMaxTracks());
101 return;
102 }
103 tracker.Tracks()[itrout].SetLocalTrackId(itrout);
104 tracker.Tracks()[itrout].SetParam(tracklet.Param());
105 tracker.Tracks()[itrout].SetFirstHitID(nFirstTrackHit);
106 tracker.Tracks()[itrout].SetNHits(nHits);
107 for (uint32_t jh = 0; jh < nHits; jh++) {
108#pragma GCC diagnostic push
109#pragma GCC diagnostic ignored "-Wtype-limits"
110 const bool inShared = jh < (uint32_t)GPUCA_PAR_TRACKLET_SELECTOR_HITS_REG_SIZE;
111#pragma GCC diagnostic pop
113 if (inShared) {
114 tracker.TrackHits()[nFirstTrackHit + jh] = s.mHits[jh][iThread];
115 }
116 }
117 if (!inShared) {
118 tracker.TrackHits()[nFirstTrackHit + jh] = trackHits[jh - GPUCA_PAR_TRACKLET_SELECTOR_HITS_REG_SIZE];
119 }
120 }
121 }
122 nHits = 0;
123 gap = 0;
124 nShared = 0;
125 }
126 }
127 }
128}
#define GPUsharedref()
#define GPUbarrierWarp()
#define GPUbarrier()
#define GPUrestrict()
#define GPUglobalref()
#define GPUCA_TRACKLET_SELECTOR_MIN_HITS_B5(QPTB5)
#define GPUCA_PAR_TRACKLET_SELECTOR_HITS_REG_SIZE
#define GPUCA_UNROLL(optCu, optHi)
#define CALINK_DEAD_CHANNEL
Definition GPUTPCDef.h:22
#define CALINK_INVAL
Definition GPUTPCDef.h:21
#define GPUCA_ROW_COUNT
GPUdii() void GPUTPCTrackletSelector
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLubyte GLubyte GLubyte GLubyte w
Definition glcorearb.h:852
uint32_t calink
Definition GPUTPCDef.h:30
std::vector< int > row