-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbench_core.cpp
More file actions
104 lines (89 loc) · 3.4 KB
/
Copy pathbench_core.cpp
File metadata and controls
104 lines (89 loc) · 3.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include "numpycpp/numpy.h"
#include "numpycpp/linalg.h"
#include <benchmark/benchmark.h>
#include <vector>
#include <random>
#include <cmath>
// ---- helpers -----------------------------------------------------------------
std::vector<double> make_data(size_t n) {
std::vector<double> v(n);
std::mt19937 rng(42);
std::uniform_real_distribution<double> dist(1.0, 100.0);
for (size_t i = 0; i < n; ++i) v[i] = dist(rng);
return v;
}
// ---- element-wise -------------------------------------------------------------
#define BENCH_ELEMWISE(NAME) \
static void BM_##NAME(benchmark::State& state) { \
size_t n = state.range(0); \
auto src = make_data(n); \
std::vector<double> dst(n); \
for (auto _ : state) { \
numpy::NAME(src.data(), dst.data(), n); \
benchmark::DoNotOptimize(dst.data()); \
} \
state.SetItemsProcessed(state.iterations() * n); \
} \
BENCHMARK(BM_##NAME)->Range(1 << 10, 1 << 22);
BENCH_ELEMWISE(sqrt)
BENCH_ELEMWISE(abs)
BENCH_ELEMWISE(exp)
BENCH_ELEMWISE(log)
BENCH_ELEMWISE(sin)
BENCH_ELEMWISE(cos)
// ---- reduction ---------------------------------------------------------------
static void BM_sum(benchmark::State& state) {
size_t n = state.range(0);
auto src = make_data(n);
for (auto _ : state) {
double s = numpy::sum(src.data(), n);
benchmark::DoNotOptimize(s);
}
state.SetItemsProcessed(state.iterations() * n);
}
BENCHMARK(BM_sum)->Range(1 << 10, 1 << 22);
static void BM_mean(benchmark::State& state) {
size_t n = state.range(0);
auto src = make_data(n);
for (auto _ : state) {
double m = numpy::mean(src.data(), n);
benchmark::DoNotOptimize(m);
}
state.SetItemsProcessed(state.iterations() * n);
}
BENCHMARK(BM_mean)->Range(1 << 10, 1 << 22);
static void BM_max(benchmark::State& state) {
size_t n = state.range(0);
auto src = make_data(n);
for (auto _ : state) {
double m = numpy::max(src.data(), n);
benchmark::DoNotOptimize(m);
}
state.SetItemsProcessed(state.iterations() * n);
}
BENCHMARK(BM_max)->Range(1 << 10, 1 << 22);
// ---- dot product (1D) ---------------------------------------------------------
static void BM_dot(benchmark::State& state) {
size_t n = state.range(0);
auto a = make_data(n);
auto b = make_data(n);
for (auto _ : state) {
double d = numpy::dot(a.data(), b.data(), n);
benchmark::DoNotOptimize(d);
}
state.SetItemsProcessed(state.iterations() * n);
}
BENCHMARK(BM_dot)->Range(1 << 10, 1 << 22);
// ---- linalg norm --------------------------------------------------------------
static void BM_norm(benchmark::State& state) {
size_t n = state.range(0);
auto src = make_data(n);
for (auto _ : state) {
double r = numpy::linalg::norm(src.data(), n);
benchmark::DoNotOptimize(r);
}
state.SetItemsProcessed(state.iterations() * n);
}
BENCHMARK(BM_norm)->Range(1 << 10, 1 << 22);
// ---- main --------------------------------------------------------------------
BENCHMARK_MAIN();