diff options
author | hayati ayguen <h_ayguen@web.de> | 2020-06-12 18:21:26 +0000 |
---|---|---|
committer | hayati ayguen <h_ayguen@web.de> | 2020-06-12 18:21:26 +0000 |
commit | 1c17fd410b4fe1e615e8a8ad4abb87cf406177d2 (patch) | |
tree | 2758b60befd7412cfd6c005b04757df6b7da9b05 | |
parent | 7ed5e2a45040ae91c0b2fade901a503c77ccf381 (diff) | |
download | pffft-1c17fd410b4fe1e615e8a8ad4abb87cf406177d2.tar.gz |
added PocketFFT to benchmark
Signed-off-by: hayati ayguen <h_ayguen@web.de>
-rw-r--r-- | .gitmodules | 3 | ||||
-rw-r--r-- | CMakeLists.txt | 23 | ||||
-rw-r--r-- | bench_pffft.c | 79 | ||||
m--------- | pocketfft | 0 |
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 |