@@ -35,30 +35,61 @@ auto toy_cfg =
3535 toy_det_config{}.n_brl_layers(4u ).n_edc_layers(7u ).do_check(false );
3636
3737void fill_tracks (vecmem::vector<free_track_parameters<algebra_t >> &tracks,
38- const std::size_t theta_steps, const std::size_t phi_steps) {
39- // Set momentum of tracks
40- const scalar mom_mag{10 .f * unit<scalar>::GeV};
38+ const std::size_t n_tracks, bool do_sort = true ) {
39+ using scalar_t = dscalar<algebra_t >;
40+ using uniform_gen_t =
41+ detail::random_numbers<scalar_t ,
42+ std::uniform_real_distribution<scalar_t >>;
43+ using trk_generator_t =
44+ random_track_generator<free_track_parameters<algebra_t >, uniform_gen_t >;
45+
46+ trk_generator_t ::configuration trk_gen_cfg{};
47+ trk_gen_cfg.seed (42u );
48+ trk_gen_cfg.n_tracks (n_tracks);
49+ trk_gen_cfg.randomize_charge (true );
50+ trk_gen_cfg.phi_range (-constant<scalar_t >::pi, constant<scalar_t >::pi);
51+ trk_gen_cfg.eta_range (-3 .f , 3 .f );
52+ trk_gen_cfg.mom_range (1 .f * unit<scalar_t >::GeV,
53+ 100 .f * unit<scalar_t >::GeV);
54+ trk_gen_cfg.origin ({0 .f , 0 .f , 0 .f });
55+ trk_gen_cfg.origin_stddev ({0 .f * unit<scalar_t >::mm,
56+ 0 .f * unit<scalar_t >::mm,
57+ 0 .f * unit<scalar_t >::mm});
4158
4259 // Iterate through uniformly distributed momentum directions
43- for (auto traj : uniform_track_generator<free_track_parameters<algebra_t >>(
44- phi_steps, theta_steps, mom_mag)) {
60+ for (auto traj : trk_generator_t {trk_gen_cfg}) {
4561 tracks.push_back (traj);
4662 }
63+
64+ if (do_sort) {
65+ // Sort by theta angle
66+ const auto traj_comp = [](const auto &lhs, const auto &rhs) {
67+ constexpr auto pi_2{constant<scalar_t >::pi_2};
68+ return math::fabs (pi_2 - getter::theta (lhs.dir ())) <
69+ math::fabs (pi_2 - getter::theta (rhs.dir ()));
70+ };
71+
72+ std::ranges::sort (tracks, traj_comp);
73+ }
4774}
4875
4976template <propagate_option opt>
5077static void BM_PROPAGATOR_CUDA (benchmark::State &state) {
5178
79+ std::size_t n_tracks{static_cast <std::size_t >(state.range (0 )) *
80+ static_cast <std::size_t >(state.range (0 ))};
81+
5282 // Create the toy geometry
53- auto [det, names] = build_toy_detector (bp_mng_mr , toy_cfg);
83+ auto [det, names] = build_toy_detector (host_mr , toy_cfg);
5484 test::vector3 B{0 .f , 0 .f , 2 .f * unit<scalar>::T};
5585 auto bfield = bfield::create_const_field (B);
5686
57- // Get detector data
58- auto det_data = detray::get_data (det);
59-
6087 // vecmem copy helper object
61- vecmem::cuda::copy copy;
88+ vecmem::cuda::copy cuda_cpy;
89+
90+ // Copy detector to device
91+ auto det_buff = detray::get_buffer (det, dev_mr, cuda_cpy);
92+ auto det_view = detray::get_data (det_buff);
6293
6394 std::size_t total_tracks = 0 ;
6495
@@ -68,8 +99,7 @@ static void BM_PROPAGATOR_CUDA(benchmark::State &state) {
6899
69100 // Get tracks
70101 vecmem::vector<free_track_parameters<algebra_t >> tracks (&bp_mng_mr);
71- fill_tracks (tracks, static_cast <std::size_t >(state.range (0 )),
72- static_cast <std::size_t >(state.range (0 )));
102+ fill_tracks (tracks, n_tracks);
73103
74104 total_tracks += tracks.size ();
75105
@@ -79,7 +109,7 @@ static void BM_PROPAGATOR_CUDA(benchmark::State &state) {
79109 auto tracks_data = vecmem::get_data (tracks);
80110
81111 // Run the propagator test for GPU device
82- propagator_benchmark (det_data , bfield, tracks_data, opt);
112+ propagator_benchmark (det_view , bfield, tracks_data, opt);
83113 }
84114
85115 state.counters [" TracksPropagated" ] = benchmark::Counter (
0 commit comments