11
22#include < array>
33#include < benchmark/benchmark.h>
4+ #include < cmath>
45#include < experimental/random>
56
67#include < xtensor/xfixed.hpp>
2324// utils
2425
2526template <unsigned int dim>
26- auto cell_list_with_n_intervals (int64_t size)
27+ auto gen_regular_intervals = [] (int64_t size, unsigned int level = 0 )
2728{
2829 samurai::CellList<dim> cl;
30+
2931 for (int64_t i = 0 ; i < size; i++)
3032 {
3133 int index = static_cast <int >(i);
32- cl[0 ][{}].add_interval ({2 * index, 2 * index + 1 });
34+
35+ // Calcul des paramètres selon le niveau :
36+ // Niveau L : taille = 2^L, espacement = 2^(L+1)
37+ int interval_size = 1 << level; // 2^level
38+ int spacing = 1 << (level + 1 ); // 2^(level+1)
39+ int start = index * spacing;
40+ int end = start + interval_size;
41+
42+ if constexpr (dim == 1 )
43+ {
44+ cl[level][{}].add_interval ({start, end});
45+ }
46+ else if constexpr (dim == 2 )
47+ {
48+ for (int y = 0 ; y < size; ++y)
49+ {
50+ xt::xtensor_fixed<int , xt::xshape<1 >> coord{y};
51+ cl[level][coord].add_interval ({start, end});
52+ }
53+ }
54+ else if constexpr (dim == 3 )
55+ {
56+ for (int y = 0 ; y < size; ++y)
57+ {
58+ for (int z = 0 ; z < size; ++z)
59+ {
60+ xt::xtensor_fixed<int , xt::xshape<2 >> coord{y, z};
61+ cl[level][coord].add_interval ({start, end});
62+ }
63+ }
64+ }
3365 }
66+
3467 return cl;
35- }
68+ };
3669
3770template <unsigned int dim>
3871auto cell_array_with_n_intervals (int64_t size)
3972{
40- auto cl = cell_list_with_n_intervals <dim>(size);
73+ auto cl = gen_regular_intervals <dim>(size);
4174 samurai::CellArray<dim> ca (cl);
4275 return ca;
4376}
@@ -58,19 +91,30 @@ void CELLARRAY_default(benchmark::State& state)
5891template <unsigned int dim>
5992void CELLARRAY_cl_ca_multi (benchmark::State& state)
6093{
61- auto cl = cell_list_with_n_intervals<dim>(state.range (0 ));
94+ auto cl = gen_regular_intervals<dim>(state.range (0 ));
95+
96+ // Le nombre d'intervalles est state.range(0)^dim
97+ std::size_t nb_intervals = static_cast <std::size_t >(std::pow (state.range (0 ), dim));
98+
6299 for (auto _ : state)
63100 {
64101 samurai::CellArray<dim> ca (cl);
65102 benchmark::DoNotOptimize (ca[0 ]);
66103 }
104+
105+ // Ajouter les compteurs
106+ state.counters [" nb_intervals" ] = nb_intervals;
107+ state.counters [" ns/interval" ] = benchmark::Counter (nb_intervals,
108+ benchmark::Counter::kIsIterationInvariantRate | benchmark::Counter::kInvert );
109+ state.counters [" dim" ] = dim;
67110}
68111
69112// Mesure : Récupération du niveau bas d'un CellList
70113template <unsigned int dim>
71114void CELLARRAY_min_level (benchmark::State& state)
72115{
73116 samurai::CellList<dim> cl;
117+
74118 cl[state.range (0 )][{}].add_interval ({0 , 1 });
75119 samurai::CellArray<dim> ca (cl);
76120 for (auto _ : state)
@@ -85,7 +129,10 @@ template <unsigned int dim>
85129void CELLARRAY_begin (benchmark::State& state)
86130{
87131 samurai::CellList<dim> cl;
88- cl[state.range (0 )][{}].add_interval ({0 , 1 });
132+ for (int level = 0 ; level <= state.range (0 ); ++level)
133+ {
134+ cl[level][{}].add_interval ({0 , 1 });
135+ }
89136 samurai::CellArray<dim> ca (cl);
90137 for (auto _ : state)
91138 {
@@ -99,141 +146,34 @@ template <unsigned int dim>
99146void CELLARRAY_end (benchmark::State& state)
100147{
101148 samurai::CellList<dim> cl;
102- cl[state.range (0 )][{}].add_interval ({0 , 1 });
103- samurai::CellArray<dim> ca (cl);
104- for (auto _ : state)
149+ for (int level = 0 ; level <= state.range (0 ); ++level)
105150 {
106- auto end = ca.end ();
107- benchmark::DoNotOptimize (end);
151+ cl[level][{}].add_interval ({0 , 1 });
108152 }
109- }
110-
111- // Mesure : Récupération de l'itérateur reverse begin d'un CellArray
112- template <unsigned int dim>
113- void CELLARRAY_rbegin (benchmark::State& state)
114- {
115- samurai::CellList<dim> cl;
116- cl[state.range (0 )][{}].add_interval ({0 , 1 });
117153 samurai::CellArray<dim> ca (cl);
118154 for (auto _ : state)
119155 {
120- auto rbegin = ca.rbegin ();
121- benchmark::DoNotOptimize (rbegin);
122- }
123- }
124-
125- // Mesure : Création d'un CellArray 2D à partid d'un CellList composé de n intervalles aléatoires
126- // Ressemble à CELLARRAY_cl_ca_multi
127- static void CELLARRAY_CellList2CellArray_2D (benchmark::State& state)
128- {
129- constexpr std::size_t dim = 2 ;
130-
131- std::size_t min_level = 1 ;
132- std::size_t max_level = 12 ;
133-
134- samurai::CellList<dim> cl;
135- samurai::CellArray<dim> ca;
136-
137- for (std::size_t s = 0 ; s < state.range (0 ); ++s)
138- {
139- auto level = std::experimental::randint (min_level, max_level);
140- auto x = std::experimental::randint (0 , (100 << level) - 1 );
141- auto y = std::experimental::randint (0 , (100 << level) - 1 );
142-
143- cl[level][{y}].add_point (x);
144- }
145-
146- for (auto _ : state)
147- {
148- ca = {cl};
149- }
150- }
151-
152- BENCHMARK (CELLARRAY_CellList2CellArray_2D)->RangeMultiplier(2 )->Range(1 << 1 , 1 << 10 );
153-
154- // Mesure : Création d'un CellArray 3D à partid d'un CellList composé de n intervalles aléatoires
155- // Ressemble à CELLARRAY_cl_ca_multi
156- static void CELLARRAY_CellList2CellArray_3D (benchmark::State& state)
157- {
158- constexpr std::size_t dim = 3 ;
159-
160- std::size_t min_level = 1 ;
161- std::size_t max_level = 12 ;
162-
163- samurai::CellList<dim> cl;
164- samurai::CellArray<dim> ca;
165-
166- for (std::size_t s = 0 ; s < state.range (0 ); ++s)
167- {
168- auto level = std::experimental::randint (min_level, max_level);
169- auto x = std::experimental::randint (0 , (100 << level) - 1 );
170- auto y = std::experimental::randint (0 , (100 << level) - 1 );
171- auto z = std::experimental::randint (0 , (100 << level) - 1 );
172-
173- cl[level][{y, z}].add_point (x);
174- }
175-
176- for (auto _ : state)
177- {
178- ca = {cl};
179- }
180- }
181-
182- BENCHMARK (CELLARRAY_CellList2CellArray_3D)->RangeMultiplier(2 )->Range(1 << 1 , 1 << 10 );
183-
184- // Mesure : Comparaison "=" entre deux CellArray aléatoires
185- // On ne devrait pas utiliser un CellArray aléatoire.
186- static void CELLARRAY_equal_2D (benchmark::State& state)
187- {
188- constexpr std::size_t dim = 2 ;
189-
190- std::size_t min_level = 1 ;
191- std::size_t max_level = 12 ;
192-
193- samurai::CellList<dim> cl;
194- samurai::CellArray<dim> ca;
195- samurai::CellArray<dim> ca2;
196-
197- for (std::size_t s = 0 ; s < state.range (0 ); ++s)
198- {
199- auto level = std::experimental::randint (min_level, max_level);
200- auto x = std::experimental::randint (0 , (100 << level) - 1 );
201- auto y = std::experimental::randint (0 , (100 << level) - 1 );
202-
203- cl[level][{y}].add_point (x);
204- }
205- ca = {cl};
206- ca2 = {cl};
207-
208- for (auto _ : state)
209- {
210- auto equal = ca == ca2;
211- benchmark::DoNotOptimize (equal);
156+ auto end = ca.end ();
157+ benchmark::DoNotOptimize (end);
212158 }
213159}
214160
215- BENCHMARK (CELLARRAY_equal_2D)->RangeMultiplier(2 )->Range(1 << 1 , 1 << 10 );
216-
217161BENCHMARK_TEMPLATE (CELLARRAY_default, 1 , 12 );
218162BENCHMARK_TEMPLATE (CELLARRAY_default, 2 , 12 );
219163BENCHMARK_TEMPLATE (CELLARRAY_default, 3 , 12 );
220164
221- BENCHMARK_TEMPLATE (CELLARRAY_cl_ca_multi, 1 )->RangeMultiplier(2 )->Range(1 << 1 , 1 << 10 );
222- BENCHMARK_TEMPLATE (CELLARRAY_cl_ca_multi, 2 )->RangeMultiplier(2 )->Range(1 << 1 , 1 << 10 );
223- BENCHMARK_TEMPLATE (CELLARRAY_cl_ca_multi, 3 )->RangeMultiplier(2 )->Range(1 << 1 , 1 << 10 );
224-
225- BENCHMARK_TEMPLATE (CELLARRAY_min_level, 1 )->DenseRange(0 , 15 );
226- BENCHMARK_TEMPLATE (CELLARRAY_min_level, 2 )->DenseRange(0 , 15 );
227- BENCHMARK_TEMPLATE (CELLARRAY_min_level, 3 )->DenseRange(0 , 15 );
165+ BENCHMARK_TEMPLATE (CELLARRAY_cl_ca_multi, 1 )->RangeMultiplier(8 )->Range(1 << 1 , 1 << 10 );
166+ BENCHMARK_TEMPLATE (CELLARRAY_cl_ca_multi, 2 )->RangeMultiplier(4 )->Range(1 << 1 , 1 << 6 );
167+ BENCHMARK_TEMPLATE (CELLARRAY_cl_ca_multi, 3 )->RangeMultiplier(2 )->Range(1 << 1 , 1 << 4 );
228168
229- BENCHMARK_TEMPLATE (CELLARRAY_begin , 1 )->DenseRange( 0 , 15 );
230- BENCHMARK_TEMPLATE (CELLARRAY_begin , 2 )->DenseRange( 0 , 15 );
231- BENCHMARK_TEMPLATE (CELLARRAY_begin , 3 )->DenseRange( 0 , 15 );
169+ BENCHMARK_TEMPLATE (CELLARRAY_min_level , 1 )->Arg( 15 );
170+ BENCHMARK_TEMPLATE (CELLARRAY_min_level , 2 )->Arg( 15 );
171+ BENCHMARK_TEMPLATE (CELLARRAY_min_level , 3 )->Arg( 15 );
232172
233- BENCHMARK_TEMPLATE (CELLARRAY_rbegin , 1 )->DenseRange( 0 , 15 );
234- BENCHMARK_TEMPLATE (CELLARRAY_rbegin , 2 )->DenseRange( 0 , 15 );
235- BENCHMARK_TEMPLATE (CELLARRAY_rbegin , 3 )->DenseRange( 0 , 15 );
173+ BENCHMARK_TEMPLATE (CELLARRAY_begin , 1 )->Arg( 15 );
174+ BENCHMARK_TEMPLATE (CELLARRAY_begin , 2 )->Arg( 15 );
175+ BENCHMARK_TEMPLATE (CELLARRAY_begin , 3 )->Arg( 15 );
236176
237- BENCHMARK_TEMPLATE (CELLARRAY_end, 1 )->DenseRange( 0 , 15 );
238- BENCHMARK_TEMPLATE (CELLARRAY_end, 2 )->DenseRange( 0 , 15 );
239- BENCHMARK_TEMPLATE (CELLARRAY_end, 3 )->DenseRange( 0 , 15 );
177+ BENCHMARK_TEMPLATE (CELLARRAY_end, 1 )->Arg( 15 );
178+ BENCHMARK_TEMPLATE (CELLARRAY_end, 2 )->Arg( 15 );
179+ BENCHMARK_TEMPLATE (CELLARRAY_end, 3 )->Arg( 15 );
0 commit comments