Skip to content

Commit 9faea12

Browse files
committed
Add collision-only mixing benchmarks
1 parent 94b9d0d commit 9faea12

File tree

1 file changed

+111
-0
lines changed

1 file changed

+111
-0
lines changed

Framework/Core/test/benchmark_EventMixing.cxx

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@ using namespace o2::soa;
2626

2727
#ifdef __APPLE__
2828
constexpr unsigned int maxPairsRange = 8;
29+
constexpr unsigned int maxColPairsRange = 13;
2930
#else
3031
constexpr unsigned int maxPairsRange = 8;
32+
constexpr unsigned int maxColPairsRange = 15;
3133
#endif
3234
constexpr int numEventsToMix = 5;
3335
constexpr int numTracksPerEvent = 10000;
@@ -197,4 +199,113 @@ static void BM_EventMixingCombinations(benchmark::State& state)
197199

198200
BENCHMARK(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+
200311
BENCHMARK_MAIN();

0 commit comments

Comments
 (0)