Skip to content

Commit 0aed7a6

Browse files
committed
GPU TPC: Make workarounds for cyclic merge graphs optional (to be checked, but should be removed eventually)
1 parent 0344aa6 commit 0aed7a6

File tree

4 files changed

+21
-14
lines changed

4 files changed

+21
-14
lines changed

GPU/GPUTracking/Definitions/GPUSettingsList.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ AddOptionRTC(fitInProjections, int8_t, -1, "", 0, "Fit in projection, -1 to enab
199199
AddOptionRTC(fitPropagateBzOnly, int8_t, -1, "", 0, "Propagate using Bz only for n passes")
200200
AddOptionRTC(useMatLUT, int8_t, 0, "", 0, "Use material lookup table for TPC refit")
201201
AddOptionRTC(trackingRefitGPUModel, int8_t, 1, "", 0, "Use GPU track model for the Global Track Refit")
202+
AddOptionRTC(enableCyclicGraphWorkarounds, int8_t, 0, "", 0, "Apply workarounds to avoid cyclic merge graphs, should not be needed")
202203
AddCustomCPP(void SetMinTrackPtB5(float v) { maxTrackQPtB5 = v > 0.001f ? (1.f / v) : (1.f / 0.001f); })
203204
AddSubConfig(GPUSettingsRecTPC, tpc)
204205
AddSubConfig(GPUSettingsRecTRD, trd)

GPU/GPUTracking/Merger/GPUTPCGMMergedTrack.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,23 +50,23 @@ class GPUTPCGMMergedTrack
5050
GPUd() bool MergedLooper() const { return mFlags & 0x30; }
5151
GPUd() int32_t PrevSegment() const { return mPrevSegment; }
5252
template <class T>
53-
GPUd() static T* GetFirstSegment_helper(T* me, T* base)
53+
GPUd() static T* GetFirstSegment_helper(T* me, T* base, bool workaround)
5454
{
5555
if (me->mPrevSegment < 0) {
5656
return me;
5757
}
5858
T* cur = &base[me->mPrevSegment];
5959
while (cur->mPrevSegment >= 0) {
6060
T* next = &base[cur->mPrevSegment];
61-
if (next == me) {
61+
if (workaround && next == me) {
6262
return cur;
6363
}
6464
cur = next;
6565
}
6666
return cur;
6767
}
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); }
68+
GPUd() GPUTPCGMMergedTrack* GetFirstSegment(GPUTPCGMMergedTrack* base, bool workaround) { return GetFirstSegment_helper<GPUTPCGMMergedTrack>(this, base, workaround); }
69+
GPUd() const GPUTPCGMMergedTrack* GetFirstSegment(const GPUTPCGMMergedTrack* base, bool workaround) const { return GetFirstSegment_helper<const GPUTPCGMMergedTrack>(this, base, workaround); }
7070
GPUd() uint8_t Leg() const { return mLeg; }
7171
GPUd() uint8_t Flags() const { return mFlags; }
7272

GPU/GPUTracking/Merger/GPUTPCGMMerger.cxx

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1461,7 +1461,9 @@ GPUd() void GPUTPCGMMerger::CollectMergedTracks(int32_t nBlocks, int32_t nThread
14611461
if (trbase->PrevSegmentNeighbour() >= 0) {
14621462
trbase = nullptr;
14631463
} else {
1464-
trbase->SetPrevSegmentNeighbour(1000000001);
1464+
if (Param().rec.enableCyclicGraphWorkarounds) {
1465+
trbase->SetPrevSegmentNeighbour(1000000001);
1466+
}
14651467
leg += revertSegments ? 1 : -1;
14661468
}
14671469
} else {
@@ -1483,13 +1485,15 @@ GPUd() void GPUTPCGMMerger::CollectMergedTracks(int32_t nBlocks, int32_t nThread
14831485
}
14841486
revertSegments = false;
14851487
revertInSegment = false;
1486-
trbase->SetPrevSegmentNeighbour(1000000000);
1488+
if (Param().rec.enableCyclicGraphWorkarounds) {
1489+
trbase->SetPrevSegmentNeighbour(1000000000);
1490+
}
14871491
int32_t jtr = trbase->NextNeighbour();
14881492
leg = 0;
14891493
if (jtr >= 0) {
14901494
int32_t lasttr = itr;
14911495
while (jtr >= 0) { // --------------- count segments ---------------
1492-
if (&mSectorTrackInfos[jtr] == trbase) {
1496+
if (Param().rec.enableCyclicGraphWorkarounds && &mSectorTrackInfos[jtr] == trbase) {
14931497
break; // Break cyclic graph
14941498
}
14951499
lasttr = jtr;
@@ -1512,7 +1516,7 @@ GPUd() void GPUTPCGMMerger::CollectMergedTracks(int32_t nBlocks, int32_t nThread
15121516
mainT = t;
15131517
}
15141518
int32_t next = trchk->NextSegmentNeighbour();
1515-
if (next < 0 || next == ichk) {
1519+
if (next < 0 || (Param().rec.enableCyclicGraphWorkarounds && next == ichk)) {
15161520
break; // Breaks also cycles
15171521
}
15181522
trchk = &mSectorTrackInfos[next];
@@ -1533,7 +1537,7 @@ GPUd() void GPUTPCGMMerger::CollectMergedTracks(int32_t nBlocks, int32_t nThread
15331537
length = trchk->OrigTrack()->NHits();
15341538
}
15351539
int32_t next = trchk->NextSegmentNeighbour();
1536-
if (next < 0 || next == ichk) {
1540+
if (next < 0 || (Param().rec.enableCyclicGraphWorkarounds && next == ichk)) {
15371541
break; // Breaks also cycles
15381542
}
15391543
trchk = &mSectorTrackInfos[next];
@@ -1575,7 +1579,9 @@ GPUd() void GPUTPCGMMerger::CollectMergedTracks(int32_t nBlocks, int32_t nThread
15751579
int32_t jtr = tr->NextSegmentNeighbour();
15761580
if (jtr >= 0) {
15771581
tr = &(mSectorTrackInfos[jtr]);
1578-
tr->SetPrevSegmentNeighbour(1000000002);
1582+
if (Param().rec.enableCyclicGraphWorkarounds) {
1583+
tr->SetPrevSegmentNeighbour(1000000002);
1584+
}
15791585
continue;
15801586
}
15811587
break;
@@ -1797,7 +1803,7 @@ GPUd() void GPUTPCGMMerger::PrepareForFit1(int32_t nBlocks, int32_t nThreads, in
17971803
CAMath::AtomicAdd(&mSharedCount[mClusters[trk.FirstClusterRef() + j].num], 1u);
17981804
}
17991805
if (!trk.CCE() && !trk.MergedLooper()) {
1800-
GPUTPCGMMergedTrack* updTrk = trk.GetFirstSegment(mMergedTracks);
1806+
GPUTPCGMMergedTrack* updTrk = trk.GetFirstSegment(mMergedTracks, Param().rec.enableCyclicGraphWorkarounds);
18011807
const auto &cl0 = mClusters[trk.FirstClusterRef()], &cln = mClusters[updTrk->FirstClusterRef() + updTrk->NClusters() - 1];
18021808
const auto& GPUrestrict() cls = GetConstantMem()->ioPtrs.clustersNative->clustersLinear;
18031809
float z0 = cls[cl0.num].getTime(), zn = cls[cln.num].getTime();
@@ -1806,7 +1812,7 @@ GPUd() void GPUTPCGMMerger::PrepareForFit1(int32_t nBlocks, int32_t nThreads, in
18061812
updTrk = &trk;
18071813
while (updTrk->PrevSegment() >= 0) {
18081814
auto next = &mMergedTracks[updTrk->PrevSegment()];
1809-
if (next == &trk) {
1815+
if (Param().rec.enableCyclicGraphWorkarounds && next == &trk) {
18101816
break;
18111817
}
18121818
updTrk = next;
@@ -1966,7 +1972,7 @@ GPUd() void GPUTPCGMMerger::MergeLoopersMain(int32_t nBlocks, int32_t nThreads,
19661972
const GPUTPCGMMergedTrack* trkI = &mMergedTracks[candidates[i].id];
19671973
float refZI = candidates[i].refz;
19681974
{
1969-
const auto* tmp = trkI->GetFirstSegment(mMergedTracks);
1975+
const auto* tmp = trkI->GetFirstSegment(mMergedTracks, Param().rec.enableCyclicGraphWorkarounds);
19701976
if (tmp != trkI && tmp->CSide() == trkI->CSide() && CAMath::Abs(tmp->GetParam().GetZ()) > CAMath::Abs(trkI->GetParam().GetZ())) {
19711977
float tmpRefZ = refZI + tmp->GetParam().GetZ() - trkI->GetParam().GetZ();
19721978
if (CAMath::Abs(tmpRefZ) < CAMath::Abs(candidates[j].refz) && CAMath::Abs(tmpRefZ) > CAMath::Abs(refZI)) {

GPU/GPUTracking/Merger/GPUTPCGMO2Output.cxx

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

214214
if (track.PrevSegment() >= 0) {
215-
const GPUTPCGMMergedTrack* chkTrk = track.GetFirstSegment(tracks);
215+
const GPUTPCGMMergedTrack* chkTrk = track.GetFirstSegment(tracks, merger.Param().rec.enableCyclicGraphWorkarounds);
216216
const auto& firstPrevCluster = trackClusters[chkTrk->FirstClusterRef()];
217217
t1 = clusters->clustersLinear[firstPrevCluster.num].getTime();
218218
sector1 = firstPrevCluster.sector;

0 commit comments

Comments
 (0)