@@ -25,11 +25,9 @@ using namespace o2::soa;
2525// Validation of new event mixing: time complexity same as for naive loop
2626
2727#ifdef __APPLE__
28- constexpr unsigned int maxPairsRange = 5 ;
29- constexpr unsigned int maxFivesRange = 3 ;
28+ constexpr unsigned int maxColPairsRange = 21 ;
3029#else
31- constexpr unsigned int maxPairsRange = 5 ;
32- constexpr unsigned int maxFivesRange = 3 ;
30+ constexpr unsigned int maxColPairsRange = 23 ;
3331#endif
3432constexpr int numEventsToMix = 5 ;
3533constexpr int numTracksPerEvent = 10000 ;
@@ -66,7 +64,7 @@ static void BM_EventMixingTraditional(benchmark::State& state)
6664 }
6765 auto tableCol = colBuilder.finalize ();
6866 o2::aod::Collisions collisions{tableCol};
69- std::uniform_int_distribution<int > uniform_dist_col_ind (0 , collisions.size ());
67+ std::uniform_int_distribution<int > uniform_dist_col_ind (0 , collisions.size () - 1 );
7068
7169 auto rowWriterTrack = trackBuilder.cursor <o2::aod::StoredTracks>();
7270 for (auto i = 0 ; i < numTracksPerEvent * state.range (0 ); ++i) {
@@ -78,14 +76,14 @@ static void BM_EventMixingTraditional(benchmark::State& state)
7876 auto tableTrack = trackBuilder.finalize ();
7977 o2::aod::StoredTracks tracks{tableTrack};
8078
81- ArrowTableSlicingCache atscache ({{getLabelFromType<o2::aod::StoredTracks>(), " fIndex" + cutString (getLabelFromType<o2::aod::Collisions>())}});
82- auto s = atscache.updateCacheEntry (0 , tableTrack);
83- SliceCache cache{&atscache};
84-
8579 int64_t count = 0 ;
8680 int64_t colCount = 0 ;
8781 int nBinsTot = (xBins.size () - 2 ) * (yBins.size () - 2 );
8882
83+ ArrowTableSlicingCache atscache ({{getLabelFromType<o2::aod::StoredTracks>(), " fIndex" + cutString (getLabelFromType<o2::aod::Collisions>())}});
84+ auto s = atscache.updateCacheEntry (0 , tableTrack);
85+ SliceCache cache{&atscache};
86+
8987 for (auto _ : state) {
9088 count = 0 ;
9189 colCount = 0 ;
@@ -126,7 +124,7 @@ static void BM_EventMixingTraditional(benchmark::State& state)
126124 state.SetBytesProcessed (state.iterations () * sizeof (float ) * count);
127125}
128126
129- BENCHMARK (BM_EventMixingTraditional)->RangeMultiplier(2 )->Range(4 , 8 << maxPairsRange );
127+ BENCHMARK (BM_EventMixingTraditional)->RangeMultiplier(2 )->Range(4UL , 2UL << maxColPairsRange );
130128
131129static void BM_EventMixingCombinations (benchmark::State& state)
132130{
@@ -157,7 +155,7 @@ static void BM_EventMixingCombinations(benchmark::State& state)
157155 }
158156 auto tableCol = colBuilder.finalize ();
159157 o2::aod::Collisions collisions{tableCol};
160- std::uniform_int_distribution<int > uniform_dist_col_ind (0 , collisions.size ());
158+ std::uniform_int_distribution<int > uniform_dist_col_ind (0 , collisions.size () - 1 );
161159
162160 auto rowWriterTrack = trackBuilder.cursor <o2::aod::StoredTracks>();
163161 for (auto i = 0 ; i < numTracksPerEvent * state.range (0 ); ++i) {
@@ -171,6 +169,7 @@ static void BM_EventMixingCombinations(benchmark::State& state)
171169
172170 int64_t count = 0 ;
173171 int64_t colCount = 0 ;
172+
174173 ArrowTableSlicingCache atscache{{{getLabelFromType<o2::aod::StoredTracks>(), " fIndex" + getLabelFromType<o2::aod::Collisions>()}}};
175174 auto s = atscache.updateCacheEntry (0 , tableTrack);
176175 SliceCache cache{&atscache};
@@ -196,6 +195,115 @@ static void BM_EventMixingCombinations(benchmark::State& state)
196195 state.SetBytesProcessed (state.iterations () * sizeof (float ) * count);
197196}
198197
199- BENCHMARK (BM_EventMixingCombinations)->RangeMultiplier(2 )->Range(4 , 8 << maxPairsRange);
198+ BENCHMARK (BM_EventMixingCombinations)->RangeMultiplier(2 )->Range(4UL , 2UL << maxColPairsRange);
199+
200+ static void BM_EventMixingNaiveCollisionsPairsSameCategories (benchmark::State& state)
201+ {
202+ // Seed with a real random value, if available
203+ std::default_random_engine e1 (1234567891 );
204+ std::uniform_real_distribution<float > uniform_dist (0 .f , 1 .f );
205+ std::uniform_real_distribution<float > uniform_dist_x (-0 .065f , 0 .073f );
206+ std::uniform_real_distribution<float > uniform_dist_y (-0 .320f , 0 .360f );
207+ std::uniform_int_distribution<int > uniform_dist_int (0 , 5 );
208+
209+ std::vector<double > xBins{VARIABLE_WIDTH, -0.064 , -0.062 , -0.060 , 0.066 , 0.068 , 0.070 , 0.072 };
210+ std::vector<double > yBins{VARIABLE_WIDTH, -0.320 , -0.301 , -0.300 , 0.330 , 0.340 , 0.350 , 0.360 };
211+ using BinningType = ColumnBinningPolicy<o2::aod::collision::PosX, o2::aod::collision::PosY>;
212+ BinningType binningOnPositions{{xBins, yBins}, true }; // true is for 'ignore overflows' (true by default)
213+
214+ TableBuilder colBuilder;
215+ auto rowWriterCol = colBuilder.cursor <o2::aod::Collisions>();
216+ for (auto i = 0 ; i < state.range (0 ); ++i) {
217+ float x = uniform_dist_x (e1 );
218+ float y = uniform_dist_y (e1 );
219+ rowWriterCol (0 , uniform_dist_int (e1 ),
220+ x, y, uniform_dist (e1 ),
221+ uniform_dist (e1 ), uniform_dist (e1 ), uniform_dist (e1 ),
222+ uniform_dist (e1 ), uniform_dist (e1 ), uniform_dist (e1 ),
223+ uniform_dist_int (e1 ), uniform_dist (e1 ),
224+ uniform_dist_int (e1 ),
225+ uniform_dist (e1 ), uniform_dist (e1 ));
226+ }
227+ auto tableCol = colBuilder.finalize ();
228+ o2::aod::Collisions collisions{tableCol};
229+
230+ int64_t colCount = 0 ;
231+ int nBinsTot = (xBins.size () - 2 ) * (yBins.size () - 2 );
232+
233+ for (auto _ : state) {
234+ colCount = 0 ;
235+ int n = state.range (0 );
236+ std::vector<std::list<o2::aod::Collisions::iterator>> mixingBufferVector;
237+ for (int i = 0 ; i < nBinsTot; i++) {
238+ mixingBufferVector.push_back (std::list<o2::aod::Collisions::iterator>());
239+ }
240+ for (auto & col1 : collisions) {
241+ int bin = binningOnPositions.getBin ({col1.posX (), col1.posY ()});
242+ if (bin == -1 ) {
243+ continue ;
244+ }
245+ auto & mixingBuffer = mixingBufferVector[bin];
246+ if (mixingBuffer.size () > 0 ) {
247+ for (auto & col2 : mixingBuffer) {
248+ colCount++;
249+ }
250+ if (mixingBuffer.size () >= numEventsToMix - 1 ) {
251+ mixingBuffer.pop_back ();
252+ }
253+ }
254+ mixingBuffer.push_front (col1);
255+ }
256+ benchmark::DoNotOptimize (colCount);
257+ }
258+ state.counters [" Mixed collision pairs" ] = colCount;
259+ state.SetBytesProcessed (state.iterations () * sizeof (float ) * colCount);
260+ }
261+
262+ BENCHMARK (BM_EventMixingNaiveCollisionsPairsSameCategories)->RangeMultiplier(2 )->Range(4UL , 2UL << maxColPairsRange);
263+
264+ static void BM_EventMixingCombGenCollisionsPairsSameCategories (benchmark::State& state)
265+ {
266+ // Seed with a real random value, if available
267+ std::default_random_engine e1 (1234567891 );
268+ std::uniform_real_distribution<float > uniform_dist (0 .f , 1 .f );
269+ std::uniform_real_distribution<float > uniform_dist_x (-0 .065f , 0 .073f );
270+ std::uniform_real_distribution<float > uniform_dist_y (-0 .320f , 0 .360f );
271+ std::uniform_int_distribution<int > uniform_dist_int (0 , 5 );
272+
273+ std::vector<double > xBins{VARIABLE_WIDTH, -0.064 , -0.062 , -0.060 , 0.066 , 0.068 , 0.070 , 0.072 };
274+ std::vector<double > yBins{VARIABLE_WIDTH, -0.320 , -0.301 , -0.300 , 0.330 , 0.340 , 0.350 , 0.360 };
275+ using BinningType = ColumnBinningPolicy<o2::aod::collision::PosX, o2::aod::collision::PosY>;
276+ BinningType binningOnPositions{{xBins, yBins}, true }; // true is for 'ignore overflows' (true by default)
277+
278+ TableBuilder colBuilder;
279+ auto rowWriterCol = colBuilder.cursor <o2::aod::Collisions>();
280+ for (auto i = 0 ; i < state.range (0 ); ++i) {
281+ float x = uniform_dist_x (e1 );
282+ float y = uniform_dist_y (e1 );
283+ rowWriterCol (0 , uniform_dist_int (e1 ),
284+ x, y, uniform_dist (e1 ),
285+ uniform_dist (e1 ), uniform_dist (e1 ), uniform_dist (e1 ),
286+ uniform_dist (e1 ), uniform_dist (e1 ), uniform_dist (e1 ),
287+ uniform_dist_int (e1 ), uniform_dist (e1 ),
288+ uniform_dist_int (e1 ),
289+ uniform_dist (e1 ), uniform_dist (e1 ));
290+ }
291+ auto tableCol = colBuilder.finalize ();
292+ o2::aod::Collisions collisions{tableCol};
293+
294+ int64_t colCount = 0 ;
295+
296+ for (auto _ : state) {
297+ colCount = 0 ;
298+ for (auto & comb : combinations (CombinationsBlockUpperSameIndexPolicy (binningOnPositions, numEventsToMix - 1 , -1 , collisions, collisions))) {
299+ colCount++;
300+ }
301+ benchmark::DoNotOptimize (colCount);
302+ }
303+ state.counters [" Mixed collision pairs" ] = colCount;
304+ state.SetBytesProcessed (state.iterations () * sizeof (float ) * colCount);
305+ }
306+
307+ BENCHMARK (BM_EventMixingCombGenCollisionsPairsSameCategories)->RangeMultiplier(2 )->Range(4UL , 2UL << maxColPairsRange);
200308
201309BENCHMARK_MAIN ();
0 commit comments