File indexing completed on 2026-07-26 08:22:11
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "../utils/cuda_error_handling.hpp"
0010 #include "../utils/global_index.hpp"
0011 #include "../utils/utils.hpp"
0012 #include "traccc/cuda/seeding/triplet_seeding_algorithm.hpp"
0013
0014
0015 #include "traccc/seeding/detail/spacepoint_grid.hpp"
0016 #include "traccc/seeding/device/count_doublets.hpp"
0017 #include "traccc/seeding/device/count_grid_capacities.hpp"
0018 #include "traccc/seeding/device/count_triplets.hpp"
0019 #include "traccc/seeding/device/find_doublets.hpp"
0020 #include "traccc/seeding/device/find_triplets.hpp"
0021 #include "traccc/seeding/device/populate_grid.hpp"
0022 #include "traccc/seeding/device/reduce_triplet_counts.hpp"
0023 #include "traccc/seeding/device/select_seeds.hpp"
0024 #include "traccc/seeding/device/update_triplet_weights.hpp"
0025
0026 namespace traccc::cuda {
0027 namespace kernels {
0028
0029
0030 __global__ void count_grid_capacities(
0031 seedfinder_config config,
0032 traccc::details::spacepoint_grid_types::host::axis_p0_type phi_axis,
0033 traccc::details::spacepoint_grid_types::host::axis_p1_type z_axis,
0034 edm::spacepoint_collection::const_view spacepoints,
0035 vecmem::data::vector_view<unsigned int> grid_capacities) {
0036 device::count_grid_capacities(details::global_index1(), config, phi_axis,
0037 z_axis, spacepoints, grid_capacities);
0038 }
0039
0040
0041 __global__ void populate_grid(
0042 seedfinder_config config,
0043 edm::spacepoint_collection::const_view spacepoints,
0044 traccc::details::spacepoint_grid_types::view grid,
0045 vecmem::data::vector_view<device::prefix_sum_element_t> grid_prefix_sum) {
0046 device::populate_grid(details::global_index1(), config, spacepoints, grid,
0047 grid_prefix_sum);
0048 }
0049
0050
0051 __global__ void count_doublets(
0052 seedfinder_config config,
0053 edm::spacepoint_collection::const_view spacepoints,
0054 traccc::details::spacepoint_grid_types::const_view sp_grid,
0055 vecmem::data::vector_view<const device::prefix_sum_element_t> sp_prefix_sum,
0056 device::doublet_counter_collection_types::view doublet_counter,
0057 unsigned int& nMidBot, unsigned int& nMidTop) {
0058 device::count_doublets(details::global_index1(), config, spacepoints, sp_grid,
0059 sp_prefix_sum, doublet_counter, nMidBot, nMidTop);
0060 }
0061
0062
0063 __global__ void find_doublets(
0064 seedfinder_config config,
0065 edm::spacepoint_collection::const_view spacepoints,
0066 traccc::details::spacepoint_grid_types::const_view sp_grid,
0067 device::doublet_counter_collection_types::const_view doublet_counter,
0068 device::device_doublet_collection_types::view mb_doublets,
0069 device::device_doublet_collection_types::view mt_doublets) {
0070 device::find_doublets(details::global_index1(), config, spacepoints, sp_grid,
0071 doublet_counter, mb_doublets, mt_doublets);
0072 }
0073
0074
0075 __global__ void count_triplets(
0076 seedfinder_config config,
0077 edm::spacepoint_collection::const_view spacepoints,
0078 traccc::details::spacepoint_grid_types::const_view sp_grid,
0079 device::doublet_counter_collection_types::const_view doublet_counter,
0080 device::device_doublet_collection_types::const_view mb_doublets,
0081 device::device_doublet_collection_types::const_view mt_doublets,
0082 device::triplet_counter_spM_collection_types::view spM_counter,
0083 device::triplet_counter_collection_types::view midBot_counter) {
0084 device::count_triplets(details::global_index1(), config, spacepoints, sp_grid,
0085 doublet_counter, mb_doublets, mt_doublets, spM_counter,
0086 midBot_counter);
0087 }
0088
0089
0090 __global__ void reduce_triplet_counts(
0091 device::doublet_counter_collection_types::const_view doublet_counter,
0092 device::triplet_counter_spM_collection_types::view spM_counter,
0093 unsigned int& num_triplets) {
0094 device::reduce_triplet_counts(details::global_index1(), doublet_counter,
0095 spM_counter, num_triplets);
0096 }
0097
0098
0099 __global__ void find_triplets(
0100 seedfinder_config config, seedfilter_config filter_config,
0101 edm::spacepoint_collection::const_view spacepoints,
0102 traccc::details::spacepoint_grid_types::const_view sp_grid,
0103 device::doublet_counter_collection_types::const_view doublet_counter,
0104 device::device_doublet_collection_types::const_view mt_doublets,
0105 device::triplet_counter_spM_collection_types::const_view spM_tc,
0106 device::triplet_counter_collection_types::const_view midBot_tc,
0107 device::device_triplet_collection_types::view triplet_view) {
0108 device::find_triplets(details::global_index1(), config, filter_config,
0109 spacepoints, sp_grid, doublet_counter, mt_doublets,
0110 spM_tc, midBot_tc, triplet_view);
0111 }
0112
0113
0114 __global__ void update_triplet_weights(
0115 seedfilter_config filter_config,
0116 edm::spacepoint_collection::const_view spacepoints,
0117 device::triplet_counter_spM_collection_types::const_view spM_tc,
0118 device::triplet_counter_collection_types::const_view midBot_tc,
0119 device::device_triplet_collection_types::view triplet_view) {
0120
0121
0122 extern __shared__ scalar data[];
0123
0124 scalar* dataPos = &data[threadIdx.x * filter_config.compatSeedLimit];
0125
0126 device::update_triplet_weights(details::global_index1(), filter_config,
0127 spacepoints, spM_tc, midBot_tc, dataPos,
0128 triplet_view);
0129 }
0130
0131
0132 __global__ void select_seeds(
0133 seedfinder_config finder_config, seedfilter_config filter_config,
0134 edm::spacepoint_collection::const_view spacepoints,
0135 traccc::details::spacepoint_grid_types::const_view sp_view,
0136 device::triplet_counter_spM_collection_types::const_view spM_tc,
0137 device::triplet_counter_collection_types::const_view midBot_tc,
0138 device::device_triplet_collection_types::const_view triplet_view,
0139 edm::seed_collection::view seed_view) {
0140
0141
0142 extern __shared__ device::device_triplet data2[];
0143
0144 device::device_triplet* dataPos =
0145 &data2[threadIdx.x * finder_config.maxSeedsPerSpM];
0146
0147 device::select_seeds(details::global_index1(), finder_config, filter_config,
0148 spacepoints, sp_view, spM_tc, midBot_tc, triplet_view,
0149 dataPos, seed_view);
0150 }
0151
0152 }
0153
0154 triplet_seeding_algorithm::triplet_seeding_algorithm(
0155 const seedfinder_config& finder_config,
0156 const spacepoint_grid_config& grid_config,
0157 const seedfilter_config& filter_config, const traccc::memory_resource& mr,
0158 const vecmem::copy& copy, const stream_wrapper& str,
0159 std::unique_ptr<const Logger> logger)
0160 : device::triplet_seeding_algorithm(finder_config, grid_config,
0161 filter_config, mr, copy,
0162 std::move(logger)),
0163 cuda::algorithm_base{str} {}
0164
0165 void triplet_seeding_algorithm::count_grid_capacities_kernel(
0166 const count_grid_capacities_kernel_payload& payload) const {
0167 const unsigned int n_threads = warp_size() * 8;
0168 const unsigned int n_blocks =
0169 (payload.n_spacepoints + n_threads - 1) / n_threads;
0170 kernels::count_grid_capacities<<<n_blocks, n_threads, 0,
0171 details::get_stream(stream())>>>(
0172 payload.config, payload.phi_axis, payload.z_axis, payload.spacepoints,
0173 payload.grid_capacities);
0174 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0175 }
0176
0177 void triplet_seeding_algorithm::populate_grid_kernel(
0178 const populate_grid_kernel_payload& payload) const {
0179 const unsigned int n_threads = warp_size() * 8;
0180 const unsigned int n_blocks =
0181 (payload.n_spacepoints + n_threads - 1) / n_threads;
0182 kernels::
0183 populate_grid<<<n_blocks, n_threads, 0, details::get_stream(stream())>>>(
0184 payload.config, payload.spacepoints, payload.grid,
0185 payload.grid_prefix_sum);
0186 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0187 }
0188
0189 void triplet_seeding_algorithm::count_doublets_kernel(
0190 const count_doublets_kernel_payload& payload) const {
0191 const unsigned int n_threads = warp_size() * 2;
0192 const unsigned int n_blocks =
0193 (payload.n_spacepoints + n_threads - 1) / n_threads;
0194 kernels::
0195 count_doublets<<<n_blocks, n_threads, 0, details::get_stream(stream())>>>(
0196 payload.config, payload.spacepoints, payload.grid,
0197 payload.grid_prefix_sum, payload.doublet_counter, payload.nMidBot,
0198 payload.nMidTop);
0199 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0200 }
0201
0202 void triplet_seeding_algorithm::find_doublets_kernel(
0203 const find_doublets_kernel_payload& payload) const {
0204 const unsigned int n_threads = warp_size() * 2;
0205 const unsigned int n_blocks =
0206 (payload.n_doublets + n_threads - 1) / n_threads;
0207 kernels::
0208 find_doublets<<<n_blocks, n_threads, 0, details::get_stream(stream())>>>(
0209 payload.config, payload.spacepoints, payload.grid,
0210 payload.doublet_counter, payload.mb_doublets, payload.mt_doublets);
0211 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0212 }
0213
0214 void triplet_seeding_algorithm::count_triplets_kernel(
0215 const count_triplets_kernel_payload& payload) const {
0216 const unsigned int n_threads = warp_size() * 2;
0217 const unsigned int n_blocks = (payload.nMidBot + n_threads - 1) / n_threads;
0218 kernels::
0219 count_triplets<<<n_blocks, n_threads, 0, details::get_stream(stream())>>>(
0220 payload.config, payload.spacepoints, payload.grid,
0221 payload.doublet_counter, payload.mb_doublets, payload.mt_doublets,
0222 payload.spM_counter, payload.midBot_counter);
0223 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0224 }
0225
0226 void triplet_seeding_algorithm::triplet_counts_reduction_kernel(
0227 const triplet_counts_reduction_kernel_payload& payload) const {
0228 const unsigned int n_threads = warp_size() * 2;
0229 const unsigned int n_blocks =
0230 (payload.n_doublets + n_threads - 1) / n_threads;
0231 kernels::reduce_triplet_counts<<<n_blocks, n_threads, 0,
0232 details::get_stream(stream())>>>(
0233 payload.doublet_counter, payload.spM_counter, payload.nTriplets);
0234 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0235 }
0236
0237 void triplet_seeding_algorithm::find_triplets_kernel(
0238 const find_triplets_kernel_payload& payload) const {
0239 const unsigned int n_threads = warp_size() * 2;
0240 const unsigned int n_blocks = (payload.nMidBot + n_threads - 1) / n_threads;
0241 kernels::
0242 find_triplets<<<n_blocks, n_threads, 0, details::get_stream(stream())>>>(
0243 payload.finding_config, payload.filter_config, payload.spacepoints,
0244 payload.grid, payload.doublet_counter, payload.mt_doublets,
0245 payload.spM_tc, payload.midBot_tc, payload.triplets);
0246 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0247 }
0248
0249 void triplet_seeding_algorithm::update_triplet_weights_kernel(
0250 const update_triplet_weights_kernel_payload& payload) const {
0251 const unsigned int n_threads = warp_size() * 2;
0252 const unsigned int n_blocks =
0253 (payload.n_triplets + n_threads - 1) / n_threads;
0254 kernels::update_triplet_weights<<<
0255 n_blocks, n_threads,
0256 sizeof(scalar) * payload.config.compatSeedLimit * n_threads,
0257 details::get_stream(stream())>>>(payload.config, payload.spacepoints,
0258 payload.spM_tc, payload.midBot_tc,
0259 payload.triplets);
0260 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0261 }
0262
0263 void triplet_seeding_algorithm::select_seeds_kernel(
0264 const select_seeds_kernel_payload& payload) const {
0265 const unsigned int n_threads = warp_size() * 2;
0266 const unsigned int n_blocks =
0267 (payload.n_doublets + n_threads - 1) / n_threads;
0268 kernels::select_seeds<<<n_blocks, n_threads,
0269 sizeof(device::device_triplet) *
0270 payload.finder_config.maxSeedsPerSpM * n_threads,
0271 details::get_stream(stream())>>>(
0272 payload.finder_config, payload.filter_config, payload.spacepoints,
0273 payload.grid, payload.spM_tc, payload.midBot_tc, payload.triplets,
0274 payload.seeds);
0275 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0276 }
0277
0278 }