Skip to content

Commit c39565c

Browse files
committed
Added benchmarks of each mixing stage
1 parent 2e75aaf commit c39565c

File tree

2 files changed

+213
-0
lines changed

2 files changed

+213
-0
lines changed

Framework/Core/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,7 @@ foreach(b
348348
ASoA
349349
ASoAHelpers
350350
EventMixing
351+
EventMixingParts
351352
HistogramRegistry
352353
TableToTree
353354
ExternalFairMQDeviceProxies
Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2+
// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3+
// All rights not expressly granted are reserved.
4+
//
5+
// This software is distributed under the terms of the GNU General Public
6+
// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7+
//
8+
// In applying this license CERN does not waive the privileges and immunities
9+
// granted to it by virtue of its status as an Intergovernmental Organization
10+
// or submit itself to any jurisdiction.
11+
12+
#include "Framework/ASoAHelpers.h"
13+
#include "Framework/GroupedCombinations.h"
14+
#include "Framework/TableBuilder.h"
15+
#include "Framework/AnalysisDataModel.h"
16+
#include <benchmark/benchmark.h>
17+
#include <random>
18+
#include <vector>
19+
#include <list>
20+
21+
using namespace o2::framework;
22+
using namespace arrow;
23+
using namespace o2::soa;
24+
25+
// Validation of new event mixing: time complexity same as for naive loop
26+
27+
#ifdef __APPLE__
28+
constexpr unsigned int maxPairsRange = 8;
29+
constexpr unsigned int maxColPairsRange = 21;
30+
#else
31+
constexpr unsigned int maxPairsRange = 8;
32+
constexpr unsigned int maxColPairsRange = 23;
33+
#endif
34+
constexpr int numEventsToMix = 5;
35+
constexpr int numTracksPerEvent = 10000;
36+
37+
using namespace o2::framework;
38+
using namespace o2::soa;
39+
40+
static void BM_EventMixingTableCreation(benchmark::State& state)
41+
{
42+
for (auto _ : state) {
43+
// Seed with a real random value, if available
44+
std::default_random_engine e1(1234567891);
45+
std::uniform_real_distribution<float> uniform_dist(0.f, 1.f);
46+
std::uniform_real_distribution<float> uniform_dist_x(-0.065f, 0.073f);
47+
std::uniform_real_distribution<float> uniform_dist_y(-0.320f, 0.360f);
48+
std::uniform_int_distribution<int> uniform_dist_int(0, 5);
49+
50+
TableBuilder colBuilder;
51+
auto rowWriterCol = colBuilder.cursor<o2::aod::Collisions>();
52+
for (auto i = 0; i < state.range(0); ++i) {
53+
float x = uniform_dist_x(e1);
54+
float y = uniform_dist_y(e1);
55+
rowWriterCol(0, uniform_dist_int(e1),
56+
x, y, uniform_dist(e1),
57+
uniform_dist(e1), uniform_dist(e1), uniform_dist(e1),
58+
uniform_dist(e1), uniform_dist(e1), uniform_dist(e1),
59+
uniform_dist_int(e1), uniform_dist(e1),
60+
uniform_dist_int(e1),
61+
uniform_dist(e1), uniform_dist(e1));
62+
}
63+
auto tableCol = colBuilder.finalize();
64+
o2::aod::Collisions collisions{tableCol};
65+
}
66+
state.SetBytesProcessed(state.iterations() * (12 * sizeof(float) + sizeof(int64_t) + 3 * sizeof(int)) * state.range(0));
67+
}
68+
69+
BENCHMARK(BM_EventMixingTableCreation)->RangeMultiplier(2)->Range(4, 2 << maxColPairsRange);
70+
71+
static void BM_EventMixingBinningCreation(benchmark::State& state)
72+
{
73+
std::vector<double> xBins{VARIABLE_WIDTH, -0.064, -0.062, -0.060, 0.066, 0.068, 0.070, 0.072};
74+
std::vector<double> yBins{VARIABLE_WIDTH, -0.320, -0.301, -0.300, 0.330, 0.340, 0.350, 0.360};
75+
76+
for (auto _ : state) {
77+
using BinningType = ColumnBinningPolicy<o2::aod::collision::PosX, o2::aod::collision::PosY>;
78+
BinningType binningOnPositions{{xBins, yBins}, true}; // true is for 'ignore overflows' (true by default)
79+
}
80+
state.SetBytesProcessed(state.iterations() * sizeof(float));
81+
}
82+
83+
BENCHMARK(BM_EventMixingBinningCreation)->RangeMultiplier(2)->Range(4, 2 << maxColPairsRange);
84+
85+
static void BM_EventMixingPolicyCreation(benchmark::State& state)
86+
{
87+
// Seed with a real random value, if available
88+
std::default_random_engine e1(1234567891);
89+
std::uniform_real_distribution<float> uniform_dist(0.f, 1.f);
90+
std::uniform_real_distribution<float> uniform_dist_x(-0.065f, 0.073f);
91+
std::uniform_real_distribution<float> uniform_dist_y(-0.320f, 0.360f);
92+
std::uniform_int_distribution<int> uniform_dist_int(0, 5);
93+
94+
TableBuilder colBuilder;
95+
auto rowWriterCol = colBuilder.cursor<o2::aod::Collisions>();
96+
for (auto i = 0; i < state.range(0); ++i) {
97+
float x = uniform_dist_x(e1);
98+
float y = uniform_dist_y(e1);
99+
rowWriterCol(0, uniform_dist_int(e1),
100+
x, y, uniform_dist(e1),
101+
uniform_dist(e1), uniform_dist(e1), uniform_dist(e1),
102+
uniform_dist(e1), uniform_dist(e1), uniform_dist(e1),
103+
uniform_dist_int(e1), uniform_dist(e1),
104+
uniform_dist_int(e1),
105+
uniform_dist(e1), uniform_dist(e1));
106+
}
107+
auto tableCol = colBuilder.finalize();
108+
o2::aod::Collisions collisions{tableCol};
109+
110+
std::vector<double> xBins{VARIABLE_WIDTH, -0.064, -0.062, -0.060, 0.066, 0.068, 0.070, 0.072};
111+
std::vector<double> yBins{VARIABLE_WIDTH, -0.320, -0.301, -0.300, 0.330, 0.340, 0.350, 0.360};
112+
using BinningType = ColumnBinningPolicy<o2::aod::collision::PosX, o2::aod::collision::PosY>;
113+
BinningType binningOnPositions{{xBins, yBins}, true}; // true is for 'ignore overflows' (true by default)
114+
115+
for (auto _ : state) {
116+
auto combPolicy = CombinationsBlockUpperSameIndexPolicy(binningOnPositions, numEventsToMix - 1, -1, collisions, collisions);
117+
}
118+
state.SetBytesProcessed(state.iterations() * sizeof(float) * state.range(0));
119+
}
120+
121+
BENCHMARK(BM_EventMixingPolicyCreation)->RangeMultiplier(2)->Range(4, 2 << maxColPairsRange);
122+
123+
static void BM_EventMixingCombinationsCreation(benchmark::State& state)
124+
{
125+
// Seed with a real random value, if available
126+
std::default_random_engine e1(1234567891);
127+
std::uniform_real_distribution<float> uniform_dist(0.f, 1.f);
128+
std::uniform_real_distribution<float> uniform_dist_x(-0.065f, 0.073f);
129+
std::uniform_real_distribution<float> uniform_dist_y(-0.320f, 0.360f);
130+
std::uniform_int_distribution<int> uniform_dist_int(0, 5);
131+
132+
TableBuilder colBuilder;
133+
auto rowWriterCol = colBuilder.cursor<o2::aod::Collisions>();
134+
for (auto i = 0; i < state.range(0); ++i) {
135+
float x = uniform_dist_x(e1);
136+
float y = uniform_dist_y(e1);
137+
rowWriterCol(0, uniform_dist_int(e1),
138+
x, y, uniform_dist(e1),
139+
uniform_dist(e1), uniform_dist(e1), uniform_dist(e1),
140+
uniform_dist(e1), uniform_dist(e1), uniform_dist(e1),
141+
uniform_dist_int(e1), uniform_dist(e1),
142+
uniform_dist_int(e1),
143+
uniform_dist(e1), uniform_dist(e1));
144+
}
145+
auto tableCol = colBuilder.finalize();
146+
o2::aod::Collisions collisions{tableCol};
147+
148+
std::vector<double> xBins{VARIABLE_WIDTH, -0.064, -0.062, -0.060, 0.066, 0.068, 0.070, 0.072};
149+
std::vector<double> yBins{VARIABLE_WIDTH, -0.320, -0.301, -0.300, 0.330, 0.340, 0.350, 0.360};
150+
using BinningType = ColumnBinningPolicy<o2::aod::collision::PosX, o2::aod::collision::PosY>;
151+
BinningType binningOnPositions{{xBins, yBins}, true}; // true is for 'ignore overflows' (true by default)
152+
153+
auto combPolicy = CombinationsBlockUpperSameIndexPolicy(binningOnPositions, numEventsToMix - 1, -1, collisions, collisions);
154+
155+
for (auto _ : state) {
156+
auto comb = combinations(combPolicy);
157+
}
158+
state.SetBytesProcessed(state.iterations() * sizeof(float));
159+
}
160+
161+
BENCHMARK(BM_EventMixingCombinationsCreation)->RangeMultiplier(2)->Range(4, 2 << maxColPairsRange);
162+
163+
static void BM_EventMixingCombinations(benchmark::State& state)
164+
{
165+
// Seed with a real random value, if available
166+
std::default_random_engine e1(1234567891);
167+
std::uniform_real_distribution<float> uniform_dist(0.f, 1.f);
168+
std::uniform_real_distribution<float> uniform_dist_x(-0.065f, 0.073f);
169+
std::uniform_real_distribution<float> uniform_dist_y(-0.320f, 0.360f);
170+
std::uniform_int_distribution<int> uniform_dist_int(0, 5);
171+
172+
TableBuilder colBuilder;
173+
auto rowWriterCol = colBuilder.cursor<o2::aod::Collisions>();
174+
for (auto i = 0; i < state.range(0); ++i) {
175+
float x = uniform_dist_x(e1);
176+
float y = uniform_dist_y(e1);
177+
rowWriterCol(0, uniform_dist_int(e1),
178+
x, y, uniform_dist(e1),
179+
uniform_dist(e1), uniform_dist(e1), uniform_dist(e1),
180+
uniform_dist(e1), uniform_dist(e1), uniform_dist(e1),
181+
uniform_dist_int(e1), uniform_dist(e1),
182+
uniform_dist_int(e1),
183+
uniform_dist(e1), uniform_dist(e1));
184+
}
185+
auto tableCol = colBuilder.finalize();
186+
o2::aod::Collisions collisions{tableCol};
187+
188+
std::vector<double> xBins{VARIABLE_WIDTH, -0.064, -0.062, -0.060, 0.066, 0.068, 0.070, 0.072};
189+
std::vector<double> yBins{VARIABLE_WIDTH, -0.320, -0.301, -0.300, 0.330, 0.340, 0.350, 0.360};
190+
using BinningType = ColumnBinningPolicy<o2::aod::collision::PosX, o2::aod::collision::PosY>;
191+
BinningType binningOnPositions{{xBins, yBins}, true}; // true is for 'ignore overflows' (true by default)
192+
193+
auto combPolicy = CombinationsBlockUpperSameIndexPolicy(binningOnPositions, numEventsToMix - 1, -1, collisions, collisions);
194+
195+
auto comb = combinations(combPolicy);
196+
197+
int64_t colCount = 0;
198+
199+
for (auto _ : state) {
200+
colCount = 0;
201+
for (auto& combT : comb) {
202+
colCount++;
203+
}
204+
benchmark::DoNotOptimize(colCount);
205+
}
206+
state.counters["Mixed collision pairs"] = colCount;
207+
state.SetBytesProcessed(state.iterations() * sizeof(float) * colCount);
208+
}
209+
210+
BENCHMARK(BM_EventMixingCombinations)->RangeMultiplier(2)->Range(4, 2 << maxColPairsRange);
211+
212+
BENCHMARK_MAIN();

0 commit comments

Comments
 (0)