File indexing completed on 2026-07-26 08:22:11
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "../utils/barrier.hpp"
0010 #include "../utils/cuda_error_handling.hpp"
0011 #include "../utils/thread_id.hpp"
0012 #include "../utils/utils.hpp"
0013 #include "traccc/cuda/gbts_seeding/gbts_seeding_algorithm.hpp"
0014
0015
0016 #include "traccc/gbts_seeding/device/gbts_add_terminus_to_path_store.hpp"
0017 #include "traccc/gbts_seeding/device/gbts_bid_seeds_for_hits.hpp"
0018 #include "traccc/gbts_seeding/device/gbts_bin_spacepoints.hpp"
0019 #include "traccc/gbts_seeding/device/gbts_compress_graph.hpp"
0020 #include "traccc/gbts_seeding/device/gbts_convert_seeds.hpp"
0021 #include "traccc/gbts_seeding/device/gbts_count_eta_phi_bins.hpp"
0022 #include "traccc/gbts_seeding/device/gbts_count_spacepoints_by_layer.hpp"
0023 #include "traccc/gbts_seeding/device/gbts_count_terminus_edges.hpp"
0024 #include "traccc/gbts_seeding/device/gbts_fill_path_store.hpp"
0025 #include "traccc/gbts_seeding/device/gbts_find_minmax_radius.hpp"
0026 #include "traccc/gbts_seeding/device/gbts_fit_segments.hpp"
0027 #include "traccc/gbts_seeding/device/gbts_link_graph_edges.hpp"
0028 #include "traccc/gbts_seeding/device/gbts_make_graph_edges.hpp"
0029 #include "traccc/gbts_seeding/device/gbts_match_graph_edges.hpp"
0030 #include "traccc/gbts_seeding/device/gbts_prefix_sum_eta_phi_bins.hpp"
0031 #include "traccc/gbts_seeding/device/gbts_rebid_seeds_for_edges.hpp"
0032 #include "traccc/gbts_seeding/device/gbts_reindex_edges.hpp"
0033 #include "traccc/gbts_seeding/device/gbts_reset_edge_bids.hpp"
0034 #include "traccc/gbts_seeding/device/gbts_run_cca_iteration.hpp"
0035 #include "traccc/gbts_seeding/device/gbts_sort_nodes.hpp"
0036 #include "traccc/gbts_seeding/gbts_types.hpp"
0037
0038
0039 #include <vecmem/containers/data/vector_view.hpp>
0040
0041
0042 #include <algorithm>
0043 #include <memory_resource>
0044
0045
0046 #include <thrust/execution_policy.h>
0047 #include <thrust/scan.h>
0048
0049 namespace traccc::cuda {
0050
0051 namespace kernels {
0052
0053 using float4 = traccc::float4;
0054 using uint2 = traccc::uint2;
0055 using int2 = traccc::int2;
0056
0057
0058
0059
0060
0061
0062 __global__ void gbts_count_spacepoints_by_layer(
0063 const device::gbts_count_spacepoints_by_layer_payload payload) {
0064 device::gbts_count_spacepoints_by_layer(details::thread_id1{}, payload);
0065 }
0066
0067
0068 __global__ void gbts_bin_spacepoints(
0069 const device::gbts_bin_spacepoints_payload payload) {
0070 device::gbts_bin_spacepoints(details::thread_id1{}, payload);
0071 }
0072
0073
0074 __global__ void gbts_count_eta_phi_bins(
0075 const device::gbts_count_eta_phi_bins_payload payload) {
0076 device::gbts_count_eta_phi_bins(details::thread_id1{}, payload);
0077 }
0078
0079
0080 __global__ void gbts_prefix_sum_eta_phi_bins(
0081 const device::gbts_prefix_sum_eta_phi_bins_payload payload) {
0082 device::gbts_prefix_sum_eta_phi_bins(details::thread_id1{}, payload);
0083 }
0084
0085
0086 __global__ void gbts_sort_nodes(const device::gbts_sort_nodes_payload payload) {
0087 device::gbts_sort_nodes(details::thread_id1{}, payload);
0088 }
0089
0090
0091 __global__ void gbts_find_minmax_radius(
0092 const device::gbts_find_minmax_radius_payload payload) {
0093 device::gbts_find_minmax_radius(details::thread_id1{}, payload);
0094 }
0095
0096
0097
0098
0099
0100
0101 __global__ void gbts_make_graph_edges(
0102 const device::gbts_make_graph_edges_payload payload) {
0103 __shared__ float phi[traccc::device::gbts_consts::node_buffer_length];
0104 __shared__ float4 node_pack[traccc::device::gbts_consts::node_buffer_length];
0105 const traccc::cuda::barrier barrier;
0106
0107 device::gbts_make_graph_edges(
0108 details::thread_id1{}, barrier, payload,
0109 {vecmem::data::vector_view<float>(
0110 traccc::device::gbts_consts::node_buffer_length, phi),
0111 vecmem::data::vector_view<float4>(
0112 traccc::device::gbts_consts::node_buffer_length, node_pack)});
0113 }
0114
0115
0116 __global__ void gbts_link_graph_edges(
0117 const device::gbts_link_graph_edges_payload payload) {
0118 device::gbts_link_graph_edges(details::thread_id1{}, payload);
0119 }
0120
0121
0122 __global__ void gbts_match_graph_edges(
0123 const device::gbts_match_graph_edges_payload payload) {
0124 device::gbts_match_graph_edges(details::thread_id1{}, payload);
0125 }
0126
0127
0128 __global__ void gbts_reindex_edges(
0129 const device::gbts_reindex_edges_payload payload) {
0130 device::gbts_reindex_edges(details::thread_id1{}, payload);
0131 }
0132
0133
0134 __global__ void gbts_compress_graph(
0135 const device::gbts_compress_graph_payload payload) {
0136 device::gbts_compress_graph(details::thread_id1{}, payload);
0137 }
0138
0139
0140
0141
0142
0143
0144 __global__ void gbts_run_cca_iteration(
0145 const device::gbts_run_cca_iteration_payload payload) {
0146 device::gbts_run_cca_iteration(details::thread_id1{}, payload);
0147 }
0148
0149
0150 __global__ void gbts_count_terminus_edges(
0151 const device::gbts_count_terminus_edges_payload payload) {
0152 device::gbts_count_terminus_edges(details::thread_id1{}, payload);
0153 }
0154
0155
0156 __global__ void gbts_add_terminus_to_path_store(
0157 const device::gbts_add_terminus_to_path_store_payload payload) {
0158 device::gbts_add_terminus_to_path_store(details::thread_id1{}, payload);
0159 }
0160
0161
0162 __global__ void gbts_fill_path_store(
0163 const device::gbts_fill_path_store_payload payload) {
0164 __shared__ traccc::uint2
0165 live_paths[traccc::device::gbts_consts::live_path_buffer];
0166 __shared__ int n_live_paths;
0167 const traccc::cuda::barrier barrier;
0168
0169 device::gbts_fill_path_store(
0170 details::thread_id1{}, barrier, payload,
0171 {vecmem::data::vector_view<traccc::uint2>(
0172 traccc::device::gbts_consts::live_path_buffer, live_paths),
0173 n_live_paths});
0174 }
0175
0176
0177 __global__ void gbts_fit_segments(
0178 const device::gbts_fit_segments_payload payload) {
0179 device::gbts_fit_segments(details::thread_id1{}, payload);
0180 }
0181
0182
0183 __global__ void gbts_reset_edge_bids(
0184 const device::gbts_reset_edge_bids_payload payload) {
0185 device::gbts_reset_edge_bids(details::thread_id1{}, payload);
0186 }
0187
0188
0189 __global__ void gbts_rebid_seeds_for_edges(
0190 const device::gbts_rebid_seeds_for_edges_payload payload) {
0191 device::gbts_rebid_seeds_for_edges(details::thread_id1{}, payload);
0192 }
0193
0194
0195 __global__ void gbts_bid_seeds_for_hits(
0196 const device::gbts_bid_seeds_for_hits_payload payload) {
0197 device::gbts_bid_seeds_for_hits(details::thread_id1{}, payload);
0198 }
0199
0200
0201 __global__ void gbts_convert_seeds(
0202 const device::gbts_convert_seeds_payload payload) {
0203 device::gbts_convert_seeds(details::thread_id1{}, payload);
0204 }
0205
0206 }
0207
0208
0209
0210
0211
0212 gbts_seeding_algorithm::gbts_seeding_algorithm(
0213 const gbts_seedfinder_config& cfg, const memory_resource& mr,
0214 const vecmem::copy& copy, const stream_wrapper& str,
0215 std::unique_ptr<const Logger> logger)
0216 : device::gbts_seeding_algorithm(cfg, mr, copy, std::move(logger)),
0217 cuda::algorithm_base{str} {}
0218
0219 void gbts_seeding_algorithm::gbts_count_spacepoints_by_layer_kernel(
0220 const device::gbts_count_spacepoints_by_layer_payload& payload) const {
0221 const unsigned int n_threads = 128;
0222 const unsigned int n_blocks = 1 + (payload.nSp - 1) / n_threads;
0223 kernels::gbts_count_spacepoints_by_layer<<<n_blocks, n_threads, 0,
0224 details::get_stream(stream())>>>(
0225 payload);
0226 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0227 vecmem::device_vector<unsigned int> d_layer_sums(payload.layerCounts);
0228 thrust::inclusive_scan(
0229 thrust::cuda::par_nosync(std::pmr::polymorphic_allocator(&(mr().main)))
0230 .on(details::get_stream(stream())),
0231 d_layer_sums.begin(), d_layer_sums.end(), d_layer_sums.begin());
0232 }
0233
0234 void gbts_seeding_algorithm::gbts_bin_spacepoints_kernel(
0235 const device::gbts_bin_spacepoints_payload& payload) const {
0236 const unsigned int n_threads = 128;
0237 const unsigned int n_blocks = 1 + (payload.nSp - 1) / n_threads;
0238 kernels::gbts_bin_spacepoints<<<n_blocks, n_threads, 0,
0239 details::get_stream(stream())>>>(payload);
0240 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0241 }
0242
0243 void gbts_seeding_algorithm::gbts_count_eta_phi_bins_kernel(
0244 const device::gbts_count_eta_phi_bins_payload& payload) const {
0245 const unsigned int n_threads = 128;
0246 const unsigned int n_blocks = 1 + (payload.nEtaBins - 1) / n_threads;
0247 kernels::gbts_count_eta_phi_bins<<<n_blocks, n_threads, 0,
0248 details::get_stream(stream())>>>(payload);
0249 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0250 vecmem::device_vector<unsigned int> d_eta_sums(payload.eta_node_counter);
0251 thrust::inclusive_scan(
0252 thrust::cuda::par_nosync(std::pmr::polymorphic_allocator(&(mr().main)))
0253 .on(details::get_stream(stream())),
0254 d_eta_sums.begin(), d_eta_sums.end(), d_eta_sums.begin());
0255 }
0256
0257 void gbts_seeding_algorithm::gbts_prefix_sum_eta_phi_bins_kernel(
0258 const device::gbts_prefix_sum_eta_phi_bins_payload& payload) const {
0259 const unsigned int n_threads = 128;
0260 const unsigned int n_blocks = 1 + (payload.nEtaBins - 1) / n_threads;
0261 kernels::gbts_prefix_sum_eta_phi_bins<<<n_blocks, n_threads, 0,
0262 details::get_stream(stream())>>>(
0263 payload);
0264 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0265 }
0266
0267 void gbts_seeding_algorithm::gbts_sort_nodes_kernel(
0268 const device::gbts_sort_nodes_payload& payload) const {
0269 const unsigned int n_threads = 256;
0270 const unsigned int n_blocks = 1 + (payload.nNodes - 1) / n_threads;
0271 kernels::gbts_sort_nodes<<<n_blocks, n_threads, 0,
0272 details::get_stream(stream())>>>(payload);
0273 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0274 }
0275
0276 void gbts_seeding_algorithm::gbts_find_minmax_radius_kernel(
0277 const device::gbts_find_minmax_radius_payload& payload) const {
0278 const unsigned int n_threads = 128;
0279 const unsigned int n_blocks = 1 + (payload.nEtaBins - 1) / n_threads;
0280 kernels::gbts_find_minmax_radius<<<n_blocks, n_threads, 0,
0281 details::get_stream(stream())>>>(payload);
0282 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0283 }
0284
0285 void gbts_seeding_algorithm::gbts_make_graph_edges_kernel(
0286 const device::gbts_make_graph_edges_payload& payload) const {
0287 const unsigned int n_threads = 128;
0288 const unsigned int n_blocks = payload.nUsedBinPairs;
0289 kernels::gbts_make_graph_edges<<<n_blocks, n_threads, 0,
0290 details::get_stream(stream())>>>(payload);
0291 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0292 vecmem::device_vector<unsigned int> d_num_outgoing_edges(
0293 payload.num_outgoing_edges);
0294 thrust::inclusive_scan(
0295 thrust::cuda::par_nosync(std::pmr::polymorphic_allocator(&(mr().main)))
0296 .on(details::get_stream(stream())),
0297 d_num_outgoing_edges.begin(), d_num_outgoing_edges.end(),
0298 d_num_outgoing_edges.begin());
0299 }
0300
0301 void gbts_seeding_algorithm::gbts_link_graph_edges_kernel(
0302 const device::gbts_link_graph_edges_payload& payload) const {
0303 const unsigned int n_threads = 256;
0304 const unsigned int n_blocks = 1 + (payload.nEdges - 1) / n_threads;
0305 kernels::gbts_link_graph_edges<<<n_blocks, n_threads, 0,
0306 details::get_stream(stream())>>>(payload);
0307 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0308 }
0309
0310 void gbts_seeding_algorithm::gbts_match_graph_edges_kernel(
0311 const device::gbts_match_graph_edges_payload& payload) const {
0312 const unsigned int n_threads = 256;
0313 const unsigned int n_blocks = 1 + (payload.nEdges - 1) / n_threads;
0314 kernels::gbts_match_graph_edges<<<n_blocks, n_threads, 0,
0315 details::get_stream(stream())>>>(payload);
0316 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0317 }
0318
0319 void gbts_seeding_algorithm::gbts_reindex_edges_kernel(
0320 const device::gbts_reindex_edges_payload& payload) const {
0321 const unsigned int n_threads = 256;
0322 const unsigned int n_blocks = 1 + (payload.nEdges - 1) / n_threads;
0323 kernels::gbts_reindex_edges<<<n_blocks, n_threads, 0,
0324 details::get_stream(stream())>>>(payload);
0325 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0326 }
0327
0328 void gbts_seeding_algorithm::gbts_compress_graph_kernel(
0329 const device::gbts_compress_graph_payload& payload) const {
0330 const unsigned int n_threads = 256;
0331 const unsigned int n_blocks = 1 + (payload.nEdges - 1) / n_threads;
0332 kernels::gbts_compress_graph<<<n_blocks, n_threads, 0,
0333 details::get_stream(stream())>>>(payload);
0334 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0335 }
0336
0337 void gbts_seeding_algorithm::gbts_run_cca_iteration_kernel(
0338 const device::gbts_run_cca_iteration_payload& payload) const {
0339 const unsigned int n_threads = 128;
0340 const unsigned int n_blocks = 1 + (payload.nConnectedEdges - 1) / n_threads;
0341
0342 kernels::gbts_run_cca_iteration<<<n_blocks, n_threads, 0,
0343 details::get_stream(stream())>>>(payload);
0344 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0345 }
0346
0347 void gbts_seeding_algorithm::gbts_count_terminus_edges_kernel(
0348 const device::gbts_count_terminus_edges_payload& payload) const {
0349 const unsigned int n_threads = 128;
0350 const unsigned int n_blocks = 1 + (payload.nConnectedEdges - 1) / n_threads;
0351 kernels::gbts_count_terminus_edges<<<n_blocks, n_threads, 0,
0352 details::get_stream(stream())>>>(
0353 payload);
0354 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0355 }
0356
0357 void gbts_seeding_algorithm::gbts_add_terminus_to_path_store_kernel(
0358 const device::gbts_add_terminus_to_path_store_payload& payload) const {
0359 const unsigned int n_threads = 128;
0360 const unsigned int n_blocks = 1 + (payload.nConnectedEdges - 1) / n_threads;
0361 kernels::gbts_add_terminus_to_path_store<<<n_blocks, n_threads, 0,
0362 details::get_stream(stream())>>>(
0363 payload);
0364 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0365 }
0366
0367 void gbts_seeding_algorithm::gbts_fill_path_store_kernel(
0368 const device::gbts_fill_path_store_payload& payload) const {
0369 const unsigned int n_threads = 128;
0370 const unsigned int pathsPerTerminus =
0371 1 + (payload.nPaths - 1) / payload.nTerminusEdges;
0372 const unsigned int terminusPerBlock = std::min(
0373 n_threads, 1 + (traccc::device::gbts_consts::live_path_buffer - 1) /
0374 pathsPerTerminus);
0375 const unsigned int n_blocks =
0376 1 + (payload.nTerminusEdges - 1) / terminusPerBlock;
0377 kernels::gbts_fill_path_store<<<n_blocks, n_threads, 0,
0378 details::get_stream(stream())>>>(payload);
0379 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0380 }
0381
0382 void gbts_seeding_algorithm::gbts_fit_segments_kernel(
0383 const device::gbts_fit_segments_payload& payload) const {
0384 const unsigned int n_threads = 128;
0385 const unsigned int n_blocks = 1 + (payload.nPaths - 1) / n_threads;
0386 kernels::gbts_fit_segments<<<n_blocks, n_threads, 0,
0387 details::get_stream(stream())>>>(payload);
0388 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0389 }
0390
0391 void gbts_seeding_algorithm::gbts_reset_edge_bids_kernel(
0392 const device::gbts_reset_edge_bids_payload& payload) const {
0393 const unsigned int n_threads = 128;
0394 const unsigned int n_blocks = 1 + (payload.nProps - 1) / n_threads;
0395 kernels::gbts_reset_edge_bids<<<n_blocks, n_threads, 0,
0396 details::get_stream(stream())>>>(payload);
0397 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0398 }
0399
0400 void gbts_seeding_algorithm::gbts_rebid_seeds_for_edges_kernel(
0401 const device::gbts_rebid_seeds_for_edges_payload& payload) const {
0402 const unsigned int n_threads = 128;
0403 const unsigned int n_blocks = 1 + (payload.nProps - 1) / n_threads;
0404 kernels::gbts_rebid_seeds_for_edges<<<n_blocks, n_threads, 0,
0405 details::get_stream(stream())>>>(
0406 payload);
0407 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0408 }
0409
0410 void gbts_seeding_algorithm::gbts_bid_seeds_for_hits_kernel(
0411 const device::gbts_bid_seeds_for_hits_payload& payload) const {
0412 const unsigned int n_threads = 128;
0413 const unsigned int n_blocks = 1 + (payload.nProps - 1) / n_threads;
0414 kernels::gbts_bid_seeds_for_hits<<<n_blocks, n_threads, 0,
0415 details::get_stream(stream())>>>(payload);
0416 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0417 }
0418
0419 void gbts_seeding_algorithm::gbts_convert_seeds_kernel(
0420 const device::gbts_convert_seeds_payload& payload) const {
0421 const unsigned int n_threads = 128;
0422 const unsigned int n_blocks = 1 + (payload.nProps - 1) / n_threads;
0423 kernels::gbts_convert_seeds<<<n_blocks, n_threads, 0,
0424 details::get_stream(stream())>>>(payload);
0425 TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
0426 }
0427
0428 }