Skip to content

Commit ac2e345

Browse files
ariostasGNiendorf
andcommitted
Add Low pT Occupancies
Co-authored-by: Gavin Niendorf <[email protected]>
1 parent 3d9a983 commit ac2e345

File tree

6 files changed

+755
-222
lines changed

6 files changed

+755
-222
lines changed

RecoTracker/LSTCore/src/alpaka/LSTEvent.dev.cc

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,8 @@ void LSTEvent::addPixelSegmentToEvent(std::vector<unsigned int> const& hitIndice
202202
createMDArrayRangesGPU_workDiv,
203203
CreateMDArrayRangesGPU{},
204204
modules_.const_view<ModulesSoA>(),
205-
rangesDC_->view());
205+
rangesDC_->view(),
206+
ptCut_);
206207

207208
auto nTotalMDs_buf_h = cms::alpakatools::make_host_buffer<unsigned int>(queue_);
208209
auto nTotalMDs_buf_d = cms::alpakatools::make_device_view(queue_, rangesOccupancy.nTotalMDs());
@@ -233,7 +234,8 @@ void LSTEvent::addPixelSegmentToEvent(std::vector<unsigned int> const& hitIndice
233234
CreateSegmentArrayRanges{},
234235
modules_.const_view<ModulesSoA>(),
235236
rangesDC_->view(),
236-
miniDoubletsDC_->const_view<MiniDoubletsSoA>());
237+
miniDoubletsDC_->const_view<MiniDoubletsSoA>(),
238+
ptCut_);
237239

238240
auto rangesOccupancy = rangesDC_->view();
239241
auto nTotalSegments_view_h = cms::alpakatools::make_host_view(nTotalSegments_);
@@ -346,7 +348,8 @@ void LSTEvent::createMiniDoublets() {
346348
createMDArrayRangesGPU_workDiv,
347349
CreateMDArrayRangesGPU{},
348350
modules_.const_view<ModulesSoA>(),
349-
rangesDC_->view());
351+
rangesDC_->view(),
352+
ptCut_);
350353

351354
auto nTotalMDs_buf_h = cms::alpakatools::make_host_buffer<unsigned int>(queue_);
352355
auto nTotalMDs_buf_d = cms::alpakatools::make_device_view(queue_, rangesOccupancy.nTotalMDs());
@@ -454,7 +457,8 @@ void LSTEvent::createTriplets() {
454457
CreateTripletArrayRanges{},
455458
modules_.const_view<ModulesSoA>(),
456459
rangesDC_->view(),
457-
segmentsDC_->const_view<SegmentsOccupancySoA>());
460+
segmentsDC_->const_view<SegmentsOccupancySoA>(),
461+
ptCut_);
458462

459463
// TODO: Why are we pulling this back down only to put it back on the device in a new struct?
460464
auto rangesOccupancy = rangesDC_->view();
@@ -857,7 +861,8 @@ void LSTEvent::createQuintuplets() {
857861
CreateEligibleModulesListForQuintuplets{},
858862
modules_.const_view<ModulesSoA>(),
859863
tripletsDC_->const_view<TripletsOccupancySoA>(),
860-
rangesDC_->view());
864+
rangesDC_->view(),
865+
ptCut_);
861866

862867
auto nEligibleT5Modules_buf = cms::alpakatools::make_host_buffer<uint16_t>(queue_);
863868
auto nTotalQuintuplets_buf = cms::alpakatools::make_host_buffer<unsigned int>(queue_);

RecoTracker/LSTCore/src/alpaka/MiniDoublet.h

Lines changed: 60 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -743,7 +743,8 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst {
743743
acc, &mdsOccupancy.totOccupancyMDs()[lowerModuleIndex], 1u, alpaka::hierarchy::Threads{});
744744
if (totOccupancyMDs >= (ranges.miniDoubletModuleOccupancy()[lowerModuleIndex])) {
745745
#ifdef WARNINGS
746-
printf("Mini-doublet excess alert! Module index = %d\n", lowerModuleIndex);
746+
printf(
747+
"Mini-doublet excess alert! Module index = %d, Occupancy = %d\n", lowerModuleIndex, totOccupancyMDs);
747748
#endif
748749
} else {
749750
int mdModuleIndex =
@@ -773,9 +774,38 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst {
773774
}
774775
};
775776

777+
// Helper function to determine eta bin for occupancies
778+
ALPAKA_FN_ACC ALPAKA_FN_INLINE int getEtaBin(const float module_eta) {
779+
if (module_eta < 0.75f)
780+
return 0;
781+
else if (module_eta < 1.5f)
782+
return 1;
783+
else if (module_eta < 2.25f)
784+
return 2;
785+
else if (module_eta < 3.0f)
786+
return 3;
787+
return -1;
788+
}
789+
790+
// Helper function to determine category number for occupancies
791+
ALPAKA_FN_ACC ALPAKA_FN_INLINE int getCategoryNumber(const short module_layers,
792+
const short module_subdets,
793+
const short module_rings) {
794+
if (module_subdets == Barrel) {
795+
return (module_layers <= 3) ? 0 : 1;
796+
} else if (module_subdets == Endcap) {
797+
if (module_layers <= 2) {
798+
return (module_rings >= 11) ? 2 : 3;
799+
} else {
800+
return (module_rings >= 8) ? 2 : 3;
801+
}
802+
}
803+
return -1;
804+
}
805+
776806
struct CreateMDArrayRangesGPU {
777807
template <typename TAcc>
778-
ALPAKA_FN_ACC void operator()(TAcc const& acc, ModulesConst modules, ObjectRanges ranges) const {
808+
ALPAKA_FN_ACC void operator()(TAcc const& acc, ModulesConst modules, ObjectRanges ranges, const float ptCut) const {
779809
// implementation is 1D with a single block
780810
static_assert(std::is_same_v<TAcc, ALPAKA_ACCELERATOR_NAMESPACE::Acc1D>, "Should be Acc1D");
781811
ALPAKA_ASSERT_ACC((alpaka::getWorkDiv<alpaka::Grid, alpaka::Blocks>(acc)[0] == 1));
@@ -790,67 +820,43 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst {
790820
}
791821
alpaka::syncBlockThreads(acc);
792822

823+
// Occupancy matrix for 0.8 GeV pT Cut
824+
constexpr int p08_occupancy_matrix[4][4] = {
825+
{49, 42, 37, 41}, // category 0
826+
{100, 100, 0, 0}, // category 1
827+
{0, 16, 19, 0}, // category 2
828+
{0, 14, 20, 25} // category 3
829+
};
830+
831+
// Occupancy matrix for 0.6 GeV pT Cut, 99.99%
832+
constexpr int p06_occupancy_matrix[4][4] = {
833+
{60, 57, 54, 48}, // category 0
834+
{259, 195, 0, 0}, // category 1
835+
{0, 23, 28, 0}, // category 2
836+
{0, 25, 25, 33} // category 3
837+
};
838+
839+
// Select the appropriate occupancy matrix based on ptCut
840+
const auto& occupancy_matrix = (ptCut < 0.8f) ? p06_occupancy_matrix : p08_occupancy_matrix;
841+
793842
for (uint16_t i = globalThreadIdx[0]; i < modules.nLowerModules(); i += gridThreadExtent[0]) {
794843
short module_rings = modules.rings()[i];
795844
short module_layers = modules.layers()[i];
796845
short module_subdets = modules.subdets()[i];
797846
float module_eta = alpaka::math::abs(acc, modules.eta()[i]);
798847

799-
int category_number;
800-
if (module_layers <= 3 && module_subdets == 5)
801-
category_number = 0;
802-
else if (module_layers >= 4 && module_subdets == 5)
803-
category_number = 1;
804-
else if (module_layers <= 2 && module_subdets == 4 && module_rings >= 11)
805-
category_number = 2;
806-
else if (module_layers >= 3 && module_subdets == 4 && module_rings >= 8)
807-
category_number = 2;
808-
else if (module_layers <= 2 && module_subdets == 4 && module_rings <= 10)
809-
category_number = 3;
810-
else if (module_layers >= 3 && module_subdets == 4 && module_rings <= 7)
811-
category_number = 3;
812-
else
813-
category_number = -1;
814-
815-
int eta_number;
816-
if (module_eta < 0.75f)
817-
eta_number = 0;
818-
else if (module_eta < 1.5f)
819-
eta_number = 1;
820-
else if (module_eta < 2.25f)
821-
eta_number = 2;
822-
else if (module_eta < 3.0f)
823-
eta_number = 3;
824-
else
825-
eta_number = -1;
826-
827-
int occupancy;
828-
if (category_number == 0 && eta_number == 0)
829-
occupancy = 49;
830-
else if (category_number == 0 && eta_number == 1)
831-
occupancy = 42;
832-
else if (category_number == 0 && eta_number == 2)
833-
occupancy = 37;
834-
else if (category_number == 0 && eta_number == 3)
835-
occupancy = 41;
836-
else if (category_number == 1)
837-
occupancy = 100;
838-
else if (category_number == 2 && eta_number == 1)
839-
occupancy = 16;
840-
else if (category_number == 2 && eta_number == 2)
841-
occupancy = 19;
842-
else if (category_number == 3 && eta_number == 1)
843-
occupancy = 14;
844-
else if (category_number == 3 && eta_number == 2)
845-
occupancy = 20;
846-
else if (category_number == 3 && eta_number == 3)
847-
occupancy = 25;
848-
else {
849-
occupancy = 0;
848+
int category_number = getCategoryNumber(module_layers, module_subdets, module_rings);
849+
int eta_number = getEtaBin(module_eta);
850+
851+
int occupancy = 0;
852+
if (category_number != -1 && eta_number != -1) {
853+
occupancy = occupancy_matrix[category_number][eta_number];
854+
}
850855
#ifdef WARNINGS
856+
else {
851857
printf("Unhandled case in createMDArrayRangesGPU! Module index = %i\n", i);
852-
#endif
853858
}
859+
#endif
854860

855861
unsigned int nTotMDs = alpaka::atomicAdd(acc, &nTotalMDs, occupancy, alpaka::hierarchy::Threads{});
856862

RecoTracker/LSTCore/src/alpaka/Quintuplet.h

Lines changed: 33 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -2418,7 +2418,9 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst {
24182418
acc, &quintupletsOccupancy.totOccupancyQuintuplets()[lowerModule1], 1u, alpaka::hierarchy::Threads{});
24192419
if (totOccupancyQuintuplets >= ranges.quintupletModuleOccupancy()[lowerModule1]) {
24202420
#ifdef WARNINGS
2421-
printf("Quintuplet excess alert! Module index = %d\n", lowerModule1);
2421+
printf("Quintuplet excess alert! Module index = %d, Occupancy = %d\n",
2422+
lowerModule1,
2423+
totOccupancyQuintuplets);
24222424
#endif
24232425
} else {
24242426
int quintupletModuleIndex = alpaka::atomicAdd(
@@ -2478,7 +2480,8 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst {
24782480
ALPAKA_FN_ACC void operator()(TAcc const& acc,
24792481
ModulesConst modules,
24802482
TripletsOccupancyConst tripletsOccupancy,
2481-
ObjectRanges ranges) const {
2483+
ObjectRanges ranges,
2484+
const float ptCut) const {
24822485
// implementation is 1D with a single block
24832486
static_assert(std::is_same_v<TAcc, ALPAKA_ACCELERATOR_NAMESPACE::Acc1D>, "Should be Acc1D");
24842487
ALPAKA_ASSERT_ACC((alpaka::getWorkDiv<alpaka::Grid, alpaka::Blocks>(acc)[0] == 1));
@@ -2495,6 +2498,25 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst {
24952498
}
24962499
alpaka::syncBlockThreads(acc);
24972500

2501+
// Occupancy matrix for 0.8 GeV pT Cut
2502+
constexpr int p08_occupancy_matrix[4][4] = {
2503+
{336, 414, 231, 146}, // category 0
2504+
{0, 0, 0, 0}, // category 1
2505+
{0, 0, 0, 0}, // category 2
2506+
{0, 0, 191, 106} // category 3
2507+
};
2508+
2509+
// Occupancy matrix for 0.6 GeV pT Cut, 99.99%
2510+
constexpr int p06_occupancy_matrix[4][4] = {
2511+
{325, 237, 217, 176}, // category 0
2512+
{0, 0, 0, 0}, // category 1
2513+
{0, 0, 0, 0}, // category 2
2514+
{0, 0, 129, 180} // category 3
2515+
};
2516+
2517+
// Select the appropriate occupancy matrix based on ptCut
2518+
const auto& occupancy_matrix = (ptCut < 0.8f) ? p06_occupancy_matrix : p08_occupancy_matrix;
2519+
24982520
for (int i = globalThreadIdx[0]; i < modules.nLowerModules(); i += gridThreadExtent[0]) {
24992521
// Condition for a quintuple to exist for a module
25002522
// TCs don't exist for layers 5 and 6 barrel, and layers 2,3,4,5 endcap
@@ -2512,55 +2534,18 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst {
25122534

25132535
int nEligibleT5Modules = alpaka::atomicAdd(acc, &nEligibleT5Modulesx, 1, alpaka::hierarchy::Threads{});
25142536

2515-
int category_number;
2516-
if (module_layers <= 3 && module_subdets == 5)
2517-
category_number = 0;
2518-
else if (module_layers >= 4 && module_subdets == 5)
2519-
category_number = 1;
2520-
else if (module_layers <= 2 && module_subdets == 4 && module_rings >= 11)
2521-
category_number = 2;
2522-
else if (module_layers >= 3 && module_subdets == 4 && module_rings >= 8)
2523-
category_number = 2;
2524-
else if (module_layers <= 2 && module_subdets == 4 && module_rings <= 10)
2525-
category_number = 3;
2526-
else if (module_layers >= 3 && module_subdets == 4 && module_rings <= 7)
2527-
category_number = 3;
2528-
else
2529-
category_number = -1;
2530-
2531-
int eta_number;
2532-
if (module_eta < 0.75f)
2533-
eta_number = 0;
2534-
else if (module_eta < 1.5f)
2535-
eta_number = 1;
2536-
else if (module_eta < 2.25f)
2537-
eta_number = 2;
2538-
else if (module_eta < 3.0f)
2539-
eta_number = 3;
2540-
else
2541-
eta_number = -1;
2542-
2543-
int occupancy;
2544-
if (category_number == 0 && eta_number == 0)
2545-
occupancy = 336;
2546-
else if (category_number == 0 && eta_number == 1)
2547-
occupancy = 414;
2548-
else if (category_number == 0 && eta_number == 2)
2549-
occupancy = 231;
2550-
else if (category_number == 0 && eta_number == 3)
2551-
occupancy = 146;
2552-
else if (category_number == 3 && eta_number == 1)
2553-
occupancy = 0;
2554-
else if (category_number == 3 && eta_number == 2)
2555-
occupancy = 191;
2556-
else if (category_number == 3 && eta_number == 3)
2557-
occupancy = 106;
2558-
else {
2559-
occupancy = 0;
2537+
int category_number = getCategoryNumber(module_layers, module_subdets, module_rings);
2538+
int eta_number = getEtaBin(module_eta);
2539+
2540+
int occupancy = 0;
2541+
if (category_number != -1 && eta_number != -1) {
2542+
occupancy = occupancy_matrix[category_number][eta_number];
2543+
}
25602544
#ifdef WARNINGS
2545+
else {
25612546
printf("Unhandled case in createEligibleModulesListForQuintupletsGPU! Module index = %i\n", i);
2562-
#endif
25632547
}
2548+
#endif
25642549

25652550
int nTotQ = alpaka::atomicAdd(acc, &nTotalQuintupletsx, occupancy, alpaka::hierarchy::Threads{});
25662551
ranges.quintupletModuleIndices()[i] = nTotQ;

0 commit comments

Comments
 (0)