From bd461fc8823aefdc3b12a3af51ff2c7fe5d102f9 Mon Sep 17 00:00:00 2001 From: adriano Date: Sun, 2 Nov 2025 09:59:08 +0100 Subject: [PATCH 1/3] Proper clamping for CA doublets --- .../plugins/alpaka/CAHitNtupletGeneratorKernels.dev.cc | 4 ++-- .../PixelSeeding/plugins/alpaka/CAPixelDoubletsAlgos.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/RecoTracker/PixelSeeding/plugins/alpaka/CAHitNtupletGeneratorKernels.dev.cc b/RecoTracker/PixelSeeding/plugins/alpaka/CAHitNtupletGeneratorKernels.dev.cc index 65c02aa783f13..06307f38d2481 100644 --- a/RecoTracker/PixelSeeding/plugins/alpaka/CAHitNtupletGeneratorKernels.dev.cc +++ b/RecoTracker/PixelSeeding/plugins/alpaka/CAHitNtupletGeneratorKernels.dev.cc @@ -57,8 +57,8 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { #ifdef GPU_DEBUG std::cout << "Allocation for tuple building with: " << std::endl; std::cout << "- nHits = " << nHits << std::endl; - std::cout << "- maxDoublets = " << maxTuples << std::endl; - std::cout << "- maxTracks = " << maxDoublets << std::endl; + std::cout << "- maxDoublets = " << maxDoublets << std::endl; + std::cout << "- maxTracks = " << maxTuples << std::endl; std::cout << "- nCellsToCells = " << nCellsToCells << std::endl; std::cout << "- nHitsToCells = " << nHitsToCells << std::endl; diff --git a/RecoTracker/PixelSeeding/plugins/alpaka/CAPixelDoubletsAlgos.h b/RecoTracker/PixelSeeding/plugins/alpaka/CAPixelDoubletsAlgos.h index 871212e810b64..93c5d0427660f 100644 --- a/RecoTracker/PixelSeeding/plugins/alpaka/CAPixelDoubletsAlgos.h +++ b/RecoTracker/PixelSeeding/plugins/alpaka/CAPixelDoubletsAlgos.h @@ -420,9 +420,9 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::caPixelDoublets { } auto ind = alpaka::atomicAdd(acc, nCells, 1u, alpaka::hierarchy::Blocks{}); - if (ind >= maxNumOfDoublets) { + if (ind >= maxNumOfDoublets or ind >= uint32_t(outerHitHisto->capacity())) { #ifdef CA_WARNINGS - printf("Warning!!!! Too many cells (limit = %d)!\n", maxNumOfDoublets); + printf("Warning!!!! Too many cells (maxNumOfDoublets = %d - nHitsToCell = %d)!\n", maxNumOfDoublets, outerHitHisto->capacity()); #endif alpaka::atomicSub(acc, nCells, 1u, alpaka::hierarchy::Blocks{}); break; From d303a4169e0b8d7ea351c7a2d75eeb7406c255fa Mon Sep 17 00:00:00 2001 From: adriano Date: Sun, 2 Nov 2025 15:16:02 +0100 Subject: [PATCH 2/3] Not running the CA if the starting layer is empty --- .../plugins/alpaka/CAHitNtuplet.cc | 49 ++++++++++++++++--- .../CAHitNtupletGeneratorKernels.dev.cc | 1 + 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/RecoTracker/PixelSeeding/plugins/alpaka/CAHitNtuplet.cc b/RecoTracker/PixelSeeding/plugins/alpaka/CAHitNtuplet.cc index 236e3e53a1825..d15f936953415 100644 --- a/RecoTracker/PixelSeeding/plugins/alpaka/CAHitNtuplet.cc +++ b/RecoTracker/PixelSeeding/plugins/alpaka/CAHitNtuplet.cc @@ -15,6 +15,7 @@ #include "FWCore/Utilities/interface/ESGetToken.h" #include "FWCore/Utilities/interface/InputTag.h" #include "FWCore/Utilities/interface/RunningAverage.h" +#include "FWCore/MessageLogger/interface/MessageLogger.h" #include "HeterogeneousCore/AlpakaCore/interface/alpaka/EDGetToken.h" #include "HeterogeneousCore/AlpakaCore/interface/alpaka/EDPutToken.h" #include "HeterogeneousCore/AlpakaCore/interface/alpaka/Event.h" @@ -358,14 +359,50 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { auto const& geometry = runCache()->get(iEvent.queue()); auto const& hits = iEvent.get(tokenHit_); - std::array nHitsV = {{double(hits.nHits())}}; - std::array emptyV; + /// Don't bother if no hits on BPix1 and no good graph for that + /// (so no staring pair without BPix1 as first layer). + /// TODO: this could be extended to a more general check for + /// no hits on any of the starting layers. + + bool hitsOnBPix1 = hits.offsetBPIX2() > 0; + bool startNoBPix1 = hitsOnBPix1; // one would suffice, two for readability + if (not hitsOnBPix1) + { + startNoBPix1 = false; + for (const unsigned int& i : globalCache()->startingPairs_) + { + if(globalCache()->pairGraph_[2 * i] > 0) + { + startNoBPix1 = true; + break; + } + } + } + + if(startNoBPix1) + { + std::array nHitsV = {{double(hits.nHits())}}; + std::array emptyV; - uint32_t const maxTuples = maxNumberOfTuples_.evaluate(nHitsV, emptyV); - uint32_t const maxDoublets = maxNumberOfDoublets_.evaluate(nHitsV, emptyV); + uint32_t const maxTuples = maxNumberOfTuples_.evaluate(nHitsV, emptyV); + uint32_t const maxDoublets = maxNumberOfDoublets_.evaluate(nHitsV, emptyV); - iEvent.emplace(tokenTrack_, - deviceAlgo_.makeTuplesAsync(hits, geometry, bf, maxDoublets, maxTuples, iEvent.queue())); + iEvent.emplace(tokenTrack_, + deviceAlgo_.makeTuplesAsync(hits, geometry, bf, maxDoublets, maxTuples, iEvent.queue())); + + } + else + { + edm::LogWarning("CAHitNtupletAlpaka") << "No hit on BPix1 (" << hits.offsetBPIX2() << ") and all the starting pairs has BPix1 as inner layer.\nIt's useless to run the CA. Returning with 0 tracks!"; + auto& queue = iEvent.queue(); + const auto device = alpaka::getDev(queue); + reco::TracksSoACollection tracks({{0,0}}, queue); + auto ntracks_d = cms::alpakatools::make_device_view(device, tracks.view().nTracks()); + alpaka::memset(queue, ntracks_d, 0); + iEvent.emplace(tokenTrack_,std::move(tracks)); + } + + } using CAHitNtupletAlpakaPhase1 = CAHitNtupletAlpaka; diff --git a/RecoTracker/PixelSeeding/plugins/alpaka/CAHitNtupletGeneratorKernels.dev.cc b/RecoTracker/PixelSeeding/plugins/alpaka/CAHitNtupletGeneratorKernels.dev.cc index 06307f38d2481..3b07ca6ebe1c2 100644 --- a/RecoTracker/PixelSeeding/plugins/alpaka/CAHitNtupletGeneratorKernels.dev.cc +++ b/RecoTracker/PixelSeeding/plugins/alpaka/CAHitNtupletGeneratorKernels.dev.cc @@ -57,6 +57,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { #ifdef GPU_DEBUG std::cout << "Allocation for tuple building with: " << std::endl; std::cout << "- nHits = " << nHits << std::endl; + std::cout << "- outerHits = " << outerHits << std::endl; std::cout << "- maxDoublets = " << maxDoublets << std::endl; std::cout << "- maxTracks = " << maxTuples << std::endl; From 48e154facb8268744c02c29e40f6a8c1407a8984 Mon Sep 17 00:00:00 2001 From: adriano Date: Mon, 3 Nov 2025 09:49:45 +0100 Subject: [PATCH 3/3] Code formats --- .../plugins/alpaka/CAHitNtuplet.cc | 34 ++++++++----------- .../plugins/alpaka/CAPixelDoubletsAlgos.h | 4 ++- 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/RecoTracker/PixelSeeding/plugins/alpaka/CAHitNtuplet.cc b/RecoTracker/PixelSeeding/plugins/alpaka/CAHitNtuplet.cc index d15f936953415..ff6880e5504b0 100644 --- a/RecoTracker/PixelSeeding/plugins/alpaka/CAHitNtuplet.cc +++ b/RecoTracker/PixelSeeding/plugins/alpaka/CAHitNtuplet.cc @@ -361,26 +361,22 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { /// Don't bother if no hits on BPix1 and no good graph for that /// (so no staring pair without BPix1 as first layer). - /// TODO: this could be extended to a more general check for + /// TODO: this could be extended to a more general check for /// no hits on any of the starting layers. - bool hitsOnBPix1 = hits.offsetBPIX2() > 0; - bool startNoBPix1 = hitsOnBPix1; // one would suffice, two for readability - if (not hitsOnBPix1) - { + bool hitsOnBPix1 = hits.offsetBPIX2() > 0; + bool startNoBPix1 = hitsOnBPix1; // one would suffice, two for readability + if (not hitsOnBPix1) { startNoBPix1 = false; - for (const unsigned int& i : globalCache()->startingPairs_) - { - if(globalCache()->pairGraph_[2 * i] > 0) - { + for (const unsigned int& i : globalCache()->startingPairs_) { + if (globalCache()->pairGraph_[2 * i] > 0) { startNoBPix1 = true; break; } } } - if(startNoBPix1) - { + if (startNoBPix1) { std::array nHitsV = {{double(hits.nHits())}}; std::array emptyV; @@ -388,21 +384,19 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { uint32_t const maxDoublets = maxNumberOfDoublets_.evaluate(nHitsV, emptyV); iEvent.emplace(tokenTrack_, - deviceAlgo_.makeTuplesAsync(hits, geometry, bf, maxDoublets, maxTuples, iEvent.queue())); + deviceAlgo_.makeTuplesAsync(hits, geometry, bf, maxDoublets, maxTuples, iEvent.queue())); - } - else - { - edm::LogWarning("CAHitNtupletAlpaka") << "No hit on BPix1 (" << hits.offsetBPIX2() << ") and all the starting pairs has BPix1 as inner layer.\nIt's useless to run the CA. Returning with 0 tracks!"; + } else { + edm::LogWarning("CAHitNtupletAlpaka") << "No hit on BPix1 (" << hits.offsetBPIX2() + << ") and all the starting pairs has BPix1 as inner layer.\nIt's useless " + "to run the CA. Returning with 0 tracks!"; auto& queue = iEvent.queue(); const auto device = alpaka::getDev(queue); - reco::TracksSoACollection tracks({{0,0}}, queue); + reco::TracksSoACollection tracks({{0, 0}}, queue); auto ntracks_d = cms::alpakatools::make_device_view(device, tracks.view().nTracks()); alpaka::memset(queue, ntracks_d, 0); - iEvent.emplace(tokenTrack_,std::move(tracks)); + iEvent.emplace(tokenTrack_, std::move(tracks)); } - - } using CAHitNtupletAlpakaPhase1 = CAHitNtupletAlpaka; diff --git a/RecoTracker/PixelSeeding/plugins/alpaka/CAPixelDoubletsAlgos.h b/RecoTracker/PixelSeeding/plugins/alpaka/CAPixelDoubletsAlgos.h index 93c5d0427660f..ef97d1e6f74c7 100644 --- a/RecoTracker/PixelSeeding/plugins/alpaka/CAPixelDoubletsAlgos.h +++ b/RecoTracker/PixelSeeding/plugins/alpaka/CAPixelDoubletsAlgos.h @@ -422,7 +422,9 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::caPixelDoublets { auto ind = alpaka::atomicAdd(acc, nCells, 1u, alpaka::hierarchy::Blocks{}); if (ind >= maxNumOfDoublets or ind >= uint32_t(outerHitHisto->capacity())) { #ifdef CA_WARNINGS - printf("Warning!!!! Too many cells (maxNumOfDoublets = %d - nHitsToCell = %d)!\n", maxNumOfDoublets, outerHitHisto->capacity()); + printf("Warning!!!! Too many cells (maxNumOfDoublets = %d - nHitsToCell = %d)!\n", + maxNumOfDoublets, + outerHitHisto->capacity()); #endif alpaka::atomicSub(acc, nCells, 1u, alpaka::hierarchy::Blocks{}); break;