aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhayati ayguen <h_ayguen@web.de>2020-06-12 18:21:26 +0000
committerhayati ayguen <h_ayguen@web.de>2020-06-12 18:21:26 +0000
commit1c17fd410b4fe1e615e8a8ad4abb87cf406177d2 (patch)
tree2758b60befd7412cfd6c005b04757df6b7da9b05
parent7ed5e2a45040ae91c0b2fade901a503c77ccf381 (diff)
downloadpffft-1c17fd410b4fe1e615e8a8ad4abb87cf406177d2.tar.gz
added PocketFFT to benchmark
Signed-off-by: hayati ayguen <h_ayguen@web.de>
-rw-r--r--.gitmodules3
-rw-r--r--CMakeLists.txt23
-rw-r--r--bench_pffft.c79
m---------pocketfft0
4 files changed, 99 insertions, 6 deletions
diff --git a/.gitmodules b/.gitmodules
index 701a96c..9ef3633 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -4,3 +4,6 @@
[submodule "kissfft"]
path = kissfft
url = https://github.com/hayguen/kissfft.git
+[submodule "pocketfft"]
+ path = pocketfft
+ url = https://github.com/hayguen/pocketfft.git
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9b6bc10..87fd0e0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -11,9 +11,10 @@ option(USE_SIMD_NEON "force using NEON on ARM? (requires USE_SIMD)" OFF)
option(USE_SCALAR_VECT "use 4-element vector scalar operations (if no other SIMD)" ON)
# test options
-option(USE_BENCH_FFTW "use (system-installed) FFTW3 in fft benchmark?" OFF)
-option(USE_BENCH_GREEN "use Green FFT in fft benchmark? - if exists in subdir" ON)
-option(USE_BENCH_KISS "use KissFFT in fft benchmark? - if exists in subdir" ON)
+option(USE_BENCH_FFTW "use (system-installed) FFTW3 in fft benchmark?" OFF)
+option(USE_BENCH_GREEN "use Green FFT in fft benchmark? - if exists in subdir" ON)
+option(USE_BENCH_KISS "use KissFFT in fft benchmark? - if exists in subdir" ON)
+option(USE_BENCH_POCKET "use PocketFFT in fft benchmark? - if exists in subdir" ON)
option(USE_DEBUG_ASAN "use GCC's address sanitizer?" OFF)
@@ -61,6 +62,17 @@ if (USE_BENCH_KISS)
endif()
endif()
+if (USE_BENCH_POCKET)
+ # git submodule add https://github.com/hayguen/pocketfft.git
+ if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/pocketfft/pocketfft.c")
+ message(STATUS "found subdir pocketfft")
+ set(PATH_POCKET "${CMAKE_CURRENT_LIST_DIR}/pocketfft")
+ add_subdirectory( "${PATH_POCKET}" )
+ else()
+ message(WARNING "PocketFFT not found in subdir pocketfft")
+ endif()
+endif()
+
########################################################################
# select the release build type by default to get optimization flags
@@ -248,6 +260,11 @@ if (USE_TYPE_DOUBLE)
target_compile_definitions(bench_pffft_double PRIVATE HAVE_FFTW=1)
target_link_libraries(bench_pffft_double fftw3)
endif()
+
+ if (PATH_POCKET AND USE_BENCH_POCKET)
+ target_compile_definitions(bench_pffft_double PRIVATE HAVE_POCKET_FFT=1)
+ target_link_libraries(bench_pffft_double PocketFFT)
+ endif()
endif()
######################################################
diff --git a/bench_pffft.c b/bench_pffft.c
index 49d4faa..5d91c0d 100644
--- a/bench_pffft.c
+++ b/bench_pffft.c
@@ -61,6 +61,11 @@ typedef PFFFTD_Setup PFFFT_SETUP;
#endif
+#ifdef HAVE_POCKET_FFT
+#include <pocketfft.h>
+#endif
+
+
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
@@ -97,7 +102,7 @@ typedef fftw_complex FFTW_COMPLEX;
#endif
-#define NUM_FFT_ALGOS 8
+#define NUM_FFT_ALGOS 9
enum {
ALGO_FFTPACK = 0,
ALGO_VECLIB,
@@ -105,8 +110,9 @@ enum {
ALGO_FFTW_AUTO,
ALGO_GREEN,
ALGO_KISS,
- ALGO_PFFFT_U, /* = 6 */
- ALGO_PFFFT_O /* = 7 */
+ ALGO_POCKET,
+ ALGO_PFFFT_U, /* = 7 */
+ ALGO_PFFFT_O /* = 8 */
};
#define NUM_TYPES 7
@@ -128,6 +134,7 @@ const char * algoName[NUM_FFT_ALGOS] = {
"FFTW F(auto) ",
"Green ",
"Kiss ",
+ "Pocket ",
"PFFFT-U(simd)", /* unordered */
"PFFFT (simd) " /* ordered */
};
@@ -160,6 +167,11 @@ int compiledInAlgo[NUM_FFT_ALGOS] = {
#else
0,
#endif
+#if defined(HAVE_POCKET_FFT) && !defined(PFFFT_ENABLE_FLOAT)
+ 1, /* "Pocket " */
+#else
+ 0,
+#endif
1, /* "PFFFT_U " */
1 /* "PFFFT_O " */
};
@@ -171,6 +183,7 @@ const char * algoTableHeader[NUM_FFT_ALGOS][2] = {
{ "|real FFTWauto ", "|cplx FFTWauto " },
{ "| real Green ", "| cplx Green " },
{ "| real Kiss ", "| cplx Kiss " },
+{ "| real Pocket ", "| cplx Pocket " },
{ "| real PFFFT-U ", "| cplx PFFFT-U " },
{ "| real PFFFT ", "| cplx PFFFT " } };
@@ -820,6 +833,66 @@ void benchmark_ffts(int N, int cplx, int withFFTWfullMeas, double iterCal, doubl
}
#endif
+#if defined(HAVE_POCKET_FFT) && !defined(PFFFT_ENABLE_FLOAT)
+ Nmax = (cplx ? nextPow2N*2 : nextPow2N);
+ X[Nmax] = checkVal;
+ if ( 1 || PFFFT_FUNC(is_power_of_two)(N) )
+ {
+ rfft_plan planr;
+ cfft_plan planc;
+
+ te = uclock_sec();
+ if (cplx) {
+ planc = make_cfft_plan(nextPow2N);
+ } else {
+ planr = make_rfft_plan(nextPow2N);
+ }
+
+ t0 = uclock_sec();
+ tstop = t0 + max_test_duration;
+ max_iter = 0;
+ do {
+ for ( k = 0; k < step_iter; ++k ) {
+ if (cplx) {
+ assert( X[Nmax] == checkVal );
+ memcpy(Y, X, 2*nextPow2N * sizeof(pffft_scalar) );
+ cfft_forward(planc, Y, 1.);
+ assert( X[Nmax] == checkVal );
+ memcpy(X, Y, 2*nextPow2N * sizeof(pffft_scalar) );
+ cfft_backward(planc, X, 1./nextPow2N);
+ assert( X[Nmax] == checkVal );
+ } else {
+ assert( X[Nmax] == checkVal );
+ memcpy(Y, X, nextPow2N * sizeof(pffft_scalar) );
+ rfft_forward(planr, Y, 1.);
+ assert( X[Nmax] == checkVal );
+ memcpy(X, Y, nextPow2N * sizeof(pffft_scalar) );
+ rfft_backward(planr, X, 1./nextPow2N);
+ assert( X[Nmax] == checkVal );
+ }
+ ++max_iter;
+ }
+ t1 = uclock_sec();
+ } while ( t1 < tstop );
+
+ if (cplx) {
+ destroy_cfft_plan(planc);
+ } else {
+ destroy_rfft_plan(planr);
+ }
+
+ flops = (max_iter*2) * ((cplx ? 5 : 2.5)*N*log((double)N)/M_LN2); /* see http://www.fftw.org/speed/method.html */
+ tmeas[TYPE_ITER][ALGO_POCKET] = max_iter;
+ tmeas[TYPE_MFLOPS][ALGO_POCKET] = flops/1e6/(t1 - t0 + 1e-16);
+ tmeas[TYPE_DUR_TOT][ALGO_POCKET] = t1 - t0;
+ tmeas[TYPE_DUR_NS][ALGO_POCKET] = show_output("Pocket", N, cplx, flops, t0, t1, max_iter, tableFile);
+ tmeas[TYPE_PREP][ALGO_POCKET] = (t0 - te) * 1e3;
+ haveAlgo[ALGO_POCKET] = 1;
+ } else {
+ show_output("Pocket", N, cplx, -1, -1, -1, -1, tableFile);
+ }
+#endif
+
/* PFFFT-U (unordered) benchmark */
Nmax = (cplx ? pffftPow2N*2 : pffftPow2N);
diff --git a/pocketfft b/pocketfft
new file mode 160000
+Subproject f03285da5dbe1005888211ab95bbb116ea4af73