Project
Loading...
Searching...
No Matches
benchmark_EventMixing.cxx
Go to the documentation of this file.
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
16#include <benchmark/benchmark.h>
17#include <random>
18#include <vector>
19#include <list>
20
21using namespace o2::framework;
22using namespace arrow;
23using namespace o2::soa;
24
25// Validation of new event mixing: time complexity same as for naive loop
26
27#ifdef __APPLE__
28constexpr unsigned int maxPairsRange = 5;
29constexpr unsigned int maxFivesRange = 3;
30#else
31constexpr unsigned int maxPairsRange = 5;
32constexpr unsigned int maxFivesRange = 3;
33#endif
34constexpr int numEventsToMix = 5;
35constexpr int numTracksPerEvent = 10000;
36
37using namespace o2::framework;
38using namespace o2::soa;
39
40static void BM_EventMixingTraditional(benchmark::State& state)
41{
42 // Seed with a real random value, if available
43 std::default_random_engine e1(1234567891);
44 std::uniform_real_distribution<float> uniform_dist(0.f, 1.f);
45 std::uniform_real_distribution<float> uniform_dist_x(-0.065f, 0.073f);
46 std::uniform_real_distribution<float> uniform_dist_y(-0.320f, 0.360f);
47 std::uniform_int_distribution<int> uniform_dist_int(0, 5);
48
49 std::vector<double> xBins{VARIABLE_WIDTH, -0.064, -0.062, -0.060, 0.066, 0.068, 0.070, 0.072};
50 std::vector<double> yBins{VARIABLE_WIDTH, -0.320, -0.301, -0.300, 0.330, 0.340, 0.350, 0.360};
52 BinningType binningOnPositions{{xBins, yBins}, true}; // true is for 'ignore overflows' (true by default)
53
54 TableBuilder colBuilder, trackBuilder;
55 auto rowWriterCol = colBuilder.cursor<o2::aod::Collisions>();
56 for (auto i = 0; i < state.range(0); ++i) {
57 float x = uniform_dist_x(e1);
58 float y = uniform_dist_y(e1);
59 rowWriterCol(0, uniform_dist_int(e1),
60 x, y, uniform_dist(e1),
63 uniform_dist_int(e1), uniform_dist(e1),
64 uniform_dist_int(e1),
65 uniform_dist(e1), uniform_dist(e1));
66 }
67 auto tableCol = colBuilder.finalize();
68 o2::aod::Collisions collisions{tableCol};
69 std::uniform_int_distribution<int> uniform_dist_col_ind(0, collisions.size());
70
71 auto rowWriterTrack = trackBuilder.cursor<o2::aod::StoredTracks>();
72 for (auto i = 0; i < numTracksPerEvent * state.range(0); ++i) {
73 rowWriterTrack(0, uniform_dist_col_ind(e1), 0,
76 uniform_dist(e1));
77 }
78 auto tableTrack = trackBuilder.finalize();
79 o2::aod::StoredTracks tracks{tableTrack};
80
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
85 int64_t count = 0;
86 int64_t colCount = 0;
87 int nBinsTot = (xBins.size() - 2) * (yBins.size() - 2);
88
89 for (auto _ : state) {
90 count = 0;
91 colCount = 0;
92 int n = state.range(0);
93 std::vector<std::list<o2::aod::Collisions::iterator>> mixingBufferVector;
94 for (int i = 0; i < nBinsTot; i++) {
95 mixingBufferVector.push_back(std::list<o2::aod::Collisions::iterator>());
96 }
97 for (auto& col1 : collisions) {
98 int bin = binningOnPositions.getBin({col1.posX(), col1.posY()});
99 if (bin == -1) {
100 continue;
101 }
102
103 auto& mixingBuffer = mixingBufferVector[bin];
104
105 if (mixingBuffer.size() > 0) {
106 auto tracks1 = tracks.sliceByCached(o2::aod::track::collisionId, col1.globalIndex(), cache);
107 for (auto& col2 : mixingBuffer) {
108 auto tracks2 = tracks.sliceByCached(o2::aod::track::collisionId, col2.globalIndex(), cache);
109 for (auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) {
110 count++;
111 }
112 colCount++;
113 }
114 if (mixingBuffer.size() >= numEventsToMix) {
115 mixingBuffer.pop_back();
116 }
117 }
118 mixingBuffer.push_front(col1);
119 }
120
121 benchmark::DoNotOptimize(count);
122 benchmark::DoNotOptimize(colCount);
123 }
124 state.counters["Mixed track pairs"] = count;
125 state.counters["Mixed collision pairs"] = colCount;
126 state.SetBytesProcessed(state.iterations() * sizeof(float) * count);
127}
128
129BENCHMARK(BM_EventMixingTraditional)->RangeMultiplier(2)->Range(4, 8 << maxPairsRange);
130
131static void BM_EventMixingCombinations(benchmark::State& state)
132{
133 // Seed with a real random value, if available
134 std::default_random_engine e1(1234567891);
135 std::uniform_real_distribution<float> uniform_dist(0.f, 1.f);
136 std::uniform_real_distribution<float> uniform_dist_x(-0.065f, 0.073f);
137 std::uniform_real_distribution<float> uniform_dist_y(-0.320f, 0.360f);
138 std::uniform_int_distribution<int> uniform_dist_int(0, 5);
139
140 std::vector<double> xBins{VARIABLE_WIDTH, -0.064, -0.062, -0.060, 0.066, 0.068, 0.070, 0.072};
141 std::vector<double> yBins{VARIABLE_WIDTH, -0.320, -0.301, -0.300, 0.330, 0.340, 0.350, 0.360};
143 BinningType binningOnPositions{{xBins, yBins}, true}; // true is for 'ignore overflows' (true by default)
144
145 TableBuilder colBuilder, trackBuilder;
146 auto rowWriterCol = colBuilder.cursor<o2::aod::Collisions>();
147 for (auto i = 0; i < state.range(0); ++i) {
148 float x = uniform_dist_x(e1);
149 float y = uniform_dist_y(e1);
150 rowWriterCol(0, uniform_dist_int(e1),
151 x, y, uniform_dist(e1),
154 uniform_dist_int(e1), uniform_dist(e1),
155 uniform_dist_int(e1),
156 uniform_dist(e1), uniform_dist(e1));
157 }
158 auto tableCol = colBuilder.finalize();
159 o2::aod::Collisions collisions{tableCol};
160 std::uniform_int_distribution<int> uniform_dist_col_ind(0, collisions.size());
161
162 auto rowWriterTrack = trackBuilder.cursor<o2::aod::StoredTracks>();
163 for (auto i = 0; i < numTracksPerEvent * state.range(0); ++i) {
164 rowWriterTrack(0, uniform_dist_col_ind(e1), 0,
167 uniform_dist(e1));
168 }
169 auto tableTrack = trackBuilder.finalize();
170 o2::aod::StoredTracks tracks{tableTrack};
171
172 int64_t count = 0;
173 int64_t colCount = 0;
174 ArrowTableSlicingCache atscache{{{getLabelFromType<o2::aod::StoredTracks>(), "fIndex" + getLabelFromType<o2::aod::Collisions>()}}};
175 auto s = atscache.updateCacheEntry(0, tableTrack);
176 SliceCache cache{&atscache};
177
178 for (auto _ : state) {
179 count = 0;
180 colCount = 0;
181
182 auto tracksTuple = std::make_tuple(tracks);
183 SameKindPair<o2::aod::Collisions, o2::aod::StoredTracks, BinningType> pair{binningOnPositions, numEventsToMix - 1, -1, collisions, tracksTuple, &cache};
184 for (auto& [c1, tracks1, c2, tracks2] : pair) {
185 int bin = binningOnPositions.getBin({c1.posX(), c1.posY()});
186 for (auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) {
187 count++;
188 }
189 colCount++;
190 }
191 benchmark::DoNotOptimize(count);
192 benchmark::DoNotOptimize(colCount);
193 }
194 state.counters["Mixed track pairs"] = count;
195 state.counters["Mixed collision pairs"] = colCount;
196 state.SetBytesProcessed(state.iterations() * sizeof(float) * count);
197}
198
199BENCHMARK(BM_EventMixingCombinations)->RangeMultiplier(2)->Range(4, 8 << maxPairsRange);
200
benchmark::State & state
uniform_int_distribution< long long > uniform_dist(32, 126)
int32_t i
bool const GPUTPCGMMerger::trackCluster * c1
bool const GPUTPCGMMerger::trackCluster const clcomparestruct * c2
constexpr unsigned int maxPairsRange
BENCHMARK_MAIN()
BENCHMARK(BM_EventMixingTraditional) -> RangeMultiplier(2) ->Range(4, 8<< maxPairsRange)
constexpr int numTracksPerEvent
constexpr int numEventsToMix
constexpr unsigned int maxFivesRange
std::shared_ptr< arrow::Table > finalize()
GLdouble n
Definition glcorearb.h:1982
GLint GLenum GLint x
Definition glcorearb.h:403
GLint GLsizei count
Definition glcorearb.h:399
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t1
Definition glcorearb.h:5034
Collisions_001 Collisions
Defining PrimaryVertex explicitly as messageable.
Definition TFIDInfo.h:20
constexpr double VARIABLE_WIDTH
std::string cutString(std::string &&str)
Definition ASoA.cxx:180
auto combinations(const BP &binningPolicy, int categoryNeighbours, const T1 &outsider, const T2s &... tables)