diff --git a/RecoTracker/LSTCore/interface/alpaka/Constants.h b/RecoTracker/LSTCore/interface/alpaka/Constants.h index e2ebd979a59a3..2e199897ee92c 100644 --- a/RecoTracker/LSTCore/interface/alpaka/Constants.h +++ b/RecoTracker/LSTCore/interface/alpaka/Constants.h @@ -3,8 +3,10 @@ #include "RecoTracker/LSTCore/interface/Constants.h" -#ifdef ALPAKA_ACC_GPU_CUDA_ENABLED +#if defined ALPAKA_ACC_GPU_CUDA_ENABLED #include +#elif defined ALPAKA_ACC_GPU_HIP_ENABLED +#include #endif namespace lst { diff --git a/RecoTracker/LSTCore/src/ModuleConnectionMap.cc b/RecoTracker/LSTCore/src/ModuleConnectionMap.cc index 732b8e155fb4e..fe0826bbd80e6 100644 --- a/RecoTracker/LSTCore/src/ModuleConnectionMap.cc +++ b/RecoTracker/LSTCore/src/ModuleConnectionMap.cc @@ -69,15 +69,17 @@ void lst::ModuleConnectionMap::add(std::string const& filename) { connected_detids.push_back(connected_detid); } + auto& thisModuleConnections = moduleConnections_.at(detid); + // Concatenate - moduleConnections_[detid].insert(moduleConnections_[detid].end(), connected_detids.begin(), connected_detids.end()); + thisModuleConnections.insert(thisModuleConnections.end(), connected_detids.begin(), connected_detids.end()); // Sort - std::sort(moduleConnections_[detid].begin(), moduleConnections_[detid].end()); + std::sort(thisModuleConnections.begin(), thisModuleConnections.end()); // Unique - moduleConnections_[detid].erase(std::unique(moduleConnections_[detid].begin(), moduleConnections_[detid].end()), - moduleConnections_[detid].end()); + thisModuleConnections.erase(std::unique(thisModuleConnections.begin(), thisModuleConnections.end()), + thisModuleConnections.end()); } } diff --git a/RecoTracker/LSTCore/src/alpaka/Hit.h b/RecoTracker/LSTCore/src/alpaka/Hit.h index c14ac26124e6d..da2aa4c7ce3ad 100644 --- a/RecoTracker/LSTCore/src/alpaka/Hit.h +++ b/RecoTracker/LSTCore/src/alpaka/Hit.h @@ -244,13 +244,15 @@ namespace lst { hitsInGPU.lowEdgeYs[ihit] = ihit_y - 2.5f * sin_phi; } // Need to set initial value if index hasn't been seen before. - int old = alpaka::atomicOp( - acc, &(hitsInGPU.hitRanges[lastModuleIndex * 2]), -1, static_cast(ihit)); + int old = alpaka::atomicCas( + acc, &(hitsInGPU.hitRanges[lastModuleIndex * 2]), -1, static_cast(ihit), alpaka::hierarchy::Threads{}); // For subsequent visits, stores the min value. if (old != -1) - alpaka::atomicOp(acc, &hitsInGPU.hitRanges[lastModuleIndex * 2], static_cast(ihit)); + alpaka::atomicMin( + acc, &hitsInGPU.hitRanges[lastModuleIndex * 2], static_cast(ihit), alpaka::hierarchy::Threads{}); - alpaka::atomicOp(acc, &hitsInGPU.hitRanges[lastModuleIndex * 2 + 1], static_cast(ihit)); + alpaka::atomicMax( + acc, &hitsInGPU.hitRanges[lastModuleIndex * 2 + 1], static_cast(ihit), alpaka::hierarchy::Threads{}); } } }; diff --git a/RecoTracker/LSTCore/src/alpaka/MiniDoublet.h b/RecoTracker/LSTCore/src/alpaka/MiniDoublet.h index 86a22d943c33f..e51e5bfdf8d1a 100644 --- a/RecoTracker/LSTCore/src/alpaka/MiniDoublet.h +++ b/RecoTracker/LSTCore/src/alpaka/MiniDoublet.h @@ -932,13 +932,14 @@ namespace lst { rtUpper); if (success) { int totOccupancyMDs = - alpaka::atomicOp(acc, &mdsInGPU.totOccupancyMDs[lowerModuleIndex], 1u); + alpaka::atomicAdd(acc, &mdsInGPU.totOccupancyMDs[lowerModuleIndex], 1u, alpaka::hierarchy::Threads{}); if (totOccupancyMDs >= (rangesInGPU.miniDoubletModuleOccupancy[lowerModuleIndex])) { #ifdef WARNINGS printf("Mini-doublet excess alert! Module index = %d\n", lowerModuleIndex); #endif } else { - int mdModuleIndex = alpaka::atomicOp(acc, &mdsInGPU.nMDs[lowerModuleIndex], 1u); + int mdModuleIndex = + alpaka::atomicAdd(acc, &mdsInGPU.nMDs[lowerModuleIndex], 1u, alpaka::hierarchy::Threads{}); unsigned int mdIndex = rangesInGPU.miniDoubletModuleIndices[lowerModuleIndex] + mdModuleIndex; addMDToMemory(acc, @@ -1041,7 +1042,7 @@ namespace lst { #endif } - unsigned int nTotMDs = alpaka::atomicOp(acc, &nTotalMDs, occupancy); + unsigned int nTotMDs = alpaka::atomicAdd(acc, &nTotalMDs, occupancy, alpaka::hierarchy::Threads{}); rangesInGPU.miniDoubletModuleIndices[i] = nTotMDs; rangesInGPU.miniDoubletModuleOccupancy[i] = occupancy; diff --git a/RecoTracker/LSTCore/src/alpaka/PixelQuintuplet.h b/RecoTracker/LSTCore/src/alpaka/PixelQuintuplet.h index ee172f9e05f6e..44a58cf612621 100644 --- a/RecoTracker/LSTCore/src/alpaka/PixelQuintuplet.h +++ b/RecoTracker/LSTCore/src/alpaka/PixelQuintuplet.h @@ -901,15 +901,15 @@ namespace lst { centerY, static_cast(i_pLS)); if (success) { - unsigned int totOccupancyPixelQuintuplets = - alpaka::atomicOp(acc, pixelQuintupletsInGPU.totOccupancyPixelQuintuplets, 1u); + unsigned int totOccupancyPixelQuintuplets = alpaka::atomicAdd( + acc, pixelQuintupletsInGPU.totOccupancyPixelQuintuplets, 1u, alpaka::hierarchy::Threads{}); if (totOccupancyPixelQuintuplets >= n_max_pixel_quintuplets) { #ifdef WARNINGS printf("Pixel Quintuplet excess alert!\n"); #endif } else { unsigned int pixelQuintupletIndex = - alpaka::atomicOp(acc, pixelQuintupletsInGPU.nPixelQuintuplets, 1u); + alpaka::atomicAdd(acc, pixelQuintupletsInGPU.nPixelQuintuplets, 1u, alpaka::hierarchy::Threads{}); float eta = __H2F(quintupletsInGPU.eta[quintupletIndex]); float phi = __H2F(quintupletsInGPU.phi[quintupletIndex]); diff --git a/RecoTracker/LSTCore/src/alpaka/PixelTriplet.h b/RecoTracker/LSTCore/src/alpaka/PixelTriplet.h index 3b6faffbce426..0897517fd6a9d 100644 --- a/RecoTracker/LSTCore/src/alpaka/PixelTriplet.h +++ b/RecoTracker/LSTCore/src/alpaka/PixelTriplet.h @@ -1025,15 +1025,15 @@ namespace lst { float phi_pix = segmentsInGPU.phi[i_pLS]; float pt = segmentsInGPU.ptIn[i_pLS]; float score = rPhiChiSquared + rPhiChiSquaredInwards; - unsigned int totOccupancyPixelTriplets = - alpaka::atomicOp(acc, pixelTripletsInGPU.totOccupancyPixelTriplets, 1u); + unsigned int totOccupancyPixelTriplets = alpaka::atomicAdd( + acc, pixelTripletsInGPU.totOccupancyPixelTriplets, 1u, alpaka::hierarchy::Threads{}); if (totOccupancyPixelTriplets >= n_max_pixel_triplets) { #ifdef WARNINGS printf("Pixel Triplet excess alert!\n"); #endif } else { unsigned int pixelTripletIndex = - alpaka::atomicOp(acc, pixelTripletsInGPU.nPixelTriplets, 1u); + alpaka::atomicAdd(acc, pixelTripletsInGPU.nPixelTriplets, 1u, alpaka::hierarchy::Threads{}); addPixelTripletToMemory(mdsInGPU, segmentsInGPU, tripletsInGPU, diff --git a/RecoTracker/LSTCore/src/alpaka/Quintuplet.h b/RecoTracker/LSTCore/src/alpaka/Quintuplet.h index 1165d33f6da5e..8ed3786f610a6 100644 --- a/RecoTracker/LSTCore/src/alpaka/Quintuplet.h +++ b/RecoTracker/LSTCore/src/alpaka/Quintuplet.h @@ -2602,15 +2602,15 @@ namespace lst { TightCutFlag); if (success) { - int totOccupancyQuintuplets = - alpaka::atomicOp(acc, &quintupletsInGPU.totOccupancyQuintuplets[lowerModule1], 1u); + int totOccupancyQuintuplets = alpaka::atomicAdd( + acc, &quintupletsInGPU.totOccupancyQuintuplets[lowerModule1], 1u, alpaka::hierarchy::Threads{}); if (totOccupancyQuintuplets >= rangesInGPU.quintupletModuleOccupancy[lowerModule1]) { #ifdef WARNINGS printf("Quintuplet excess alert! Module index = %d\n", lowerModule1); #endif } else { - int quintupletModuleIndex = - alpaka::atomicOp(acc, &quintupletsInGPU.nQuintuplets[lowerModule1], 1u); + int quintupletModuleIndex = alpaka::atomicAdd( + acc, &quintupletsInGPU.nQuintuplets[lowerModule1], 1u, alpaka::hierarchy::Threads{}); //this if statement should never get executed! if (rangesInGPU.quintupletModuleIndices[lowerModule1] == -1) { #ifdef WARNINGS @@ -2700,7 +2700,7 @@ namespace lst { if (module_subdets == lst::Endcap and module_layers > 1) continue; - int nEligibleT5Modules = alpaka::atomicOp(acc, &nEligibleT5Modulesx, 1); + int nEligibleT5Modules = alpaka::atomicAdd(acc, &nEligibleT5Modulesx, 1, alpaka::hierarchy::Threads{}); if (module_layers <= 3 && module_subdets == 5) category_number = 0; @@ -2749,7 +2749,7 @@ namespace lst { #endif } - int nTotQ = alpaka::atomicOp(acc, &nTotalQuintupletsx, occupancy); + int nTotQ = alpaka::atomicAdd(acc, &nTotalQuintupletsx, occupancy, alpaka::hierarchy::Threads{}); rangesInGPU.quintupletModuleIndices[i] = nTotQ; rangesInGPU.indicesOfEligibleT5Modules[nEligibleT5Modules] = i; rangesInGPU.quintupletModuleOccupancy[i] = occupancy; diff --git a/RecoTracker/LSTCore/src/alpaka/Segment.h b/RecoTracker/LSTCore/src/alpaka/Segment.h index 6e79bacfa4902..8256926a3f75c 100644 --- a/RecoTracker/LSTCore/src/alpaka/Segment.h +++ b/RecoTracker/LSTCore/src/alpaka/Segment.h @@ -763,15 +763,15 @@ namespace lst { dPhiChange, dPhiChangeMin, dPhiChangeMax)) { - unsigned int totOccupancySegments = alpaka::atomicOp( - acc, &segmentsInGPU.totOccupancySegments[innerLowerModuleIndex], 1u); + unsigned int totOccupancySegments = alpaka::atomicAdd( + acc, &segmentsInGPU.totOccupancySegments[innerLowerModuleIndex], 1u, alpaka::hierarchy::Threads{}); if (static_cast(totOccupancySegments) >= rangesInGPU.segmentModuleOccupancy[innerLowerModuleIndex]) { #ifdef WARNINGS printf("Segment excess alert! Module index = %d\n", innerLowerModuleIndex); #endif } else { - unsigned int segmentModuleIdx = - alpaka::atomicOp(acc, &segmentsInGPU.nSegments[innerLowerModuleIndex], 1u); + unsigned int segmentModuleIdx = alpaka::atomicAdd( + acc, &segmentsInGPU.nSegments[innerLowerModuleIndex], 1u, alpaka::hierarchy::Threads{}); unsigned int segmentIdx = rangesInGPU.segmentModuleIndices[innerLowerModuleIndex] + segmentModuleIdx; addSegmentToMemory(segmentsInGPU, @@ -882,7 +882,7 @@ namespace lst { #endif } - int nTotSegs = alpaka::atomicOp(acc, &nTotalSegments, occupancy); + int nTotSegs = alpaka::atomicAdd(acc, &nTotalSegments, occupancy, alpaka::hierarchy::Threads{}); rangesInGPU.segmentModuleIndices[i] = nTotSegs; rangesInGPU.segmentModuleOccupancy[i] = occupancy; } diff --git a/RecoTracker/LSTCore/src/alpaka/TrackCandidate.h b/RecoTracker/LSTCore/src/alpaka/TrackCandidate.h index ede4dd9471e8e..704cdb21c1f5c 100644 --- a/RecoTracker/LSTCore/src/alpaka/TrackCandidate.h +++ b/RecoTracker/LSTCore/src/alpaka/TrackCandidate.h @@ -401,17 +401,17 @@ namespace lst { continue; unsigned int trackCandidateIdx = - alpaka::atomicOp(acc, trackCandidatesInGPU.nTrackCandidates, 1u); + alpaka::atomicAdd(acc, trackCandidatesInGPU.nTrackCandidates, 1u, alpaka::hierarchy::Threads{}); if (trackCandidateIdx >= n_max_pixel_track_candidates) // This is done before any non-pixel TCs are added { #ifdef WARNINGS printf("Track Candidate excess alert! Type = pT3"); #endif - alpaka::atomicOp(acc, trackCandidatesInGPU.nTrackCandidates, 1u); + alpaka::atomicSub(acc, trackCandidatesInGPU.nTrackCandidates, 1u, alpaka::hierarchy::Threads{}); break; } else { - alpaka::atomicOp(acc, trackCandidatesInGPU.nTrackCandidatespT3, 1u); + alpaka::atomicAdd(acc, trackCandidatesInGPU.nTrackCandidatespT3, 1u, alpaka::hierarchy::Threads{}); float radius = 0.5f * (__H2F(pixelTripletsInGPU.pixelRadius[pixelTripletIndex]) + __H2F(pixelTripletsInGPU.tripletRadius[pixelTripletIndex])); @@ -457,7 +457,7 @@ namespace lst { continue; unsigned int trackCandidateIdx = - alpaka::atomicOp(acc, trackCandidatesInGPU.nTrackCandidates, 1u); + alpaka::atomicAdd(acc, trackCandidatesInGPU.nTrackCandidates, 1u, alpaka::hierarchy::Threads{}); if (trackCandidateIdx - *trackCandidatesInGPU.nTrackCandidatespT5 - *trackCandidatesInGPU.nTrackCandidatespT3 >= n_max_nonpixel_track_candidates) // pT5 and pT3 TCs have been added, but not pLS TCs @@ -465,10 +465,10 @@ namespace lst { #ifdef WARNINGS printf("Track Candidate excess alert! Type = T5"); #endif - alpaka::atomicOp(acc, trackCandidatesInGPU.nTrackCandidates, 1u); + alpaka::atomicSub(acc, trackCandidatesInGPU.nTrackCandidates, 1u, alpaka::hierarchy::Threads{}); break; } else { - alpaka::atomicOp(acc, trackCandidatesInGPU.nTrackCandidatesT5, 1u); + alpaka::atomicAdd(acc, trackCandidatesInGPU.nTrackCandidatesT5, 1u, alpaka::hierarchy::Threads{}); addTrackCandidateToMemory(trackCandidatesInGPU, 4 /*track candidate type T5=4*/, quintupletIndex, @@ -505,18 +505,18 @@ namespace lst { continue; unsigned int trackCandidateIdx = - alpaka::atomicOp(acc, trackCandidatesInGPU.nTrackCandidates, 1u); + alpaka::atomicAdd(acc, trackCandidatesInGPU.nTrackCandidates, 1u, alpaka::hierarchy::Threads{}); if (trackCandidateIdx - *trackCandidatesInGPU.nTrackCandidatesT5 >= n_max_pixel_track_candidates) // T5 TCs have already been added { #ifdef WARNINGS printf("Track Candidate excess alert! Type = pLS"); #endif - alpaka::atomicOp(acc, trackCandidatesInGPU.nTrackCandidates, 1u); + alpaka::atomicSub(acc, trackCandidatesInGPU.nTrackCandidates, 1u, alpaka::hierarchy::Threads{}); break; } else { - alpaka::atomicOp(acc, trackCandidatesInGPU.nTrackCandidatespLS, 1u); + alpaka::atomicAdd(acc, trackCandidatesInGPU.nTrackCandidatespLS, 1u, alpaka::hierarchy::Threads{}); addpLSTrackCandidateToMemory(trackCandidatesInGPU, pixelArrayIndex, trackCandidateIdx, @@ -546,17 +546,17 @@ namespace lst { continue; unsigned int trackCandidateIdx = - alpaka::atomicOp(acc, trackCandidatesInGPU.nTrackCandidates, 1u); + alpaka::atomicAdd(acc, trackCandidatesInGPU.nTrackCandidates, 1u, alpaka::hierarchy::Threads{}); if (trackCandidateIdx >= n_max_pixel_track_candidates) // No other TCs have been added yet { #ifdef WARNINGS printf("Track Candidate excess alert! Type = pT5"); #endif - alpaka::atomicOp(acc, trackCandidatesInGPU.nTrackCandidates, 1u); + alpaka::atomicSub(acc, trackCandidatesInGPU.nTrackCandidates, 1u, alpaka::hierarchy::Threads{}); break; } else { - alpaka::atomicOp(acc, trackCandidatesInGPU.nTrackCandidatespT5, 1u); + alpaka::atomicAdd(acc, trackCandidatesInGPU.nTrackCandidatespT5, 1u, alpaka::hierarchy::Threads{}); float radius = 0.5f * (__H2F(pixelQuintupletsInGPU.pixelRadius[pixelQuintupletIndex]) + __H2F(pixelQuintupletsInGPU.quintupletRadius[pixelQuintupletIndex])); diff --git a/RecoTracker/LSTCore/src/alpaka/Triplet.h b/RecoTracker/LSTCore/src/alpaka/Triplet.h index f5a216724c1da..4aa219ba0821c 100644 --- a/RecoTracker/LSTCore/src/alpaka/Triplet.h +++ b/RecoTracker/LSTCore/src/alpaka/Triplet.h @@ -868,16 +868,19 @@ namespace lst { circleCenterY); if (success) { - unsigned int totOccupancyTriplets = alpaka::atomicOp( - acc, &tripletsInGPU.totOccupancyTriplets[innerInnerLowerModuleIndex], 1u); + unsigned int totOccupancyTriplets = + alpaka::atomicAdd(acc, + &tripletsInGPU.totOccupancyTriplets[innerInnerLowerModuleIndex], + 1u, + alpaka::hierarchy::Threads{}); if (static_cast(totOccupancyTriplets) >= rangesInGPU.tripletModuleOccupancy[innerInnerLowerModuleIndex]) { #ifdef WARNINGS printf("Triplet excess alert! Module index = %d\n", innerInnerLowerModuleIndex); #endif } else { - unsigned int tripletModuleIndex = - alpaka::atomicOp(acc, &tripletsInGPU.nTriplets[innerInnerLowerModuleIndex], 1u); + unsigned int tripletModuleIndex = alpaka::atomicAdd( + acc, &tripletsInGPU.nTriplets[innerInnerLowerModuleIndex], 1u, alpaka::hierarchy::Threads{}); unsigned int tripletIndex = rangesInGPU.tripletModuleIndices[innerInnerLowerModuleIndex] + tripletModuleIndex; #ifdef CUT_VALUE_DEBUG @@ -1009,7 +1012,7 @@ namespace lst { } rangesInGPU.tripletModuleOccupancy[i] = occupancy; - unsigned int nTotT = alpaka::atomicOp(acc, &nTotalTriplets, occupancy); + unsigned int nTotT = alpaka::atomicAdd(acc, &nTotalTriplets, occupancy, alpaka::hierarchy::Threads{}); rangesInGPU.tripletModuleIndices[i] = nTotT; }