Skip to content

Commit 51a110a

Browse files
committed
Add multi-threaded benchmarks.
1 parent ceacfa2 commit 51a110a

File tree

4 files changed

+69
-18
lines changed

4 files changed

+69
-18
lines changed

.github/workflows/build-linux.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
compiler: ["gcc"]
2020
window: ["kaiserbessel", "gaussian", "bspline", "sinc"] # TODO: Add dirac.
2121
precision_opt: ["", "--enable-float", "--enable-long-double"]
22-
openmp: [0, 1]
22+
openmp: [1]
2323
build_octave: [0] # TODO: Re-activate Octave build and tests.
2424
build_julia: [1]
2525
include:
@@ -132,7 +132,7 @@ jobs:
132132
if: steps.cache-codspeed.outputs.cache-hit != 'true'
133133
run: |
134134
cd codspeed-cpp/google_benchmark
135-
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBENCHMARK_DOWNLOAD_DEPENDENCIES=ON -DCODSPEED_MODE=instrumentation -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_EXTENSIONS=OFF.
135+
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBENCHMARK_DOWNLOAD_DEPENDENCIES=ON -DCODSPEED_MODE=instrumentation -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_EXTENSIONS=OFF .
136136
137137
- name: Build CodSpeed integration library
138138
if: steps.cache-codspeed.outputs.cache-hit != 'true'

benchmarks/Makefile.am

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,38 @@ bench_nfft_direct_SOURCES = bench_nfft_direct.cpp util.h
77
bench_nfft_direct_CXXFLAGS = @nfft_benchmarks_CXXFLAGS@ @CXXFLAGS@
88
bench_nfft_direct_LDFLAGS = @nfft_benchmarks_LDFLAGS@ @fftw3_LDFLAGS@ @LDFLAGS@
99
bench_nfft_direct_LDADD = @nfft_benchmarks_LIBS@ $(top_builddir)/libnfft3@PREC_SUFFIX@.la @fftw3_LIBS@ @LIBS@
10+
if ENABLE_OPENMP
11+
NFFT_BENCHMARKS_DIRECT_OMP = bench_nfft_direct_omp
12+
bench_nfft_direct_omp_SOURCES = bench_nfft_direct.cpp util.h
13+
bench_nfft_direct_omp_CXXFLAGS = @nfft_benchmarks_CXXFLAGS@ $(OPENMP_CFLAGS) @CXXFLAGS@
14+
bench_nfft_direct_omp_LDFLAGS = @nfft_benchmarks_LDFLAGS@ @fftw3_LDFLAGS@ $(OPENMP_CFLAGS) @LDFLAGS@
15+
bench_nfft_direct_omp_LDADD = @nfft_benchmarks_LIBS@ $(top_builddir)/libnfft3@PREC_SUFFIX@_omp.la @fftw3_LIBS_omp@ @fftw3_LIBS@ $(OPENMP_LIBS)
16+
endif
1017
else
1118
NFFT_BENCHMARKS_DIRECT =
19+
NFFT_BENCHMARKS_DIRECT_OMP =
1220
endif
1321
else
1422
NFFT_BENCHMARKS_DIRECT =
23+
NFFT_BENCHMARKS_DIRECT_OMP =
1524
endif
1625

1726
# Aggregate all benchmarks
1827
NFFT_BENCHMARKS = $(NFFT_BENCHMARKS_DIRECT)
1928

20-
noinst_PROGRAMS = $(NFFT_BENCHMARKS)
29+
if ENABLE_OPENMP
30+
NFFT_BENCHMARKS_OMP = $(NFFT_BENCHMARKS_DIRECT_OMP)
31+
endif
32+
33+
noinst_PROGRAMS = $(NFFT_BENCHMARKS) $(NFFT_BENCHMARKS_OMP)
2134

2235
# Run all built benchmarks
23-
bench: $(NFFT_BENCHMARKS)
36+
bench: $(NFFT_BENCHMARKS) $(NFFT_BENCHMARKS_OMP)
2437
for bench in $(NFFT_BENCHMARKS); do \
2538
echo "Running $$bench..."; \
2639
./$$bench; \
2740
done
41+
for bench in $(NFFT_BENCHMARKS_OMP); do \
42+
echo "Running $$bench..."; \
43+
./$$bench; \
44+
done

benchmarks/bench_nfft_direct.cpp

Lines changed: 47 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,30 @@
2727

2828
#include "util.h"
2929

30+
#ifdef _OPENMP
31+
#define SUFFIX "_omp"
32+
#else
33+
#define SUFFIX ""
34+
#endif
35+
36+
static void DoSetup(const benchmark::State& state) {
37+
#ifdef _OPENMP
38+
#ifdef HAVE_FFTW_THREADS
39+
FFTW(init_threads)();
40+
#endif
41+
#endif
42+
}
43+
44+
static void DoTeardown(const benchmark::State& state) {
45+
#ifdef _OPENMP
46+
#ifdef HAVE_FFTW_THREADS
47+
FFTW(cleanup_threads)();
48+
#endif
49+
#endif
50+
}
51+
3052
// Helper function to initialize random data
31-
static void NFFT(init_random_data)(NFFT(plan)* plan) {
53+
static void init_random_data(NFFT(plan)* plan) {
3254
NFFT(vrand_shifted_unit_double)(plan->x, plan->d * plan->M_total);
3355
NFFT(vrand_unit_complex)(plan->f_hat, plan->N_total);
3456
NFFT(vrand_unit_complex)(plan->f, plan->M_total);
@@ -41,7 +63,7 @@ static void nfft_forward_direct_1d(benchmark::State& state) {
4163

4264
NFFT(plan) plan;
4365
NFFT(init_1d)(&plan, N, M);
44-
NFFT(init_random_data)(&plan);
66+
init_random_data(&plan);
4567

4668
for (auto _ : state) {
4769
NFFT(trafo_direct)(&plan);
@@ -58,7 +80,7 @@ static void nfft_adjoint_direct_1d(benchmark::State& state) {
5880

5981
NFFT(plan) plan;
6082
NFFT(init_1d)(&plan, N, M);
61-
NFFT(init_random_data)(&plan);
83+
init_random_data(&plan);
6284

6385
for (auto _ : state) {
6486
NFFT(adjoint_direct)(&plan);
@@ -76,7 +98,7 @@ static void nfft_forward_direct_2d(benchmark::State& state) {
7698

7799
NFFT(plan) plan;
78100
NFFT(init_2d)(&plan, N1, N2, M);
79-
NFFT(init_random_data)(&plan);
101+
init_random_data(&plan);
80102

81103
for (auto _ : state) {
82104
NFFT(trafo_direct)(&plan);
@@ -94,7 +116,7 @@ static void nfft_adjoint_direct_2d(benchmark::State& state) {
94116

95117
NFFT(plan) plan;
96118
NFFT(init_2d)(&plan, N1, N2, M);
97-
NFFT(init_random_data)(&plan);
119+
init_random_data(&plan);
98120

99121
for (auto _ : state) {
100122
NFFT(adjoint_direct)(&plan);
@@ -113,7 +135,7 @@ static void nfft_forward_direct_3d(benchmark::State& state) {
113135

114136
NFFT(plan) plan;
115137
NFFT(init_3d)(&plan, N1, N2, N3, M);
116-
NFFT(init_random_data)(&plan);
138+
init_random_data(&plan);
117139

118140
for (auto _ : state) {
119141
NFFT(trafo_direct)(&plan);
@@ -132,7 +154,7 @@ static void nfft_adjoint_direct_3d(benchmark::State& state) {
132154

133155
NFFT(plan) plan;
134156
NFFT(init_3d)(&plan, N1, N2, N3, M);
135-
NFFT(init_random_data)(&plan);
157+
init_random_data(&plan);
136158

137159
for (auto _ : state) {
138160
NFFT(adjoint_direct)(&plan);
@@ -143,44 +165,56 @@ static void nfft_adjoint_direct_3d(benchmark::State& state) {
143165
}
144166

145167
// Register benchmarks for direct transforms
146-
BENCH(nfft_forward_direct_1d)
168+
BENCH(nfft_forward_direct_1d, SUFFIX)
147169
->Args({32, 100})
148170
->Args({64, 200})
149171
->Args({128, 400})
150172
->Args({256, 800})
151173
->Args({512, 1600})
174+
->Setup(DoSetup)
175+
->Teardown(DoTeardown)
152176
->Complexity();
153177

154-
BENCH(nfft_adjoint_direct_1d)
178+
BENCH(nfft_adjoint_direct_1d, SUFFIX)
155179
->Args({32, 100})
156180
->Args({64, 200})
157181
->Args({128, 400})
158182
->Args({256, 800})
159183
->Args({512, 1600})
184+
->Setup(DoSetup)
185+
->Teardown(DoTeardown)
160186
->Complexity();
161187

162-
BENCH(nfft_forward_direct_2d)
188+
BENCH(nfft_forward_direct_2d, SUFFIX)
163189
->Args({16, 16, 500})
164190
->Args({32, 32, 1000})
165191
->Args({64, 64, 2000})
192+
->Setup(DoSetup)
193+
->Teardown(DoTeardown)
166194
->Complexity();
167195

168-
BENCH(nfft_adjoint_direct_2d)
196+
BENCH(nfft_adjoint_direct_2d, SUFFIX)
169197
->Args({16, 16, 500})
170198
->Args({32, 32, 1000})
171199
->Args({64, 64, 2000})
200+
->Setup(DoSetup)
201+
->Teardown(DoTeardown)
172202
->Complexity();
173203

174-
BENCH(nfft_forward_direct_3d)
204+
BENCH(nfft_forward_direct_3d, SUFFIX)
175205
->Args({4, 4, 4, 250})
176206
->Args({8, 8, 8, 500})
177207
->Args({16, 16, 16, 1000})
208+
->Setup(DoSetup)
209+
->Teardown(DoTeardown)
178210
->Complexity();
179211

180-
BENCH(nfft_adjoint_direct_3d)
212+
BENCH(nfft_adjoint_direct_3d, SUFFIX)
181213
->Args({4, 4, 4, 250})
182214
->Args({8, 8, 8, 500})
183215
->Args({16, 16, 16, 1000})
216+
->Setup(DoSetup)
217+
->Teardown(DoTeardown)
184218
->Complexity();
185219

186220
// Main function.

benchmarks/util.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@
2222
#include "config.h"
2323

2424
// Macro to register benchmark with optional prefix
25-
#define BENCH(function) BENCHMARK(function)->Name("benchmarks/" __FILE__ "::" BENCHMARKS_PREFIX #function)
25+
#define BENCH(function, suffix) BENCHMARK(function)->Name("benchmarks/" __FILE__ "::" BENCHMARKS_PREFIX #function suffix)
2626

2727
#endif // NFFT_BENCHMARKS_UTIL_H

0 commit comments

Comments
 (0)