@@ -26,8 +26,10 @@ using namespace o2::soa;
2626
2727#ifdef __APPLE__
2828constexpr unsigned int maxPairsRange = 8 ;
29+ constexpr unsigned int maxColPairsRange = 13 ;
2930#else
3031constexpr unsigned int maxPairsRange = 8 ;
32+ constexpr unsigned int maxColPairsRange = 15 ;
3133#endif
3234constexpr int numEventsToMix = 5 ;
3335constexpr int numTracksPerEvent = 10000 ;
@@ -197,4 +199,113 @@ static void BM_EventMixingCombinations(benchmark::State& state)
197199
198200BENCHMARK (BM_EventMixingCombinations)->RangeMultiplier(2 )->Range(4 , 2 << maxPairsRange);
199201
202+ static void BM_EventMixingNaiveCollisionsPairsSameCategories (benchmark::State& state)
203+ {
204+ // Seed with a real random value, if available
205+ std::default_random_engine e1 (1234567891 );
206+ std::uniform_real_distribution<float > uniform_dist (0 .f , 1 .f );
207+ std::uniform_real_distribution<float > uniform_dist_x (-0 .065f , 0 .073f );
208+ std::uniform_real_distribution<float > uniform_dist_y (-0 .320f , 0 .360f );
209+ std::uniform_int_distribution<int > uniform_dist_int (0 , 5 );
210+
211+ std::vector<double > xBins{VARIABLE_WIDTH, -0.064 , -0.062 , -0.060 , 0.066 , 0.068 , 0.070 , 0.072 };
212+ std::vector<double > yBins{VARIABLE_WIDTH, -0.320 , -0.301 , -0.300 , 0.330 , 0.340 , 0.350 , 0.360 };
213+ using BinningType = ColumnBinningPolicy<o2::aod::collision::PosX, o2::aod::collision::PosY>;
214+ BinningType binningOnPositions{{xBins, yBins}, true }; // true is for 'ignore overflows' (true by default)
215+
216+ TableBuilder colBuilder;
217+ auto rowWriterCol = colBuilder.cursor <o2::aod::Collisions>();
218+ for (auto i = 0 ; i < state.range (0 ); ++i) {
219+ float x = uniform_dist_x (e1 );
220+ float y = uniform_dist_y (e1 );
221+ rowWriterCol (0 , uniform_dist_int (e1 ),
222+ x, y, uniform_dist (e1 ),
223+ uniform_dist (e1 ), uniform_dist (e1 ), uniform_dist (e1 ),
224+ uniform_dist (e1 ), uniform_dist (e1 ), uniform_dist (e1 ),
225+ uniform_dist_int (e1 ), uniform_dist (e1 ),
226+ uniform_dist_int (e1 ),
227+ uniform_dist (e1 ), uniform_dist (e1 ));
228+ }
229+ auto tableCol = colBuilder.finalize ();
230+ o2::aod::Collisions collisions{tableCol};
231+
232+ int64_t colCount = 0 ;
233+ int nBinsTot = (xBins.size () - 2 ) * (yBins.size () - 2 );
234+
235+ for (auto _ : state) {
236+ colCount = 0 ;
237+ int n = state.range (0 );
238+ std::vector<std::list<o2::aod::Collisions::iterator>> mixingBufferVector;
239+ for (int i = 0 ; i < nBinsTot; i++) {
240+ mixingBufferVector.push_back (std::list<o2::aod::Collisions::iterator>());
241+ }
242+ for (auto & col1 : collisions) {
243+ int bin = binningOnPositions.getBin ({col1.posX (), col1.posY ()});
244+ if (bin == -1 ) {
245+ continue ;
246+ }
247+ auto & mixingBuffer = mixingBufferVector[bin];
248+ if (mixingBuffer.size () > 0 ) {
249+ for (auto & col2 : mixingBuffer) {
250+ colCount++;
251+ }
252+ if (mixingBuffer.size () >= numEventsToMix) {
253+ mixingBuffer.pop_back ();
254+ }
255+ }
256+ mixingBuffer.push_front (col1);
257+ }
258+ benchmark::DoNotOptimize (colCount);
259+ }
260+ state.counters [" Mixed collision pairs" ] = colCount;
261+ state.SetBytesProcessed (state.iterations () * sizeof (float ) * colCount);
262+ }
263+
264+ BENCHMARK (BM_EventMixingNaiveCollisionsPairsSameCategories)->RangeMultiplier(2 )->Range(4 , 2 << maxColPairsRange);
265+
266+ static void BM_EventMixingCombGenCollisionsPairsSameCategories (benchmark::State& state)
267+ {
268+ // Seed with a real random value, if available
269+ std::default_random_engine e1 (1234567891 );
270+ std::uniform_real_distribution<float > uniform_dist (0 .f , 1 .f );
271+ std::uniform_real_distribution<float > uniform_dist_x (-0 .065f , 0 .073f );
272+ std::uniform_real_distribution<float > uniform_dist_y (-0 .320f , 0 .360f );
273+ std::uniform_int_distribution<int > uniform_dist_int (0 , 5 );
274+
275+ std::vector<double > xBins{VARIABLE_WIDTH, -0.064 , -0.062 , -0.060 , 0.066 , 0.068 , 0.070 , 0.072 };
276+ std::vector<double > yBins{VARIABLE_WIDTH, -0.320 , -0.301 , -0.300 , 0.330 , 0.340 , 0.350 , 0.360 };
277+ using BinningType = ColumnBinningPolicy<o2::aod::collision::PosX, o2::aod::collision::PosY>;
278+ BinningType binningOnPositions{{xBins, yBins}, true }; // true is for 'ignore overflows' (true by default)
279+
280+ TableBuilder colBuilder;
281+ auto rowWriterCol = colBuilder.cursor <o2::aod::Collisions>();
282+ for (auto i = 0 ; i < state.range (0 ); ++i) {
283+ float x = uniform_dist_x (e1 );
284+ float y = uniform_dist_y (e1 );
285+ rowWriterCol (0 , uniform_dist_int (e1 ),
286+ x, y, uniform_dist (e1 ),
287+ uniform_dist (e1 ), uniform_dist (e1 ), uniform_dist (e1 ),
288+ uniform_dist (e1 ), uniform_dist (e1 ), uniform_dist (e1 ),
289+ uniform_dist_int (e1 ), uniform_dist (e1 ),
290+ uniform_dist_int (e1 ),
291+ uniform_dist (e1 ), uniform_dist (e1 ));
292+ }
293+ auto tableCol = colBuilder.finalize ();
294+ o2::aod::Collisions collisions{tableCol};
295+
296+ int64_t colCount = 0 ;
297+
298+ for (auto _ : state) {
299+ colCount = 0 ;
300+ for (auto & comb : combinations (CombinationsBlockUpperSameIndexPolicy (binningOnPositions, numEventsToMix - 1 , -1 , collisions, collisions))) {
301+ colCount++;
302+ }
303+ benchmark::DoNotOptimize (colCount);
304+ }
305+ state.counters [" Mixed collision pairs" ] = colCount;
306+ state.SetBytesProcessed (state.iterations () * sizeof (float ) * colCount);
307+ }
308+
309+ BENCHMARK (BM_EventMixingCombGenCollisionsPairsSameCategories)->RangeMultiplier(2 )->Range(4 , 2 << maxColPairsRange);
310+
200311BENCHMARK_MAIN ();
0 commit comments