@@ -35,30 +35,61 @@ auto toy_cfg =
35
35
toy_det_config{}.n_brl_layers(4u ).n_edc_layers(7u ).do_check(false );
36
36
37
37
void 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 (-3 .f , 3 .f );
51
+ trk_gen_cfg.mom_range (1 .f * unit<scalar_t >::GeV,
52
+ 100 .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});
41
57
42
58
// 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}) {
45
60
tracks.push_back (traj);
46
61
}
62
+
63
+ if (do_sort) {
64
+ // Sort by theta angle
65
+ const auto traj_comp = [](const auto &lhs, const auto &rhs) {
66
+ constexpr auto pi_2{constant<scalar_t >::pi_2};
67
+ return math::fabs (pi_2 - getter::theta (lhs.dir ())) <
68
+ math::fabs (pi_2 - getter::theta (lhs.dir ()));
69
+ // return getter::theta(lhs.dir()) < getter::theta(lhs.dir());
70
+ };
71
+
72
+ std::ranges::sort (tracks, traj_comp);
73
+ }
47
74
}
48
75
49
76
template <propagate_option opt>
50
77
static void BM_PROPAGATOR_CUDA (benchmark::State &state) {
51
78
79
+ std::size_t n_tracks{static_cast <std::size_t >(state.range (0 )) *
80
+ static_cast <std::size_t >(state.range (0 ))};
81
+
52
82
// 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);
54
84
test::vector3 B{0 .f , 0 .f , 2 .f * unit<scalar>::T};
55
85
auto bfield = bfield::create_const_field (B);
56
86
57
- // Get detector data
58
- auto det_data = detray::get_data (det);
59
-
60
87
// 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);
62
93
63
94
std::size_t total_tracks = 0 ;
64
95
@@ -68,8 +99,7 @@ static void BM_PROPAGATOR_CUDA(benchmark::State &state) {
68
99
69
100
// Get tracks
70
101
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);
73
103
74
104
total_tracks += tracks.size ();
75
105
@@ -79,7 +109,7 @@ static void BM_PROPAGATOR_CUDA(benchmark::State &state) {
79
109
auto tracks_data = vecmem::get_data (tracks);
80
110
81
111
// 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);
83
113
}
84
114
85
115
state.counters [" TracksPropagated" ] = benchmark::Counter (
0 commit comments