Skip to content

Commit 2d2a7cb

Browse files
committed
Use random, but sorted tracks for benchmarks and copy the detector to device
1 parent 9c0f9af commit 2d2a7cb

File tree

2 files changed

+79
-20
lines changed

2 files changed

+79
-20
lines changed

tests/benchmarks/cpu/benchmark_propagator.cpp

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -76,20 +76,50 @@ 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(-3.f, 3.f);
92+
trk_gen_cfg.mom_range(1.f * unit<scalar_t>::GeV,
93+
100.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+
constexpr auto pi_2{constant<scalar_t>::pi_2};
108+
return math::fabs(pi_2 - getter::theta(lhs.dir())) <
109+
math::fabs(pi_2 - getter::theta(lhs.dir()));
110+
// return getter::theta(lhs.dir()) < getter::theta(lhs.dir());
111+
};
112+
113+
std::ranges::sort(tracks, traj_comp);
114+
}
88115
}
89116

90117
template <propagate_option opt>
91118
static void BM_PROPAGATOR_CPU(benchmark::State &state) {
92119

120+
std::size_t n_tracks{static_cast<std::size_t>(state.range(0)) *
121+
static_cast<std::size_t>(state.range(0))};
122+
93123
// Create the toy geometry and bfield
94124
auto [det, names] = build_toy_detector(host_mr, toy_cfg);
95125
test::vector3 B{0.f, 0.f, 2.f * unit<scalar>::T};
@@ -109,8 +139,7 @@ static void BM_PROPAGATOR_CPU(benchmark::State &state) {
109139

110140
// Get tracks
111141
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)));
142+
fill_tracks(tracks, n_tracks);
114143

115144
total_tracks += tracks.size();
116145

tests/benchmarks/cuda/benchmark_propagator_cuda.cpp

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -35,30 +35,61 @@ 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(-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});
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+
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+
}
4774
}
4875

4976
template <propagate_option opt>
5077
static 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

Comments
 (0)