From 2293936806b9900eb6ab535fe4b3b2f705ad46e4 Mon Sep 17 00:00:00 2001 From: Sam Yates <halfflat@gmail.com> Date: Mon, 3 Feb 2020 11:58:37 +0100 Subject: [PATCH] Replace unnecessary cv_policy copy in fvm_discretize. (#950) Also: add a couple more cases to fvm_discretize ubench. --- arbor/fvm_layout.cpp | 7 ++++--- test/ubench/fvm_discretize.cpp | 29 +++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/arbor/fvm_layout.cpp b/arbor/fvm_layout.cpp index 9ca781a2..1d5415c7 100644 --- a/arbor/fvm_layout.cpp +++ b/arbor/fvm_layout.cpp @@ -351,9 +351,10 @@ fvm_cv_discretization fvm_cv_discretize(const cable_cell& cell, const cable_cell const auto& dflt = cell.default_parameters; fvm_cv_discretization D; - cv_policy pol = (dflt.discretization | global_dflt.discretization).value_or(default_cv_policy()); - locset cv_ends = pol.cv_boundary_points(cell); - D.geometry = cv_geometry_from_ends(cell, cv_ends); + D.geometry = cv_geometry_from_ends(cell, + dflt.discretization? dflt.discretization->cv_boundary_points(cell): + global_dflt.discretization? global_dflt.discretization->cv_boundary_points(cell): + default_cv_policy().cv_boundary_points(cell)); if (D.geometry.empty()) return D; diff --git a/test/ubench/fvm_discretize.cpp b/test/ubench/fvm_discretize.cpp index 42a39b05..0c826373 100644 --- a/test/ubench/fvm_discretize.cpp +++ b/test/ubench/fvm_discretize.cpp @@ -50,6 +50,19 @@ void run_cv_geom_every_sample(benchmark::State& state) { } } +void run_cv_geom_explicit(benchmark::State& state) { + auto gdflt = neuron_parameter_defaults; + + cable_cell c(from_swc(SWCFILE)); + + while (state.KeepRunning()) { + auto ends = cv_policy_every_sample().cv_boundary_points(c); + auto ends2 = cv_policy_explicit(std::move(ends)).cv_boundary_points(c); + + benchmark::DoNotOptimize(cv_geometry_from_ends(c, ends2)); + } +} + void run_discretize(benchmark::State& state) { auto gdflt = neuron_parameter_defaults; const std::size_t ncv_per_branch = state.range(0); @@ -73,10 +86,26 @@ void run_discretize_every_sample(benchmark::State& state) { } } +void run_discretize_explicit(benchmark::State& state) { + auto gdflt = neuron_parameter_defaults; + + cable_cell c(from_swc(SWCFILE)); + + while (state.KeepRunning()) { + auto ends = cv_policy_every_sample().cv_boundary_points(c); + c.default_parameters.discretization = cv_policy_explicit(std::move(ends)); + + benchmark::DoNotOptimize(fvm_cv_discretize(c, gdflt)); + } +} + BENCHMARK(run_cv_geom)->RangeMultiplier(2)->Range(1,32)->Unit(benchmark::kMicrosecond); BENCHMARK(run_discretize)->RangeMultiplier(2)->Range(1,32)->Unit(benchmark::kMicrosecond); BENCHMARK(run_cv_geom_every_sample)->Unit(benchmark::kMillisecond); BENCHMARK(run_discretize_every_sample)->Unit(benchmark::kMillisecond); +BENCHMARK(run_cv_geom_explicit)->Unit(benchmark::kMillisecond); +BENCHMARK(run_discretize_explicit)->Unit(benchmark::kMillisecond); + BENCHMARK_MAIN(); -- GitLab