From e72ec87f07f7a328cc6f2a02b8dc479f594615cf Mon Sep 17 00:00:00 2001 From: Matej Roguljic Date: Wed, 23 Jul 2025 09:21:47 +0200 Subject: [PATCH 1/2] alpaka: remove all duplicate pixel hits --- .../plugins/alpaka/PixelClustering.h | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/alpaka/PixelClustering.h b/RecoLocalTracker/SiPixelClusterizer/plugins/alpaka/PixelClustering.h index 0440759a7de3e..07fa463b87bfc 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/alpaka/PixelClustering.h +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/alpaka/PixelClustering.h @@ -82,6 +82,12 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::pixelClustering { return Status{(status[index] >> shift) & mask}; } + ALPAKA_FN_ACC ALPAKA_FN_INLINE constexpr bool isDuplicate(uint32_t const* __restrict__ status, + uint16_t x, + uint16_t y) { + return getStatus(status, x, y) == kDuplicate; + } + // Record a pixel at the given coordinates and return the updated status. ALPAKA_FN_ACC ALPAKA_FN_INLINE Status promote(Acc1D const& acc, uint32_t* status, @@ -232,11 +238,19 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::pixelClustering { constexpr bool isPhase2 = std::is_base_of::value; if constexpr (not isPhase2) { // packed words array used to store the pixelStatus of each pixel - auto& image = alpaka::declareSharedVar(acc); + auto& status = alpaka::declareSharedVar(acc); if (lastPixel > 1) { for (uint32_t i : cms::alpakatools::independent_group_elements(acc, pixelStatus::size)) { - image[i] = 0; + status[i] = 0; + } + alpaka::syncBlockThreads(acc); + + for (uint32_t i : cms::alpakatools::independent_group_elements(acc, firstPixel, lastPixel)) { + // skip invalid pixels + if (digi_view[i].moduleId() == ::pixelClustering::invalidModuleId) + continue; + pixelStatus::promote(acc, status, digi_view[i].xx(), digi_view[i].yy()); } alpaka::syncBlockThreads(acc); @@ -244,9 +258,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::pixelClustering { // skip invalid pixels if (digi_view[i].moduleId() == ::pixelClustering::invalidModuleId) continue; - auto status = pixelStatus::promote(acc, image, digi_view[i].xx(), digi_view[i].yy()); - if (pixelStatus::kDuplicate == status) { - // mark the duplicate pixel as invalid + if (pixelStatus::isDuplicate(status, digi_view[i].xx(), digi_view[i].yy())) { digi_view[i].moduleId() = ::pixelClustering::invalidModuleId; digi_view[i].rawIdArr() = 0; } From dc7b444a28bdc9d8bbb4a2231b822e1a564e76cf Mon Sep 17 00:00:00 2001 From: Matej Roguljic Date: Thu, 24 Jul 2025 10:25:41 +0200 Subject: [PATCH 2/2] rename back status -> image --- .../SiPixelClusterizer/plugins/alpaka/PixelClustering.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/alpaka/PixelClustering.h b/RecoLocalTracker/SiPixelClusterizer/plugins/alpaka/PixelClustering.h index 07fa463b87bfc..920dc85855556 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/alpaka/PixelClustering.h +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/alpaka/PixelClustering.h @@ -238,11 +238,11 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::pixelClustering { constexpr bool isPhase2 = std::is_base_of::value; if constexpr (not isPhase2) { // packed words array used to store the pixelStatus of each pixel - auto& status = alpaka::declareSharedVar(acc); + auto& image = alpaka::declareSharedVar(acc); if (lastPixel > 1) { for (uint32_t i : cms::alpakatools::independent_group_elements(acc, pixelStatus::size)) { - status[i] = 0; + image[i] = 0; } alpaka::syncBlockThreads(acc); @@ -250,7 +250,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::pixelClustering { // skip invalid pixels if (digi_view[i].moduleId() == ::pixelClustering::invalidModuleId) continue; - pixelStatus::promote(acc, status, digi_view[i].xx(), digi_view[i].yy()); + pixelStatus::promote(acc, image, digi_view[i].xx(), digi_view[i].yy()); } alpaka::syncBlockThreads(acc); @@ -258,7 +258,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::pixelClustering { // skip invalid pixels if (digi_view[i].moduleId() == ::pixelClustering::invalidModuleId) continue; - if (pixelStatus::isDuplicate(status, digi_view[i].xx(), digi_view[i].yy())) { + if (pixelStatus::isDuplicate(image, digi_view[i].xx(), digi_view[i].yy())) { digi_view[i].moduleId() = ::pixelClustering::invalidModuleId; digi_view[i].rawIdArr() = 0; }