@@ -35,30 +35,58 @@ 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.phi_range (-constant<scalar_t >::pi, constant<scalar_t >::pi);
50+ trk_gen_cfg.eta_range (-4 .f , 4 .f );
51+ trk_gen_cfg.mom_range (1 .f * unit<scalar_t >::GeV,
52+ 10 .f * unit<scalar_t >::GeV);
53+ trk_gen_cfg.origin ({0 .f , 0 .f , 0 .f });
54+ trk_gen_cfg.origin_stddev ({0 .f * unit<scalar_t >::mm,
55+ 0 .f * unit<scalar_t >::mm,
56+ 0 .f * unit<scalar_t >::mm});
4157
4258 // 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)) {
59+ for (auto traj : trk_generator_t {trk_gen_cfg}) {
4560 tracks.push_back (traj);
4661 }
62+
63+ if (do_sort) {
64+ // Sort by theta angle
65+ const auto traj_comp = [](const auto &lhs, const auto &rhs) {
66+ return getter::theta (lhs.dir ()) < getter::theta (rhs.dir ());
67+ };
68+
69+ std::ranges::sort (tracks, traj_comp);
70+ }
4771}
4872
4973template <propagate_option opt>
5074static void BM_PROPAGATOR_CUDA (benchmark::State &state) {
5175
76+ std::size_t n_tracks{static_cast <std::size_t >(state.range (0 )) *
77+ static_cast <std::size_t >(state.range (0 ))};
78+
5279 // Create the toy geometry
53- auto [det, names] = build_toy_detector (bp_mng_mr , toy_cfg);
80+ auto [det, names] = build_toy_detector (host_mr , toy_cfg);
5481 test::vector3 B{0 .f , 0 .f , 2 .f * unit<scalar>::T};
5582 auto bfield = bfield::create_const_field (B);
5683
57- // Get detector data
58- auto det_data = detray::get_data (det);
59-
6084 // vecmem copy helper object
61- vecmem::cuda::copy copy;
85+ vecmem::cuda::copy cuda_cpy;
86+
87+ // Copy detector to device
88+ auto det_buff = detray::get_buffer (det, dev_mr, cuda_cpy);
89+ auto det_view = detray::get_data (det_buff);
6290
6391 std::size_t total_tracks = 0 ;
6492
@@ -68,8 +96,7 @@ static void BM_PROPAGATOR_CUDA(benchmark::State &state) {
6896
6997 // Get tracks
7098 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 )));
99+ fill_tracks (tracks, n_tracks);
73100
74101 total_tracks += tracks.size ();
75102
@@ -79,7 +106,7 @@ static void BM_PROPAGATOR_CUDA(benchmark::State &state) {
79106 auto tracks_data = vecmem::get_data (tracks);
80107
81108 // Run the propagator test for GPU device
82- propagator_benchmark (det_data , bfield, tracks_data, opt);
109+ propagator_benchmark (det_view , bfield, tracks_data, opt);
83110 }
84111
85112 state.counters [" TracksPropagated" ] = benchmark::Counter (
0 commit comments