Skip to content

Commit 6c713df

Browse files
committed
[VecOps] Add RVec micro benchmarks
1 parent 2e59f2c commit 6c713df

File tree

3 files changed

+144
-0
lines changed

3 files changed

+144
-0
lines changed

root/math/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ add_subdirectory(genvector)
22
if(ROOT_veccore_FOUND)
33
add_subdirectory(mathcore)
44
endif()
5+
add_subdirectory(vecops)

root/math/vecops/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
RB_ADD_GBENCHMARK(VecOpsRVec
2+
VecOpsRVec.cxx
3+
LABEL short
4+
LIBRARIES Core ROOTVecOps)

root/math/vecops/VecOpsRVec.cxx

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
#include "ROOT/RVec.hxx"
2+
#include "benchmark/benchmark.h"
3+
#include "rootbench/RBConfig.h"
4+
5+
using namespace ROOT::VecOps;
6+
7+
8+
static void GetArguments(benchmark::internal::Benchmark* b)
9+
{
10+
for (const auto i : {1, 2, 4, 8, 16, 32, 64})
11+
b->Arg(i);
12+
}
13+
14+
15+
template <class T>
16+
static void RVecAssign(benchmark::State &state)
17+
{
18+
const auto size = state.range(0);
19+
RVec<T> v1(size);
20+
RVec<T> v2(size);
21+
for (auto _ : state) {
22+
v2 = v1;
23+
benchmark::DoNotOptimize(v2);
24+
}
25+
}
26+
BENCHMARK_TEMPLATE(RVecAssign, float)->Apply(GetArguments);
27+
28+
29+
template <class T>
30+
static void RVecAdd(benchmark::State &state)
31+
{
32+
const auto size = state.range(0);
33+
RVec<T> v1(size);
34+
RVec<T> v2(size);
35+
for (auto _ : state) {
36+
benchmark::DoNotOptimize(v1 + v2);
37+
}
38+
}
39+
BENCHMARK_TEMPLATE(RVecAdd, float)->Apply(GetArguments);
40+
41+
42+
template <class T>
43+
static void RVecSquareAddSqrt(benchmark::State &state)
44+
{
45+
const auto size = state.range(0);
46+
RVec<T> v1(size);
47+
RVec<T> v2(size);
48+
for (auto _ : state) {
49+
benchmark::DoNotOptimize(sqrt(pow(v1, 2) + pow(v2, 2)));
50+
}
51+
}
52+
BENCHMARK_TEMPLATE(RVecSquareAddSqrt, float)->Apply(GetArguments);
53+
54+
55+
template <class T>
56+
static void RVecDeltaR(benchmark::State &state)
57+
{
58+
const auto size = state.range(0);
59+
RVec<T> eta1(size);
60+
RVec<T> eta2(size);
61+
RVec<T> phi1(size);
62+
RVec<T> phi2(size);
63+
for (auto _ : state) {
64+
benchmark::DoNotOptimize(DeltaR(eta1, eta2, phi1, phi2));
65+
}
66+
}
67+
BENCHMARK_TEMPLATE(RVecDeltaR, float)->Apply(GetArguments);
68+
69+
70+
template <class T>
71+
static void RVecInvariantMass(benchmark::State &state)
72+
{
73+
const auto size = state.range(0);
74+
RVec<T> pt(size);
75+
RVec<T> eta(size);
76+
RVec<T> phi(size);
77+
RVec<T> mass(size);
78+
for (auto _ : state) {
79+
benchmark::DoNotOptimize(InvariantMass(pt, eta, phi, mass));
80+
}
81+
}
82+
BENCHMARK_TEMPLATE(RVecInvariantMass, float)->Apply(GetArguments);
83+
84+
85+
template <class T>
86+
static void RVecInvariantMasses(benchmark::State &state)
87+
{
88+
const auto size = state.range(0);
89+
RVec<T> pt1(size);
90+
RVec<T> pt2(size);
91+
RVec<T> eta1(size);
92+
RVec<T> eta2(size);
93+
RVec<T> phi1(size);
94+
RVec<T> phi2(size);
95+
RVec<T> mass1(size);
96+
RVec<T> mass2(size);
97+
for (auto _ : state) {
98+
benchmark::DoNotOptimize(InvariantMasses(pt1, eta1, phi1, mass1, pt2, eta2, phi2, mass2));
99+
}
100+
}
101+
BENCHMARK_TEMPLATE(RVecInvariantMasses, float)->Apply(GetArguments);
102+
103+
104+
template <class T>
105+
RVec<T> GenerateSeq(const unsigned int size)
106+
{
107+
RVec<T> v(size);
108+
for (auto i = 0u; i < size; i++)
109+
v[i] = i;
110+
return v;
111+
}
112+
113+
114+
template <class T>
115+
static void RVecMaskingSimple(benchmark::State &state)
116+
{
117+
const auto size = state.range(0);
118+
auto v = GenerateSeq<T>(size);
119+
for (auto _ : state) {
120+
benchmark::DoNotOptimize(v[v > 0.5 * size]);
121+
}
122+
}
123+
BENCHMARK_TEMPLATE(RVecMaskingSimple, float)->Apply(GetArguments);
124+
125+
126+
template <class T>
127+
static void RVecMaskingComplex(benchmark::State &state)
128+
{
129+
const auto size = state.range(0);
130+
auto v1 = GenerateSeq<T>(size);
131+
auto v2 = GenerateSeq<T>(size);
132+
for (auto _ : state) {
133+
benchmark::DoNotOptimize(v2[v1 > 0.5 * size && v2 < 0.75 * size && v1 + v2 > 0]);
134+
}
135+
}
136+
BENCHMARK_TEMPLATE(RVecMaskingComplex, float)->Apply(GetArguments);
137+
138+
139+
BENCHMARK_MAIN();

0 commit comments

Comments
 (0)