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