From 0f4cd1e99b52520fcdb756c5da993072d6545f3d Mon Sep 17 00:00:00 2001 From: Felix Schlepper Date: Mon, 27 Apr 2026 16:37:47 +0200 Subject: [PATCH 1/3] ITS: GPU: try to fix illegal access Signed-off-by: Felix Schlepper --- .../ITSMFT/ITS/tracking/GPU/cuda/TrackerTraitsGPU.cxx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Detectors/ITSMFT/ITS/tracking/GPU/cuda/TrackerTraitsGPU.cxx b/Detectors/ITSMFT/ITS/tracking/GPU/cuda/TrackerTraitsGPU.cxx index 0359f2cfb0d03..67b6b0bf5cdfe 100644 --- a/Detectors/ITSMFT/ITS/tracking/GPU/cuda/TrackerTraitsGPU.cxx +++ b/Detectors/ITSMFT/ITS/tracking/GPU/cuda/TrackerTraitsGPU.cxx @@ -209,16 +209,22 @@ void TrackerTraitsGPU::computeLayerCells(const int iteration) this->mTrkParams[iteration].LayerxX0, mTimeFrameGPU->getStreams()); } + mTimeFrameGPU->syncStreams(false); } template void TrackerTraitsGPU::findCellsNeighbours(const int iteration) { for (int iLayer{0}; iLayer < this->mTrkParams[iteration].NeighboursPerRoad(); ++iLayer) { + if (iLayer > 0) { + // Previous layer updates levels in this layer's cells. + mTimeFrameGPU->waitEvent(iLayer, iLayer - 1); + } const int currentLayerCellsNum{static_cast(mTimeFrameGPU->getNCells()[iLayer])}; const int nextLayerCellsNum{static_cast(mTimeFrameGPU->getNCells()[iLayer + 1])}; if (!nextLayerCellsNum || !currentLayerCellsNum) { mTimeFrameGPU->getNNeighbours()[iLayer] = 0; + mTimeFrameGPU->recordEvent(iLayer); continue; } mTimeFrameGPU->createNeighboursIndexTablesDevice(iLayer); @@ -239,6 +245,7 @@ void TrackerTraitsGPU::findCellsNeighbours(const int iteration) mTimeFrameGPU->getStream(iLayer)); mTimeFrameGPU->createNeighboursDevice(iLayer); if (mTimeFrameGPU->getNNeighbours()[iLayer] == 0) { + mTimeFrameGPU->recordEvent(iLayer); continue; } computeCellNeighboursHandler(mTimeFrameGPU->getDeviceArrayCells(), @@ -259,6 +266,7 @@ void TrackerTraitsGPU::findCellsNeighbours(const int iteration) mTimeFrameGPU->getArrayNNeighbours()[iLayer], mTimeFrameGPU->getStream(iLayer), mTimeFrameGPU->getFrameworkAllocator()); + mTimeFrameGPU->recordEvent(iLayer); } mTimeFrameGPU->syncStreams(false); } From 44c45da37bcca82892d054ccfde9b2c96ea6eed7 Mon Sep 17 00:00:00 2001 From: Felix Schlepper Date: Tue, 28 Apr 2026 10:41:44 +0200 Subject: [PATCH 2/3] ITS: account in selectReseedMidLayer for possible holes Signed-off-by: Felix Schlepper --- .../include/ITStracking/TrackHelpers.h | 39 +++++++++++-------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackHelpers.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackHelpers.h index 2224495607ee1..a8cddd1190c16 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackHelpers.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackHelpers.h @@ -29,19 +29,22 @@ namespace o2::its::track { -GPUdi() int selectReseedMidLayer(int minLayer, int maxLayer, int nLayers, const float* layerRadii) +// Find the populated interior layer closest to the radial midpoint. +// If no layer can be found, return constants::UnusedIndex. +// Should minimize the sagitta bias. +template +GPUdi() int selectReseedMidLayer(int minLayer, int maxLayer, const float* layerRadii, const TrackSeed& seed) { - if (maxLayer - minLayer == nLayers - 1) { - return (minLayer + maxLayer) / 2; - } - int midLayer = minLayer + 1; + int midLayer = constants::UnusedIndex; + float distanceToMidR = layerRadii[NLayers - 1]; // midpoint cannot be last layer const float midR = 0.5f * (layerRadii[maxLayer] + layerRadii[minLayer]); - float distanceToMidR = o2::gpu::CAMath::Abs(midR - layerRadii[midLayer]); - for (int iLayer = midLayer + 1; iLayer < maxLayer; ++iLayer) { // find the midpoint as closest to the midR - const float distance = o2::gpu::CAMath::Abs(midR - layerRadii[iLayer]); - if (distance < distanceToMidR) { - midLayer = iLayer; - distanceToMidR = distance; + for (int iLayer = minLayer + 1; iLayer < maxLayer; ++iLayer) { + if (seed.getCluster(iLayer) != constants::UnusedIndex) { + const float distance = o2::gpu::CAMath::Abs(midR - layerRadii[iLayer]); + if (distance < distanceToMidR) { // keep the smaller-radius layer on ties + midLayer = iLayer; + distanceToMidR = distance; + } } } return midLayer; @@ -106,12 +109,14 @@ GPUdi() TrackITSExt seedTrackForRefit(const TrackSeed& seed, } const int ncl = temporaryTrack.getNClusters(); - if (ncl < reseedIfShorter && ncl > 1) { - const int lrMid = selectReseedMidLayer(lrMin, lrMax, NLayers, layerRadii); - const auto& cluster0TF = foundTrackingFrameInfo[lrMin][seed.getCluster(lrMin)]; - const auto& cluster1GL = unsortedClusters[lrMid][seed.getCluster(lrMid)]; - const auto& cluster2GL = unsortedClusters[lrMax][seed.getCluster(lrMax)]; - temporaryTrack.getParamIn() = buildTrackSeed(cluster2GL, cluster1GL, cluster0TF, bz, true); + if (ncl < reseedIfShorter && ncl > 2) { + const int lrMid = selectReseedMidLayer(lrMin, lrMax, layerRadii, seed); + if (lrMid != constants::UnusedIndex) { + const auto& cluster0TF = foundTrackingFrameInfo[lrMin][seed.getCluster(lrMin)]; + const auto& cluster1GL = unsortedClusters[lrMid][seed.getCluster(lrMid)]; + const auto& cluster2GL = unsortedClusters[lrMax][seed.getCluster(lrMax)]; + temporaryTrack.getParamIn() = buildTrackSeed(cluster2GL, cluster1GL, cluster0TF, bz, true); + } } resetTrackCovariance(temporaryTrack); From bd75ca2bd6ce9ecffe1e20d8a4b24275420c8679 Mon Sep 17 00:00:00 2001 From: Felix Schlepper Date: Fri, 1 May 2026 15:05:39 +0200 Subject: [PATCH 3/3] ITS: do not use NAN in helpers for new ROCm fixes: /home/fschlepp/alice/sw/SOURCES/O2/dev_head/0/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackHelpers.h:65:60: warning: use of NaN is undefined behavior due to the currently enabled floating-point options [-Wnan-infinity-disabled] 65 | float ca = NAN, sa = NAN, snp = NAN, q2pt = NAN, q2pt2 = NAN; | ^~~ /opt/rocm-7.1.1/lib/llvm/lib/clang/20/include/float.h:174:16: note: expanded from macro 'NAN' 174 | # define NAN (__builtin_nanf("")) Signed-off-by: Felix Schlepper --- .../ITSMFT/ITS/tracking/include/ITStracking/TrackHelpers.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackHelpers.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackHelpers.h index a8cddd1190c16..885cb0f2b9ca5 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackHelpers.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackHelpers.h @@ -62,7 +62,7 @@ GPUdi() o2::track::TrackParCov buildTrackSeed(const Cluster& cluster1, const float bz, const bool reverse = false) { - float ca = NAN, sa = NAN, snp = NAN, q2pt = NAN, q2pt2 = NAN; + float ca = constants::UnsetValue, sa = constants::UnsetValue, snp = constants::UnsetValue, q2pt = constants::UnsetValue, q2pt2 = constants::UnsetValue; o2::gpu::CAMath::SinCos(tf3.alphaTrackingFrame, sa, ca); const float sign = reverse ? -1.f : 1.f; const float x1 = (cluster1.xCoordinate * ca) + (cluster1.yCoordinate * sa);