Skip to content

Commit c426151

Browse files
committed
GPU TPC: Avoid some code duplication
1 parent 37030d8 commit c426151

File tree

3 files changed

+21
-24
lines changed

3 files changed

+21
-24
lines changed

GPU/GPUTracking/Merger/GPUTPCGMMergedTrack.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,24 @@ class GPUTPCGMMergedTrack
4949
GPUd() bool MergedLooperConnected() const { return mFlags & 0x20; }
5050
GPUd() bool MergedLooper() const { return mFlags & 0x30; }
5151
GPUd() int32_t PrevSegment() const { return mPrevSegment; }
52+
template <class T>
53+
GPUd() static T* GetFirstSegment_helper(T* me, T* base)
54+
{
55+
if (me->mPrevSegment < 0) {
56+
return me;
57+
}
58+
T* cur = &base[me->mPrevSegment];
59+
while (cur->mPrevSegment >= 0) {
60+
T* next = &base[cur->mPrevSegment];
61+
if (next == me) {
62+
return cur;
63+
}
64+
cur = next;
65+
}
66+
return cur;
67+
}
68+
GPUd() GPUTPCGMMergedTrack* GetFirstSegment(GPUTPCGMMergedTrack* base) { return GetFirstSegment_helper<GPUTPCGMMergedTrack>(this, base); }
69+
GPUd() const GPUTPCGMMergedTrack* GetFirstSegment(const GPUTPCGMMergedTrack* base) const { return GetFirstSegment_helper<const GPUTPCGMMergedTrack>(this, base); }
5270
GPUd() uint8_t Leg() const { return mLeg; }
5371
GPUd() uint8_t Flags() const { return mFlags; }
5472

GPU/GPUTracking/Merger/GPUTPCGMMerger.cxx

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1797,14 +1797,7 @@ GPUd() void GPUTPCGMMerger::PrepareForFit1(int32_t nBlocks, int32_t nThreads, in
17971797
CAMath::AtomicAdd(&mSharedCount[mClusters[trk.FirstClusterRef() + j].num], 1u);
17981798
}
17991799
if (!trk.CCE() && !trk.MergedLooper()) {
1800-
GPUTPCGMMergedTrack* updTrk = &trk;
1801-
while (updTrk->PrevSegment() >= 0) {
1802-
auto next = &mMergedTracks[updTrk->PrevSegment()];
1803-
if (next == &trk) {
1804-
break;
1805-
}
1806-
updTrk = next;
1807-
}
1800+
GPUTPCGMMergedTrack* updTrk = trk.GetFirstSegment(mMergedTracks);
18081801
const auto &cl0 = mClusters[trk.FirstClusterRef()], &cln = mClusters[updTrk->FirstClusterRef() + updTrk->NClusters() - 1];
18091802
const auto& GPUrestrict() cls = GetConstantMem()->ioPtrs.clustersNative->clustersLinear;
18101803
float z0 = cls[cl0.num].getTime(), zn = cls[cln.num].getTime();
@@ -1973,14 +1966,7 @@ GPUd() void GPUTPCGMMerger::MergeLoopersMain(int32_t nBlocks, int32_t nThreads,
19731966
const GPUTPCGMMergedTrack* trkI = &mMergedTracks[candidates[i].id];
19741967
float refZI = candidates[i].refz;
19751968
{
1976-
const auto* tmp = trkI;
1977-
while (tmp->PrevSegment() >= 0) {
1978-
const auto* next = &mMergedTracks[tmp->PrevSegment()];
1979-
if (next == trkI) {
1980-
break;
1981-
}
1982-
tmp = next;
1983-
}
1969+
const auto* tmp = trkI->GetFirstSegment(mMergedTracks);
19841970
if (tmp != trkI && tmp->CSide() == trkI->CSide() && CAMath::Abs(tmp->GetParam().GetZ()) > CAMath::Abs(trkI->GetParam().GetZ())) {
19851971
float tmpRefZ = refZI + tmp->GetParam().GetZ() - trkI->GetParam().GetZ();
19861972
if (CAMath::Abs(tmpRefZ) < CAMath::Abs(candidates[j].refz) && CAMath::Abs(tmpRefZ) > CAMath::Abs(refZI)) {

GPU/GPUTracking/Merger/GPUTPCGMO2Output.cxx

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -212,14 +212,7 @@ GPUdii() void GPUTPCGMO2Output::Thread<GPUTPCGMO2Output::output>(int32_t nBlocks
212212
}
213213

214214
if (track.PrevSegment() >= 0) {
215-
const GPUTPCGMMergedTrack* chkTrk = &tracks[track.PrevSegment()];
216-
while (chkTrk->PrevSegment() >= 0) {
217-
auto next = &tracks[chkTrk->PrevSegment()];
218-
if (next == &track) {
219-
break;
220-
}
221-
chkTrk = next;
222-
}
215+
const GPUTPCGMMergedTrack* chkTrk = track.GetFirstSegment(tracks);
223216
const auto& firstPrevCluster = trackClusters[chkTrk->FirstClusterRef()];
224217
t1 = clusters->clustersLinear[firstPrevCluster.num].getTime();
225218
sector1 = firstPrevCluster.sector;

0 commit comments

Comments
 (0)