Skip to content

Commit b3084bb

Browse files
committed
GPU TPC: Implement ambiguity solving for rebuild tracks cluster association
1 parent 8ec2cd3 commit b3084bb

15 files changed

+339
-77
lines changed

GPU/GPUTracking/Definitions/GPUDefParametersDefaults.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@
6363
#define GPUCA_LB_GPUTPCGMMergerFinalize_0 256
6464
#define GPUCA_LB_GPUTPCGMMergerFinalize_1 256
6565
#define GPUCA_LB_GPUTPCGMMergerFinalize_2 256
66+
#define GPUCA_LB_GPUTPCGMMergerHitWeights_prepare 256
67+
#define GPUCA_LB_GPUTPCGMMergerHitWeights_compute 256
68+
#define GPUCA_LB_GPUTPCGMMergerHitWeights_resolve1 256
69+
#define GPUCA_LB_GPUTPCGMMergerHitWeights_resolve2 256
70+
#define GPUCA_LB_GPUTPCGMMergerHitWeights_resolveShared 256
6671
#define GPUCA_LB_GPUTPCCompressionKernels_step0attached 64, 2
6772
#define GPUCA_LB_GPUTPCCompressionKernels_step1unattached 512, 2
6873
#define GPUCA_LB_GPUTPCDecompressionKernels_step0attached 128, 2
@@ -187,6 +192,11 @@
187192
#define GPUCA_LB_GPUTPCGMMergerFinalize_0 256
188193
#define GPUCA_LB_GPUTPCGMMergerFinalize_1 256
189194
#define GPUCA_LB_GPUTPCGMMergerFinalize_2 256
195+
#define GPUCA_LB_GPUTPCGMMergerHitWeights_prepare 256
196+
#define GPUCA_LB_GPUTPCGMMergerHitWeights_compute 256
197+
#define GPUCA_LB_GPUTPCGMMergerHitWeights_resolve1 256
198+
#define GPUCA_LB_GPUTPCGMMergerHitWeights_resolve2 256
199+
#define GPUCA_LB_GPUTPCGMMergerHitWeights_resolveShared 256
190200
#define GPUCA_LB_GPUTPCCompressionKernels_step0attached 64, 2
191201
#define GPUCA_LB_GPUTPCCompressionKernels_step1unattached 512, 3
192202
#define GPUCA_LB_GPUTPCDecompressionKernels_step0attached 32, 1
@@ -249,6 +259,11 @@
249259
#define GPUCA_LB_GPUTPCGMMergerFinalize_0 256
250260
#define GPUCA_LB_GPUTPCGMMergerFinalize_1 256
251261
#define GPUCA_LB_GPUTPCGMMergerFinalize_2 256
262+
#define GPUCA_LB_GPUTPCGMMergerHitWeights_prepare 256
263+
#define GPUCA_LB_GPUTPCGMMergerHitWeights_compute 256
264+
#define GPUCA_LB_GPUTPCGMMergerHitWeights_resolve1 256
265+
#define GPUCA_LB_GPUTPCGMMergerHitWeights_resolve2 256
266+
#define GPUCA_LB_GPUTPCGMMergerHitWeights_resolveShared 256
252267
#define GPUCA_LB_GPUTPCCompressionKernels_step0attached 128
253268
#define GPUCA_LB_GPUTPCCompressionKernels_step1unattached 512, 2
254269
#define GPUCA_LB_GPUTPCDecompressionKernels_step0attached 32, 1
@@ -416,6 +431,21 @@
416431
#ifndef GPUCA_LB_GPUTPCGMMergerFinalize_step2
417432
#define GPUCA_LB_GPUTPCGMMergerFinalize_step2 256
418433
#endif
434+
#ifndef GPUCA_LB_GPUTPCGMMergerHitWeights_prepare
435+
#define GPUCA_LB_GPUTPCGMMergerHitWeights_prepare 256
436+
#endif
437+
#ifndef GPUCA_LB_GPUTPCGMMergerHitWeights_compute
438+
#define GPUCA_LB_GPUTPCGMMergerHitWeights_compute 256
439+
#endif
440+
#ifndef GPUCA_LB_GPUTPCGMMergerHitWeights_resolve1
441+
#define GPUCA_LB_GPUTPCGMMergerHitWeights_resolve1 256
442+
#endif
443+
#ifndef GPUCA_LB_GPUTPCGMMergerHitWeights_resolve2
444+
#define GPUCA_LB_GPUTPCGMMergerHitWeights_resolve2 256
445+
#endif
446+
#ifndef GPUCA_LB_GPUTPCGMMergerHitWeights_resolveShared
447+
#define GPUCA_LB_GPUTPCGMMergerHitWeights_resolveShared 256
448+
#endif
419449
#ifndef GPUCA_LB_GPUTPCGMMergerMergeLoopers_step0
420450
#define GPUCA_LB_GPUTPCGMMergerMergeLoopers_step0 256
421451
#endif

GPU/GPUTracking/Definitions/GPUSettingsList.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,12 +136,13 @@ AddOptionRTC(cfEdgeTwoPads, uint8_t, 0, "", 0, "Flag clusters with peak on the 2
136136
AddOptionRTC(nWays, uint8_t, 3, "", 0, "Do N fit passes in final fit of merger (must be odd to end with inward fit)")
137137
AddOptionRTC(rebuildTrackInFit, uint8_t, 1, "", 0, "Rebuild track completely during fit based on clusters closed to interpolated track positions")
138138
AddOptionRTC(rebuildTrackInFitClusterCandidates, uint8_t, 3, "", 0, "Number of cluster candidates per row for rebuilt track")
139+
AddOptionRTC(rebuildTrackMaxSharedFraction, float, 0.1f, "", 0, "Max fraction of shared clusters for rebuilt tracks")
139140
AddOptionRTC(trackFitRejectMode, int8_t, 5, "", 0, "0: no limit on rejection or missed hits, >0: break after n rejected hits, <0: reject at max -n hits")
140141
AddOptionRTC(rejectIFCLowRadiusCluster, uint8_t, 1, "", 0, "Reject clusters that get the IFC mask error during refit")
141142
AddOptionRTC(dEdxTruncLow, uint8_t, 2, "", 0, "Low truncation threshold, fraction of 128")
142143
AddOptionRTC(dEdxTruncHigh, uint8_t, 77, "", 0, "High truncation threshold, fraction of 128")
143144
AddOptionRTC(extrapolationTracking, int8_t, 1, "", 0, "Enable Extrapolation Tracking (prolong tracks to adjacent sectors to find short segments)")
144-
AddOptionRTC(disableRefitAttachment, uint8_t, 0, "", 0, "Bitmask to disable certain attachment steps during refit (1: attachment, 2: propagation, 4: loop following, 8: mirroring)")
145+
AddOptionRTC(disableRefitAttachment, uint8_t, 0, "", 0, "Bitmask to disable certain attachment steps during refit (1: attachment, 2: propagation, 4: loop following)")
145146
AddOptionRTC(rejectionStrategy, uint8_t, o2::gpu::GPUSettings::RejectionStrategyA, "", 0, "Enable rejection of TPC clusters for compression (0 = no, 1 = strategy A, 2 = strategy B)")
146147
AddOptionRTC(mergeLoopersAfterburner, uint8_t, 1, "", 0, "Run afterburner for additional looper merging")
147148
AddOptionRTC(compressionTypeMask, uint8_t, o2::gpu::GPUSettings::CompressionFull, "", 0, "TPC Compression mode bits (1=truncate charge/width LSB, 2=differences, 4=track-model)")

GPU/GPUTracking/Global/GPUChainTrackingDebugAndProfiling.cxx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,8 @@ void GPUChainTracking::PrintMemoryRelations()
187187
GPUInfo("MEMREL SectorTrackHits NCl %d NTrkH %d", processors()->tpcTrackers[i].NHitsTotal(), *processors()->tpcTrackers[i].NTrackHits());
188188
}
189189
if (processors()->tpcMerger.Memory()) {
190-
GPUInfo("MEMREL Tracks NCl %d NTrk %d", processors()->tpcMerger.NMaxClusters(), processors()->tpcMerger.NMergedTracks());
191-
GPUInfo("MEMREL TrackHitss NCl %d NTrkH %d", processors()->tpcMerger.NMaxClusters(), processors()->tpcMerger.NMergedTrackClusters());
190+
GPUInfo("MEMREL Tracks NCl %d NTrk %d", processors()->tpcMerger.NClusters(), processors()->tpcMerger.NMergedTracks());
191+
GPUInfo("MEMREL TrackHitss NCl %d NTrkH %d", processors()->tpcMerger.NClusters(), processors()->tpcMerger.NMergedTrackClusters());
192192
}
193193
}
194194

@@ -217,7 +217,7 @@ void GPUChainTracking::PrintKernelDebugOutput()
217217
void GPUChainTracking::PrintOutputStat()
218218
{
219219
int32_t nTracks = 0, nAttachedClusters = 0, nAttachedClustersFitted = 0, nAdjacentClusters = 0;
220-
uint32_t nCls = GetProcessingSettings().doublePipeline ? mIOPtrs.clustersNative->nClustersTotal : processors()->tpcMerger.NMaxClusters();
220+
uint32_t nCls = GetProcessingSettings().doublePipeline ? mIOPtrs.clustersNative->nClustersTotal : processors()->tpcMerger.NClusters();
221221
if (GetProcessingSettings().createO2Output > 1) {
222222
nTracks = mIOPtrs.nOutputTracksTPCO2;
223223
nAttachedClusters = mIOPtrs.nMergedTrackHits;

GPU/GPUTracking/Global/GPUChainTrackingMerger.cxx

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -195,12 +195,8 @@ int32_t GPUChainTracking::RunTPCTrackingMerger(bool synchronizeOutput)
195195
Merger.CheckCollectedTracks();
196196
}
197197

198-
uint32_t maxId = Merger.NMaxClusters();
199-
if (maxId > Merger.NMaxClusters()) {
200-
throw std::runtime_error("mNMaxClusters too small");
201-
}
202-
runKernel<GPUMemClean16>({{numBlocks, -ThreadCount(), 0, deviceType, RecoStep::TPCMerging}}, MergerShadow.SharedCount(), maxId * sizeof(*MergerShadow.SharedCount()));
203-
runKernel<GPUMemClean16>({{numBlocks, -ThreadCount(), 0, deviceType, RecoStep::TPCMerging}}, MergerShadow.ClusterAttachment(), maxId * sizeof(*MergerShadow.ClusterAttachment()));
198+
runKernel<GPUMemClean16>({{numBlocks, -ThreadCount(), 0, deviceType, RecoStep::TPCMerging}}, MergerShadow.SharedCount(), Merger.NClusters() * sizeof(*MergerShadow.SharedCount()));
199+
runKernel<GPUMemClean16>({{numBlocks, -ThreadCount(), 0, deviceType, RecoStep::TPCMerging}}, MergerShadow.ClusterAttachment(), Merger.NClusters() * sizeof(*MergerShadow.ClusterAttachment()));
204200
runKernel<GPUTPCGMMergerPrepareForFit, 0>(GetGridAuto(0, deviceType));
205201
CondWaitEvent(waitForTransfer, &mEvents->single);
206202
runKernel<GPUTPCGMMergerSortTracksQPt>(GetGridAuto(0, deviceType));
@@ -230,6 +226,16 @@ int32_t GPUChainTracking::RunTPCTrackingMerger(bool synchronizeOutput)
230226
}
231227
runKernel<GPUTPCGMMergerTrackFit>(doGPU ? GetGrid(Merger.NMergedTracks(), 0) : GetGridAuto(0), mergerSortTracks ? 1 : 0, 0);
232228
if (param().rec.tpc.rebuildTrackInFit) {
229+
runKernel<GPUMemClean16>({{numBlocks, -ThreadCount(), 0, deviceType, RecoStep::TPCMerging}}, MergerShadow.HitWeights(), Merger.NClusters() * sizeof(*MergerShadow.HitWeights()));
230+
runKernel<GPUTPCGMMergerHitWeights, GPUTPCGMMergerHitWeights::prepare>(doGPU ? GetGrid(Merger.NMergedTracks(), 0) : GetGridAuto(0), 0);
231+
for (int32_t i = 0; i < param().rec.tpc.rebuildTrackInFitClusterCandidates; i++) {
232+
runKernel<GPUTPCGMMergerHitWeights, GPUTPCGMMergerHitWeights::compute>(doGPU ? GetGrid(Merger.NMergedTracks(), 0) : GetGridAuto(0), i);
233+
if (i + 1 < param().rec.tpc.rebuildTrackInFitClusterCandidates) {
234+
runKernel<GPUTPCGMMergerHitWeights, GPUTPCGMMergerHitWeights::resolve1>(doGPU ? GetGrid(Merger.NMergedTracks(), 0) : GetGridAuto(0), i);
235+
}
236+
}
237+
runKernel<GPUTPCGMMergerHitWeights, GPUTPCGMMergerHitWeights::resolve2>(doGPU ? GetGrid(Merger.NMergedTracks(), 0) : GetGridAuto(0), 0);
238+
runKernel<GPUTPCGMMergerHitWeights, GPUTPCGMMergerHitWeights::resolveShared>(doGPU ? GetGrid(Merger.NMergedTracks(), 0) : GetGridAuto(0), 0);
233239
runKernel<GPUTPCGMMergerTrackFit>(doGPU ? GetGrid(Merger.NMergedTracks(), 0) : GetGridAuto(0), mergerSortTracks ? 1 : 0, 1);
234240
}
235241
runKernel<GPUTPCGMMergerFollowLoopers>(GetGridAuto(0));
@@ -268,7 +274,7 @@ int32_t GPUChainTracking::RunTPCTrackingMerger(bool synchronizeOutput)
268274
GPUMemCpy(RecoStep::TPCMerging, Merger.MergedTracksdEdx(), MergerShadow.MergedTracksdEdx(), Merger.NMergedTracks() * sizeof(*Merger.MergedTracksdEdx()), outputStream, 0);
269275
}
270276
GPUMemCpy(RecoStep::TPCMerging, Merger.Clusters(), MergerShadow.Clusters(), Merger.NMergedTrackClusters() * sizeof(*Merger.Clusters()), outputStream, 0);
271-
GPUMemCpy(RecoStep::TPCMerging, Merger.ClusterAttachment(), MergerShadow.ClusterAttachment(), Merger.NMaxClusters() * sizeof(*Merger.ClusterAttachment()), outputStream, 0);
277+
GPUMemCpy(RecoStep::TPCMerging, Merger.ClusterAttachment(), MergerShadow.ClusterAttachment(), Merger.NClusters() * sizeof(*Merger.ClusterAttachment()), outputStream, 0);
272278
}
273279
if (GetProcessingSettings().outputSharedClusterMap) {
274280
TransferMemoryResourceLinkToHost(RecoStep::TPCMerging, Merger.MemoryResOutputState(), outputStream, nullptr, waitEvent);
@@ -358,7 +364,7 @@ int32_t GPUChainTracking::RunTPCTrackingMerger(bool synchronizeOutput)
358364
}
359365

360366
if (GetProcessingSettings().debugLevel >= 2) {
361-
GPUInfo("TPC Merger Finished (output clusters %d / input clusters %d)", Merger.NMergedTrackClusters(), Merger.NClusters());
367+
GPUInfo("TPC Merger Finished (output clusters %d / input clusters %d)", Merger.NMergedTrackClusters(), Merger.NSectorHits());
362368
}
363369
return 0;
364370
}

GPU/GPUTracking/Global/GPUErrorCodes.h

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,16 @@ GPUCA_ERROR_CODE(13, ERROR_SECTORDATA_HITINROW_OVERFLOW, SectorRow, Value, Max)
3333
GPUCA_ERROR_CODE(14, ERROR_SECTORDATA_BIN_OVERFLOW, SectorRow, Value, Max)
3434
GPUCA_ERROR_CODE(15, ERROR_SECTORDATA_Z_OVERFLOW, Sector, Value)
3535
GPUCA_ERROR_CODE(16, ERROR_MERGER_HIT_OVERFLOW, Value, Max)
36-
GPUCA_ERROR_CODE(17, ERROR_MERGER_TRACK_OVERFLOW, Value, Max)
37-
GPUCA_ERROR_CODE(18, ERROR_COMPRESSION_ROW_HIT_OVERFLOW, SectorRow, Value, Max)
38-
GPUCA_ERROR_CODE(19, ERROR_LOOPER_MATCH_OVERFLOW, Value, Max)
39-
GPUCA_ERROR_CODE(20, ERROR_CF_PEAK_OVERFLOW, Sector, Value, Max)
40-
GPUCA_ERROR_CODE(21, ERROR_CF_CLUSTER_OVERFLOW, Sector, Value, Max)
41-
GPUCA_ERROR_CODE(22, ERROR_CF_ROW_CLUSTER_OVERFLOW, SectorRow, Value, Max)
42-
GPUCA_ERROR_CODE(23, ERROR_CF_GLOBAL_CLUSTER_OVERFLOW, SectorRow, Value, Max)
43-
GPUCA_ERROR_CODE(24, ERROR_DECOMPRESSION_ATTACHED_CLUSTER_OVERFLOW, SectorRow, Value, Max)
36+
GPUCA_ERROR_CODE(17, ERROR_MERGER_REBUILD_HIT_OVERFLOW, Value, Max)
37+
GPUCA_ERROR_CODE(18, ERROR_MERGER_TRACK_OVERFLOW, Value, Max)
38+
GPUCA_ERROR_CODE(19, ERROR_COMPRESSION_ROW_HIT_OVERFLOW, SectorRow, Value, Max)
39+
GPUCA_ERROR_CODE(20, ERROR_LOOPER_MATCH_OVERFLOW, Value, Max)
40+
GPUCA_ERROR_CODE(21, ERROR_CF_PEAK_OVERFLOW, Sector, Value, Max)
41+
GPUCA_ERROR_CODE(22, ERROR_CF_CLUSTER_OVERFLOW, Sector, Value, Max)
42+
GPUCA_ERROR_CODE(23, ERROR_CF_ROW_CLUSTER_OVERFLOW, SectorRow, Value, Max)
43+
GPUCA_ERROR_CODE(24, ERROR_CF_GLOBAL_CLUSTER_OVERFLOW, SectorRow, Value, Max)
44+
GPUCA_ERROR_CODE(25, ERROR_DECOMPRESSION_ATTACHED_CLUSTER_OVERFLOW, SectorRow, Value, Max)
4445
GPUCA_ERROR_CODE(25, MAX_OVERFLOW_ERROR_NUMBER) // Overflow errors are detected as errno <= MAX_OVERFLOW_ERROR_NUMBER
45-
4646
GPUCA_ERROR_CODE(26, ERROR_TPCZS_INVALID_ROW, SectorRow) // Data from invalid row is skipped
4747
GPUCA_ERROR_CODE(27, ERROR_TPCZS_INVALID_NADC, SectorCRU, SamplesInPage, SamplesWritten) // Invalid number of ADC samples in header, existing samples were decoded
4848
GPUCA_ERROR_CODE(28, ERROR_TPCZS_INCOMPLETE_HBF, SectorCRU, PacketCount, NextPacketCount) // Part of HBF is missing, decoding incomplete

0 commit comments

Comments
 (0)