Skip to content

Commit 9ee262c

Browse files
committed
GPU TPC: Avoid some code duplication
1 parent 7b43769 commit 9ee262c

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
@@ -1770,14 +1770,7 @@ GPUd() void GPUTPCGMMerger::PrepareForFit1(int32_t nBlocks, int32_t nThreads, in
17701770
CAMath::AtomicAdd(&mSharedCount[mClusters[trk.FirstClusterRef() + j].num], 1u);
17711771
}
17721772
if (!trk.CCE() && !trk.MergedLooper()) {
1773-
GPUTPCGMMergedTrack* updTrk = &trk;
1774-
while (updTrk->PrevSegment() >= 0) {
1775-
auto next = &mMergedTracks[updTrk->PrevSegment()];
1776-
if (next == &trk) {
1777-
break;
1778-
}
1779-
updTrk = next;
1780-
}
1773+
GPUTPCGMMergedTrack* updTrk = trk.GetFirstSegment(mMergedTracks);
17811774
const auto &cl0 = mClusters[trk.FirstClusterRef()], &cln = mClusters[updTrk->FirstClusterRef() + updTrk->NClusters() - 1];
17821775
const auto& GPUrestrict() cls = GetConstantMem()->ioPtrs.clustersNative->clustersLinear;
17831776
float z0 = cls[cl0.num].getTime(), zn = cls[cln.num].getTime();
@@ -1946,14 +1939,7 @@ GPUd() void GPUTPCGMMerger::MergeLoopersMain(int32_t nBlocks, int32_t nThreads,
19461939
const GPUTPCGMMergedTrack* trkI = &mMergedTracks[candidates[i].id];
19471940
float refZI = candidates[i].refz;
19481941
{
1949-
const auto* tmp = trkI;
1950-
while (tmp->PrevSegment() >= 0) {
1951-
const auto* next = &mMergedTracks[tmp->PrevSegment()];
1952-
if (next == trkI) {
1953-
break;
1954-
}
1955-
tmp = next;
1956-
}
1942+
const auto* tmp = trkI->GetFirstSegment(mMergedTracks);
19571943
if (tmp != trkI && tmp->CSide() == trkI->CSide() && CAMath::Abs(tmp->GetParam().GetZ()) > CAMath::Abs(trkI->GetParam().GetZ())) {
19581944
float tmpRefZ = refZI + tmp->GetParam().GetZ() - trkI->GetParam().GetZ();
19591945
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)