diff --git a/arbor/fvm_layout.cpp b/arbor/fvm_layout.cpp index 9ca781a205f3cb02173207b517f4c53aa84eecd6..1d5415c7d9297d3c134b3910c63489e90e3b5886 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 42a39b05c3f8fb9744590ceef0f3b2c0baa57667..0c8263730e544d59793cc18f6ad0d9e639f6bc69 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();