@@ -1059,8 +1059,12 @@ int32_t GPUChainTracking::RunTPCClusterizer(bool synchronizeOutput)
10591059 return ;
10601060 }
10611061
1062- if (propagateMCLabels && fragment.index == 0 ) {
1063- clusterer.PrepareMC ();
1062+ if (propagateMCLabels) {
1063+ if (fragment.index == 0 ) {
1064+ // Must be only called on the first fragment as some buffers are used across the whole timeframe
1065+ clusterer.AllocMCBuffers ();
1066+ }
1067+ clusterer.InitMCBuffersForFragment ();
10641068 clusterer.mPinputLabels = digitsMC->v [iSector];
10651069 if (clusterer.mPinputLabels == nullptr ) {
10661070 GPUFatal (" MC label container missing, sector %d" , iSector);
@@ -1358,9 +1362,7 @@ int32_t GPUChainTracking::RunTPCClusterizer(bool synchronizeOutput)
13581362
13591363 if (doGPU && propagateMCLabels) {
13601364 TransferMemoryResourceLinkToHost (RecoStep::TPCClusterFinding, clusterer.mScratchId , lane);
1361- if (doGPU) {
1362- SynchronizeStream (lane);
1363- }
1365+ SynchronizeStream (lane);
13641366 runKernel<GPUTPCCFClusterizer>({GetGrid (clusterer.mPmemory ->counters .nClusters , lane, GPUReconstruction::krnlDeviceType::CPU ), {iSector}}, 1 ); // Computes MC labels
13651367 }
13661368 } // if (nRegularClusters != 0) {
@@ -1369,11 +1371,16 @@ int32_t GPUChainTracking::RunTPCClusterizer(bool synchronizeOutput)
13691371 // TODO: Move this right after CheckPadBaseline once tail zeroing is moved into this kernel.
13701372 if (rec ()->GetParam ().rec .tpc .hipTailFilter ) {
13711373 runKernel<GPUTPCCFHIPTailConnector>({GetGridBlk (GPUTPCGeometry::NROWS , lane), {iSector}});
1372- runKernel<GPUTPCCFHIPClusterizer>({GetGridBlk (GPUTPCGeometry::NROWS , lane), {iSector}});
1374+ runKernel<GPUTPCCFHIPClusterizer>({GetGridBlk (GPUTPCGeometry::NROWS , lane), {iSector}}, 0 );
13731375 if (doGPU && (nRegularClusters == 0 || GetProcessingSettings ().debugLevel >= 3 )) {
13741376 TransferMemoryResourceLinkToHost (RecoStep::TPCClusterFinding, clusterer.mMemoryId , lane);
13751377 SynchronizeStream (lane);
13761378 }
1379+ if (doGPU && propagateMCLabels) {
1380+ TransferMemoryResourceLinkToHost (RecoStep::TPCClusterFinding, clusterer.mScratchId , lane);
1381+ SynchronizeStream (lane);
1382+ runKernel<GPUTPCCFHIPClusterizer>({GetGrid (GPUTPCGeometry::NROWS , lane, GPUReconstruction::krnlDeviceType::CPU ), {iSector}}, 1 ); // Computes MC labels
1383+ }
13771384 }
13781385
13791386 bool hasClusters = nRegularClusters != 0 ;
@@ -1445,20 +1452,16 @@ int32_t GPUChainTracking::RunTPCClusterizer(bool synchronizeOutput)
14451452 }
14461453
14471454 if (not propagateMCLabels || not laneHasData[lane]) {
1448- assert (propagateMCLabels ? mcLinearLabels.header .size () == nClsTotal : true );
14491455 continue ;
14501456 }
14511457
14521458 runKernel<GPUTPCCFMCLabelFlattener, GPUTPCCFMCLabelFlattener::setRowOffsets>({GetGrid (GPUTPCGeometry::NROWS , lane, GPUReconstruction::krnlDeviceType::CPU ), {iSector}});
14531459 GPUTPCCFMCLabelFlattener::setGlobalOffsetsAndAllocate (clusterer, mcLinearLabels);
14541460 runKernel<GPUTPCCFMCLabelFlattener, GPUTPCCFMCLabelFlattener::flatten>({GetGrid (GPUTPCGeometry::NROWS , lane, GPUReconstruction::krnlDeviceType::CPU ), {iSector}}, &mcLinearLabels);
1455- clusterer.clearMCMemory ();
14561461 assert (propagateMCLabels ? mcLinearLabels.header .size () == nClsTotal : true );
14571462 }
1458- if (propagateMCLabels) {
1459- for (int32_t lane = 0 ; lane < maxLane; lane++) {
1460- processors ()->tpcClusterer [iSectorBase + lane].clearMCMemory ();
1461- }
1463+ for (int32_t lane = 0 ; lane < maxLane; lane++) {
1464+ processors ()->tpcClusterer [iSectorBase + lane].FreeMCBuffers ();
14621465 }
14631466 if (buildNativeHost && buildNativeGPU && anyLaneHasData) {
14641467 if (GetProcessingSettings ().delayedOutput ) {
0 commit comments