Skip to content

Commit f288947

Browse files
authored
fix: benchmark script (#922)
Contains several small benchmark fixes: - Pass the logging service correctly in benchmark script - Ensure that all track samples contain different track even though they are generated from the same generator - Add the detector config to the benchmark context and add that information to the plot labels
1 parent 9238fb6 commit f288947

File tree

5 files changed

+128
-31
lines changed

5 files changed

+128
-31
lines changed

tests/benchmarks/include/detray/benchmarks/propagation_benchmark_utils.hpp

+22-13
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,8 @@ inline typename track_generator_t::configuration get_default_trk_gen_config(
6363
/// @param cfg the configuration of the track generator
6464
/// @param do_sort sort the tracks by theta angle
6565
template <typename track_generator_t>
66-
inline auto generate_tracks(
67-
vecmem::memory_resource *mr,
68-
const typename track_generator_t::configuration &cfg = {},
69-
bool do_sort = true) {
66+
inline auto generate_tracks(vecmem::memory_resource *mr, track_generator_t &gen,
67+
bool do_sort = true) {
7068

7169
using track_t = typename track_generator_t::track_type;
7270
using scalar_t = dscalar<typename track_t::algebra_type>;
@@ -75,7 +73,7 @@ inline auto generate_tracks(
7573
dvector<track_t> tracks(mr);
7674

7775
// Iterate through uniformly distributed momentum directions
78-
for (auto track : track_generator_t{cfg}) {
76+
for (auto track : gen) {
7977
// Put it into vector of trajectories
8078
tracks.push_back(track);
8179
}
@@ -95,27 +93,38 @@ inline auto generate_tracks(
9593
}
9694

9795
/// Generate as many samples of track states as there are entries in the
98-
/// @param n_tracks vector.
96+
/// @param n_tracks vector using and externally provided track generator
97+
/// @param gen
9998
template <typename track_generator_t>
100-
inline auto generate_track_samples(
101-
vecmem::memory_resource *mr, const std::vector<int> &n_tracks,
102-
typename track_generator_t::configuration &cfg = {}, bool do_sort = true) {
99+
inline auto generate_track_samples(vecmem::memory_resource *mr,
100+
const std::vector<int> &n_tracks,
101+
track_generator_t &gen,
102+
bool do_sort = true) {
103103

104104
using track_t = typename track_generator_t::track_type;
105105

106106
std::vector<dvector<track_t>> track_samples{};
107107
track_samples.reserve(n_tracks.size());
108108

109-
auto tmp_cfg{cfg};
110109
for (const int n : n_tracks) {
111-
tmp_cfg.n_tracks(static_cast<std::size_t>(n));
112-
track_samples.push_back(
113-
generate_tracks<track_generator_t>(mr, tmp_cfg, do_sort));
110+
gen.config().n_tracks(static_cast<std::size_t>(n));
111+
track_samples.push_back(generate_tracks(mr, gen, do_sort));
114112
}
115113

116114
return track_samples;
117115
}
118116

117+
/// Generate as many samples of track states as there are entries in the
118+
/// @param n_tracks vector
119+
template <typename track_generator_t>
120+
inline auto generate_track_samples(
121+
vecmem::memory_resource *mr, const std::vector<int> &n_tracks,
122+
typename track_generator_t::configuration &cfg = {}, bool do_sort = true) {
123+
124+
track_generator_t gen{cfg};
125+
return generate_track_samples(mr, n_tracks, gen, do_sort);
126+
}
127+
119128
/// Register a propagation benchmark of type @tparam benchmark_t
120129
///
121130
/// @tparam benchmark_t the propagation benchmark functor

tests/tools/python/propagation_benchmarks.py

+43-12
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,13 @@ def __read_context_metadata(logging, input_dir, data_file):
7070
bknd = context["Backend"]
7171
bknd_name = __compactify_bknd_name(context["Backend Name"])
7272
algebra = context["Algebra-plugin"]
73+
setup = context["Detector Setup"]
7374

74-
return bknd, bknd_name, algebra
75+
return bknd, bknd_name, algebra, setup
7576

7677

7778
# Parse and check the user provided input data files
78-
def __parse_input_data_files(args):
79+
def __parse_input_data_files(args, logging):
7980
input_data_files = []
8081
for file in args.data_files:
8182
if not os.path.isfile(file):
@@ -107,8 +108,8 @@ def __generate_benchmark_dict(
107108
# Bundle benchmark metadata
108109
benchmark_metadata = namedtuple(
109110
"benchmark_metadata",
110-
"name algebra bin file",
111-
defaults=["Unknown", "Unknown Algebra", None, None],
111+
"name algebra setup bin file",
112+
defaults=["Unknown", "Unknown Algebra", "", None, None],
112113
)
113114

114115
# Resulting dictionary
@@ -128,7 +129,7 @@ def __generate_benchmark_dict(
128129
# Add file to benchmark dict
129130
input_dir = os.path.dirname(f)
130131
file_name = os.path.basename(f)
131-
bknd, bknd_name, algebra = __read_context_metadata(
132+
bknd, bknd_name, algebra, setup = __read_context_metadata(
132133
logging, input_dir, file_name
133134
)
134135

@@ -141,7 +142,7 @@ def __generate_benchmark_dict(
141142
context, _ = read_benchmark_data(logging, input_dir, file_name)
142143
if bench_type in context["executable"]:
143144
benchmarks[bknd][bknd_name].append(
144-
benchmark_metadata(name=bknd_name, algebra=algebra, file=f)
145+
benchmark_metadata(name=bknd_name, algebra=algebra, setup=setup, file=f)
145146
)
146147

147148
# Register benchmarks to be run
@@ -189,14 +190,31 @@ def __generate_benchmark_dict(
189190
if algebra in registered_algebra:
190191
continue
191192

193+
# Parse the detector setup
194+
setup = ""
195+
add_delim = lambda s: s + ", "
196+
if not args.grid_file:
197+
setup = setup + "no grids"
198+
if not args.material_file:
199+
if len(setup) != 0:
200+
setup = add_delim(setup)
201+
setup = setup + "no mat."
202+
if not args.covariance_transport:
203+
if len(setup) != 0:
204+
setup = add_delim(setup)
205+
setup = setup + "no cov."
206+
192207
binary = (
193208
f"{bindir}/detray_propagation_{bench_type}_{bknd.lower()}_{algebra}"
194209
)
195210
file_bknd_name = bknd_name.replace(" ", "_")
196-
data_file = f"{det_name}_{bench_type}_{bknd.lower()}_{file_bknd_name}_{algebra}.json"
211+
file_setup = setup.replace(" ", "_")
212+
file_setup = file_setup.replace(",", "")
213+
file_setup = file_setup.replace(".", "")
214+
data_file = f"{det_name}_{bench_type}_{bknd.lower()}_{file_bknd_name}_{algebra}_{file_setup}.json"
197215

198216
metadata = benchmark_metadata(
199-
name=bknd_name, algebra=algebra, file=data_file
217+
name=bknd_name, algebra=algebra, setup=setup, file=data_file
200218
)
201219

202220
# If the results should not be read from file, run the benchmark
@@ -314,7 +332,7 @@ def __main__():
314332
logging.debug("Detector: " + det_name)
315333

316334
# Check user provided benchmark result files
317-
input_data_files = __parse_input_data_files(args)
335+
input_data_files = __parse_input_data_files(args, logging)
318336

319337
# Unique set of algebra plugins to be included in the plots
320338
algebra_plugins = set(args.algebra_plugins)
@@ -368,14 +386,23 @@ def __main__():
368386

369387
plot_factory = plt_factory(out_dir, logging)
370388

389+
def make_label(algebra, setup):
390+
label = f"{algebra}"
391+
if len(setup) != 0:
392+
label = label + f" ({setup})"
393+
return label
394+
371395
# Plot all data files per hardware backend
372396
# (comparison of different algebra-plugins)
373397
for bknd, metadata_dict in benchmarks.items():
374398
for bknd_name, metadata_list in metadata_dict.items():
375399
for metadata in metadata_list:
376400
# Get file list and plot labels
377401
files = [metadata.file for metadata in metadata_list]
378-
plot_labels = [metadata.algebra for metadata in metadata_list]
402+
plot_labels = [
403+
make_label(metadata.algebra, metadata.setup)
404+
for metadata in metadata_list
405+
]
379406

380407
file_bknd_name = bknd_name.replace(" ", "_")
381408
plot_benchmark_data(
@@ -412,7 +439,8 @@ def __main__():
412439
for metadata in metadata_list:
413440
if algebra == metadata.algebra:
414441
data_files_per_plugin.append(metadata.file)
415-
plot_labels.append(f"{bknd}: {bknd_name}")
442+
label = make_label(f"{bknd}: {bknd_name}", metadata.setup)
443+
plot_labels.append(label)
416444

417445
plot_benchmark_data(
418446
logging,
@@ -432,7 +460,10 @@ def __main__():
432460
for metadata in metadata_list:
433461
# Get file list and plot labels
434462
files = [metadata.file for metadata in metadata_list]
435-
plot_labels = [metadata.algebra for metadata in metadata_list]
463+
plot_labels = [
464+
make_label(metadata.algebra, metadata.setup)
465+
for metadata in metadata_list
466+
]
436467

437468
plot_scaling_data(
438469
logging,

tests/tools/src/cpu/propagation_benchmark.cpp

+19
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,19 @@ int main(int argc, char** argv) {
114114
proc_name = vm["bknd_name"].as<std::string>();
115115
}
116116

117+
// String that describes the detector setup
118+
std::string setup_str{};
119+
auto add_delim = [](std::string& str) { str += ", "; };
120+
if (!vm.count("grid_file")) {
121+
setup_str += "no grids";
122+
}
123+
if (!vm.count("material_file")) {
124+
if (!setup_str.empty()) {
125+
add_delim(setup_str);
126+
}
127+
setup_str += "no mat.";
128+
}
129+
117130
//
118131
// Prepare data
119132
//
@@ -162,13 +175,19 @@ int main(int argc, char** argv) {
162175
detray::benchmarks::host_propagation_bm, stepper_t, empty_chain_t>(
163176
det_name, bench_cfg, prop_cfg, det, bfield, &empty_state,
164177
track_samples, n_tracks);
178+
179+
if (!setup_str.empty()) {
180+
add_delim(setup_str);
181+
}
182+
setup_str += "no cov.";
165183
}
166184

167185
// These fields are needed by the plotting scripts, even if undefined
168186
::benchmark::AddCustomContext("Backend", "CPU");
169187
::benchmark::AddCustomContext("Backend Name", proc_name);
170188
::benchmark::AddCustomContext("Algebra-plugin",
171189
detray::types::get_name<test_algebra>());
190+
::benchmark::AddCustomContext("Detector Setup", setup_str);
172191

173192
// Run benchmarks
174193
::benchmark::RunSpecifiedBenchmarks();

tests/tools/src/cpu/propagation_scaling.cpp

+25-6
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,19 @@ int main(int argc, char** argv) {
135135
proc_name = vm["bknd_name"].as<std::string>();
136136
}
137137

138+
// String that describes the detector setup
139+
std::string setup_str{};
140+
auto add_delim = [](std::string& str) { str += ", "; };
141+
if (!vm.count("grid_file")) {
142+
setup_str += "no grids";
143+
}
144+
if (!vm.count("material_file")) {
145+
if (!setup_str.empty()) {
146+
add_delim(setup_str);
147+
}
148+
setup_str += "no mat.";
149+
}
150+
138151
//
139152
// Prepare data
140153
//
@@ -147,14 +160,14 @@ int main(int argc, char** argv) {
147160
const std::string& det_name = det.name(names);
148161

149162
// Generate the track samples for weak scaling
150-
auto track_samples_weak_sc =
151-
detray::benchmarks::generate_track_samples<track_generator_t>(
152-
&host_mr, n_tracks_weak_sc, trk_cfg, false);
163+
track_generator_t trk_gen{trk_cfg};
164+
auto track_samples_weak_sc = detray::benchmarks::generate_track_samples(
165+
&host_mr, n_tracks_weak_sc, trk_gen, false);
153166

154167
// Generate track sample for strong scaling
155-
trk_cfg.n_tracks(strong_sc_sample_size);
156-
auto single_sample = detray::benchmarks::generate_tracks<track_generator_t>(
157-
&host_mr, trk_cfg, false);
168+
trk_gen.config().n_tracks(strong_sc_sample_size);
169+
auto single_sample =
170+
detray::benchmarks::generate_tracks(&host_mr, trk_gen, false);
158171
std::vector<dvector<free_track_parameters_t>> track_samples_strong_sc{
159172
std::move(single_sample)};
160173

@@ -206,6 +219,11 @@ int main(int argc, char** argv) {
206219
det_name + "_STRONG-SCALING", bench_cfg, prop_cfg, det, bfield,
207220
&empty_state, track_samples_strong_sc, {strong_sc_sample_size},
208221
n_threads, max_chunk_size, sched_policy);
222+
223+
if (!setup_str.empty()) {
224+
add_delim(setup_str);
225+
}
226+
setup_str += "no cov.";
209227
}
210228

211229
// These fields are needed by the plotting scripts
@@ -215,6 +233,7 @@ int main(int argc, char** argv) {
215233
"Max no. Threads", std::to_string(std::thread::hardware_concurrency()));
216234
::benchmark::AddCustomContext("Algebra-plugin",
217235
detray::types::get_name<test_algebra>());
236+
::benchmark::AddCustomContext("Detector Setup", setup_str);
218237

219238
// Run benchmarks
220239
::benchmark::RunSpecifiedBenchmarks();

tests/tools/src/cuda/propagation_benchmark_cuda.cpp

+19
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,19 @@ int main(int argc, char** argv) {
109109
proc_name = vm["bknd_name"].as<std::string>();
110110
}
111111

112+
// String that describes the detector setup
113+
std::string setup_str{};
114+
auto add_delim = [](std::string& str) { str += ", "; };
115+
if (!vm.count("grid_file")) {
116+
setup_str += "no grids";
117+
}
118+
if (!vm.count("material_file")) {
119+
if (!setup_str.empty()) {
120+
add_delim(setup_str);
121+
}
122+
setup_str += "no mat.";
123+
}
124+
112125
//
113126
// Prepare data
114127
//
@@ -163,13 +176,19 @@ int main(int argc, char** argv) {
163176
detray::benchmarks::empty_chain>>(
164177
det_name, bench_cfg, prop_cfg, det, bfield, &empty_state,
165178
track_samples, n_tracks, &dev_mr);
179+
180+
if (!setup_str.empty()) {
181+
add_delim(setup_str);
182+
}
183+
setup_str += "no cov.";
166184
}
167185

168186
// These fields are needed by the plotting scripts, even if undefined
169187
::benchmark::AddCustomContext("Backend", "CUDA");
170188
::benchmark::AddCustomContext("Backend Name", proc_name);
171189
::benchmark::AddCustomContext("Algebra-plugin",
172190
detray::types::get_name<test_algebra>());
191+
::benchmark::AddCustomContext("Detector Setup", setup_str);
173192

174193
// Run benchmarks
175194
::benchmark::RunSpecifiedBenchmarks();

0 commit comments

Comments
 (0)