Skip to content

Commit 03e102d

Browse files
committed
Use random, but sorted tracks for benchmarks and copy the detector to device
1 parent ee69f28 commit 03e102d

File tree

2 files changed

+73
-20
lines changed

2 files changed

+73
-20
lines changed

tests/benchmarks/cpu/benchmark_propagator.cpp

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -76,20 +76,47 @@ auto toy_cfg =
7676
toy_det_config{}.n_brl_layers(4u).n_edc_layers(7u).do_check(false);
7777

7878
void fill_tracks(vecmem::vector<free_track_parameters<algebra_t>> &tracks,
79-
const std::size_t theta_steps, const std::size_t phi_steps) {
80-
// Set momentum of tracks
81-
const scalar mom_mag{10.f * unit<scalar>::GeV};
79+
const std::size_t n_tracks, bool do_sort = true) {
80+
using scalar_t = dscalar<algebra_t>;
81+
using uniform_gen_t =
82+
detail::random_numbers<scalar_t,
83+
std::uniform_real_distribution<scalar_t>>;
84+
using trk_generator_t =
85+
random_track_generator<free_track_parameters<algebra_t>, uniform_gen_t>;
86+
87+
trk_generator_t::configuration trk_gen_cfg{};
88+
trk_gen_cfg.seed(42u);
89+
trk_gen_cfg.n_tracks(n_tracks);
90+
trk_gen_cfg.phi_range(-constant<scalar_t>::pi, constant<scalar_t>::pi);
91+
trk_gen_cfg.eta_range(-4.f, 4.f);
92+
trk_gen_cfg.mom_range(1.f * unit<scalar_t>::GeV,
93+
10.f * unit<scalar_t>::GeV);
94+
trk_gen_cfg.origin({0.f, 0.f, 0.f});
95+
trk_gen_cfg.origin_stddev({0.f * unit<scalar_t>::mm,
96+
0.f * unit<scalar_t>::mm,
97+
0.f * unit<scalar_t>::mm});
8298

8399
// Iterate through uniformly distributed momentum directions
84-
for (auto traj : uniform_track_generator<free_track_parameters<algebra_t>>(
85-
phi_steps, theta_steps, mom_mag)) {
100+
for (auto traj : trk_generator_t{trk_gen_cfg}) {
86101
tracks.push_back(traj);
87102
}
103+
104+
if (do_sort) {
105+
// Sort by theta angle
106+
const auto traj_comp = [](const auto &lhs, const auto &rhs) {
107+
return getter::theta(lhs.dir()) < getter::theta(rhs.dir());
108+
};
109+
110+
std::ranges::sort(tracks, traj_comp);
111+
}
88112
}
89113

90114
template <propagate_option opt>
91115
static void BM_PROPAGATOR_CPU(benchmark::State &state) {
92116

117+
std::size_t n_tracks{static_cast<std::size_t>(state.range(0)) *
118+
static_cast<std::size_t>(state.range(0))};
119+
93120
// Create the toy geometry and bfield
94121
auto [det, names] = build_toy_detector(host_mr, toy_cfg);
95122
test::vector3 B{0.f, 0.f, 2.f * unit<scalar>::T};
@@ -109,8 +136,7 @@ static void BM_PROPAGATOR_CPU(benchmark::State &state) {
109136

110137
// Get tracks
111138
vecmem::vector<free_track_parameters<algebra_t>> tracks(&host_mr);
112-
fill_tracks(tracks, static_cast<std::size_t>(state.range(0)),
113-
static_cast<std::size_t>(state.range(0)));
139+
fill_tracks(tracks, n_tracks);
114140

115141
total_tracks += tracks.size();
116142

tests/benchmarks/cuda/benchmark_propagator_cuda.cpp

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -35,30 +35,58 @@ auto toy_cfg =
3535
toy_det_config{}.n_brl_layers(4u).n_edc_layers(7u).do_check(false);
3636

3737
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(-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

4973
template <propagate_option opt>
5074
static 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

Comments
 (0)