1 #include "bench/Session.h"
2 #include "gravity/BarnesHut.h"
3 #include "gravity/BruteForceGravity.h"
4 #include "gravity/Moments.h"
5 #include "system/Settings.h"
6 #include "tests/Setup.h"
7 #include "thread/Tbb.h"
8 
9 using namespace Sph;
10 
benchmarkGravity(IGravity & gravity,const Size N,Benchmark::Context & context)11 static void benchmarkGravity(IGravity& gravity, const Size N, Benchmark::Context& context) {
12     BodySettings settings;
13     settings.set(BodySettingsId::DENSITY, 100._f)
14         .set(BodySettingsId::ENERGY, 10._f)
15         .set(BodySettingsId::DISTRIBUTE_MODE_SPH5, true);
16     Storage storage = Tests::getGassStorage(N, settings, 5.e3_f);
17 
18     Tbb& pool = *Tbb::getGlobalInstance();
19     gravity.build(pool, storage);
20     Statistics stats;
21     ArrayView<Vector> dv = storage.getD2t<Vector>(QuantityId::POSITION);
22     while (context.running()) {
23         std::fill(dv.begin(), dv.end(), Vector(0._f));
24         gravity.evalSelfGravity(pool, dv, stats);
25         Benchmark::clobberMemory();
26     }
27 }
28 
29 BENCHMARK("BruteForceGravity", "[gravity]", Benchmark::Context& context) {
30     BruteForceGravity gravity;
31     benchmarkGravity(gravity, 10000, context);
32 }
33 
34 BENCHMARK("BarnesHut Octupole 0.2", "[gravity]", Benchmark::Context& context) {
35     BarnesHut gravity(0.2_f, MultipoleOrder::OCTUPOLE);
36     benchmarkGravity(gravity, 500000, context);
37 }
38 
39 BENCHMARK("BarnesHut Octupole 0.5", "[gravity]", Benchmark::Context& context) {
40     BarnesHut gravity(0.5_f, MultipoleOrder::OCTUPOLE);
41     benchmarkGravity(gravity, 500000, context);
42 }
43 
44 BENCHMARK("BarnesHut Octupole 0.8", "[gravity]", Benchmark::Context& context) {
45     BarnesHut gravity(0.8_f, MultipoleOrder::OCTUPOLE);
46     benchmarkGravity(gravity, 500000, context);
47 }
48 
49 BENCHMARK("BarnesHut Octupole 5", "[gravity]", Benchmark::Context& context) {
50     BarnesHut gravity(5._f, MultipoleOrder::OCTUPOLE);
51     benchmarkGravity(gravity, 500000, context);
52 }
53 
54 BENCHMARK("BarnesHut Monopole 0.2", "[gravity]", Benchmark::Context& context) {
55     BarnesHut gravity(0.2_f, MultipoleOrder::MONOPOLE);
56     benchmarkGravity(gravity, 500000, context);
57 }
58 
59 BENCHMARK("BarnesHut Monopole 0.5", "[gravity]", Benchmark::Context& context) {
60     BarnesHut gravity(0.5_f, MultipoleOrder::MONOPOLE);
61     benchmarkGravity(gravity, 500000, context);
62 }
63 
benchmarkGravity(IGravity & gravity,IScheduler & scheduler,Benchmark::Context & context)64 static void benchmarkGravity(IGravity& gravity, IScheduler& scheduler, Benchmark::Context& context) {
65     BodySettings settings;
66     settings.set(BodySettingsId::DENSITY, 100._f).set(BodySettingsId::ENERGY, 10._f);
67     Storage storage = Tests::getGassStorage(1000000, settings, 5.e3_f);
68 
69     while (context.running()) {
70         gravity.build(scheduler, storage);
71         Benchmark::clobberMemory();
72     }
73 }
74 
75 BENCHMARK("BarnesHut build Sequential", "[gravity]", Benchmark::Context& context) {
76     BarnesHut gravity(0.5_f, MultipoleOrder::OCTUPOLE);
77     benchmarkGravity(gravity, SEQUENTIAL, context);
78 }
79 
80 BENCHMARK("BarnesHut build ThreadPool", "[gravity]", Benchmark::Context& context) {
81     BarnesHut gravity(0.5_f, MultipoleOrder::OCTUPOLE);
82     benchmarkGravity(gravity, *ThreadPool::getGlobalInstance(), context);
83 }
84 
85 BENCHMARK("BarnesHut build Tbb", "[gravity]", Benchmark::Context& context) {
86     BarnesHut gravity(0.5_f, MultipoleOrder::OCTUPOLE);
87     benchmarkGravity(gravity, *Tbb::getGlobalInstance(), context);
88 }
89