From 4f35cf5e8ca9ac59799f1665a7348a96c8644a45 Mon Sep 17 00:00:00 2001 From: David Rohr Date: Tue, 9 Sep 2025 21:04:38 +0200 Subject: [PATCH 1/2] GPU TPC: Make buffer size estimation more robust and improve error message in GPUWorkflow --- GPU/GPUTracking/SectorTracker/GPUTPCTracker.cxx | 9 +++++++++ GPU/Workflow/src/GPUWorkflowSpec.cxx | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/GPU/GPUTracking/SectorTracker/GPUTPCTracker.cxx b/GPU/GPUTracking/SectorTracker/GPUTPCTracker.cxx index e923e126e1841..c19e96f1879a8 100644 --- a/GPU/GPUTracking/SectorTracker/GPUTPCTracker.cxx +++ b/GPU/GPUTracking/SectorTracker/GPUTPCTracker.cxx @@ -143,6 +143,15 @@ void GPUTPCTracker::SetMaxData(const GPUTrackingInOutPointers& io) mNMaxTracklets = mRec->MemoryScalers()->NTPCTracklets(mData.NumberOfHits()); mNMaxRowHits = mRec->MemoryScalers()->NTPCTrackletHits(mData.NumberOfHits()); mNMaxTracks = mRec->MemoryScalers()->NTPCSectorTracks(mData.NumberOfHits()); + if (io.clustersNative) { + uint32_t sectorOffset = mISector >= GPUCA_NSECTORS / 2 ? GPUCA_NSECTORS / 2 : 0; + uint32_t nextSector = (mISector + 1) % (GPUCA_NSECTORS / 2) + sectorOffset; + uint32_t prevSector = (mISector + GPUCA_NSECTORS - 1) % (GPUCA_NSECTORS / 2) + sectorOffset; + uint32_t nExtrapolationTracks = mRec->MemoryScalers()->NTPCSectorTracks((io.clustersNative->nClustersSector[nextSector] + io.clustersNative->nClustersSector[prevSector]) / 2) / 2; + if (nExtrapolationTracks > mNMaxTracks) { + mNMaxTracks = nExtrapolationTracks; + } + } mNMaxTrackHits = mRec->MemoryScalers()->NTPCSectorTrackHits(mData.NumberOfHits(), mRec->GetProcessingSettings().tpcInputWithClusterRejection); if (mRec->getGPUParameters(mRec->GetRecoStepsGPU() & GPUDataTypes::RecoStep::TPCSectorTracking).par_SORT_STARTHITS) { diff --git a/GPU/Workflow/src/GPUWorkflowSpec.cxx b/GPU/Workflow/src/GPUWorkflowSpec.cxx index 51e3f252811c3..2642ff3ee1ebc 100644 --- a/GPU/Workflow/src/GPUWorkflowSpec.cxx +++ b/GPU/Workflow/src/GPUWorkflowSpec.cxx @@ -900,7 +900,7 @@ void GPURecoWorkflowSpec::run(ProcessingContext& pc) } createEmptyOutput = !mConfParam->partialOutputForNonFatalErrors; } else { - throw std::runtime_error("GPU Reconstruction error: error code " + std::to_string(retVal)); + LOG(fatal) << "GPU Reconstruction aborted with error code " << retVal << " - errors are not ignored - terminating"; } } From 20bb19069a6b93b0e5db02b0e4d4eda2ba106ccb Mon Sep 17 00:00:00 2001 From: David Rohr Date: Tue, 9 Sep 2025 14:58:14 +0200 Subject: [PATCH 2/2] GPU TPC dEdx: Fix out of bounds access --- GPU/GPUTracking/dEdx/GPUdEdx.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GPU/GPUTracking/dEdx/GPUdEdx.h b/GPU/GPUTracking/dEdx/GPUdEdx.h index e556fd3845d42..9e1727d4988ad 100644 --- a/GPU/GPUTracking/dEdx/GPUdEdx.h +++ b/GPU/GPUTracking/dEdx/GPUdEdx.h @@ -118,7 +118,7 @@ GPUdnii() void GPUdEdx::fillCluster(float qtot, float qmax, int32_t padRow, uint const float tanTheta = CAMath::Sqrt(tgl2 * sec2); // getting the topology correction - const uint32_t padPos = CAMath::Float2UIntRn(pad); // position of the pad is shifted half a pad ( pad=3 -> centre position of third pad) + const uint32_t padPos = CAMath::Max(GPUTPCGeometry::NPads(padRow) - 1, CAMath::Float2UIntRn(pad)); // position of the pad is shifted half a pad ( pad=3 -> centre position of third pad) const float absRelPad = CAMath::Abs(pad - padPos); const int32_t region = geo.GetRegion(padRow); z = CAMath::Abs(z);