Files
ecgsyn.js/pffft/bench/CMakeLists.txt
2024-11-09 14:57:18 -06:00

225 lines
11 KiB
CMake

cmake_minimum_required(VERSION 2.8)
project(BENCH_PFFFT)
set(BENCH_ID "default" CACHE STRING "ID: use single word without spaces. gets part of result filename")
option(BENCH_FAST_MATH "Build with fast math - non IEEE compliant" ON)
if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
set(BENCH_ARCH "native" CACHE STRING "target architecture (-march): native/SSE:core2/AVX:sandybridge/ARM-NEON:armv7-a")
elseif (CMAKE_C_COMPILER_ID STREQUAL "Clang")
set(BENCH_ARCH "native" CACHE STRING "target architecture (-march): native/SSE:core2/AVX:sandybridge")
elseif (CMAKE_C_COMPILER_ID STREQUAL "MSVC") # others: "Intel"
set(BENCH_ARCH "AVX" CACHE STRING "target architecture (/arch): SSE2/AVX")
else()
set(BENCH_ARCH "" CACHE STRING "target architecture - use full compiler option!")
endif()
# architecture/optimization options
option(PFFFT_USE_SIMD "use SIMD (SSE/AVX/NEON/ALTIVEC) CPU features? - " ON)
option(DISABLE_SIMD_AVX "disable AVX CPU features? - " OFF)
option(PFFFT_USE_SIMD_NEON "force using NEON on ARM? (requires PFFFT_USE_SIMD)" OFF)
option(PFFFT_USE_SCALAR_VECT "use 4-element vector scalar operations (if no other SIMD)" ON)
option(PFFFT_USE_BENCH_FFTW "use (system-installed) FFTW3 in fft benchmark?" OFF)
option(PFFFT_USE_BENCH_GREEN "use Green FFT in fft benchmark? - if exists in subdir" ON)
option(PFFFT_USE_BENCH_KISS "use KissFFT in fft benchmark? - if exists in subdir" ON)
option(PFFFT_USE_BENCH_POCKET "use PocketFFT in fft benchmark? - if exists in subdir" ON)
option(PFFFT_USE_BENCH_MKL "use Intel MKL in fft benchmark? needs to be installed" OFF)
set(OSSTR "")
if (WIN32)
set(OSSTR "Win32")
endif (WIN32)
if (UNIX)
set(OSSTR "Unix")
endif (UNIX)
set(BUILD_DIR_TO_EXE "")
set(CMAKE_PLATFORM_OPT "")
set(CMAKE_MAKE_OPT "")
if (MSVC)
set(BUILD_DIR_TO_EXE "Release/")
set(CMAKE_PLATFORM_OPT "-A \"${CMAKE_GENERATOR_PLATFORM}\"")
set(CMAKE_MAKE_OPT "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}")
endif()
set(benchdir "${CMAKE_BINARY_DIR}/bench_${BENCH_ID}")
set(benchdir_flt "${CMAKE_BINARY_DIR}/bench_${BENCH_ID}/float")
set(benchdir_dbl "${CMAKE_BINARY_DIR}/bench_${BENCH_ID}/double")
set(builddir_flt "${CMAKE_BINARY_DIR}/build_${BENCH_ID}_float")
set(builddir_dbl "${CMAKE_BINARY_DIR}/build_${BENCH_ID}_double")
add_custom_command(OUTPUT "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E make_directory "${benchdir}"
COMMAND ${CMAKE_COMMAND} -E echo "benchmark ${BENCH_ID}" > "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "CMake major: ${CMAKE_MAJOR_VERSION}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "CMake minor: ${CMAKE_MINOR_VERSION}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "OS: ${OSSTR}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "System: ${CMAKE_SYSTEM_NAME}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "System CPU: ${CMAKE_SYSTEM_PROCESSOR}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "System Version: ${CMAKE_HOST_SYSTEM_VERSION}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "C Compiler: ${CMAKE_C_COMPILER_ID}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "C Version: ${CMAKE_C_COMPILER_VERSION}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "C++ Compiler: ${CMAKE_CXX_COMPILER_ID}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "C++ Version: ${CMAKE_CXX_COMPILER_VERSION}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "MSVC Version: ${MSVC_VERSION}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "MSVC Toolset: ${MSVC_TOOLSET_VERSION}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "Exe Suffix: ${CMAKE_EXECUTABLE_SUFFIX}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "C Byte Order: ${CMAKE_C_BYTE_ORDER}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "C++ Byte Order: ${CMAKE_CXX_BYTE_ORDER}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "Architecture: ${BENCH_ARCH}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "Fast math: ${BENCH_FAST_MATH}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "config PFFFT_USE_SIMD=${PFFFT_USE_SIMD}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "config DISABLE_SIMD_AVX=${DISABLE_SIMD_AVX}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "config PFFFT_USE_SIMD_NEON=${PFFFT_USE_SIMD_NEON}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "config PFFFT_USE_SCALAR_VECT=${PFFFT_USE_SCALAR_VECT}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "config PFFFT_USE_BENCH_FFTW=${PFFFT_USE_BENCH_FFTW}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "config PFFFT_USE_BENCH_GREEN=${PFFFT_USE_BENCH_GREEN}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "config PFFFT_USE_BENCH_KISS=${PFFFT_USE_BENCH_KISS}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "config PFFFT_USE_BENCH_POCKET=${PFFFT_USE_BENCH_POCKET}" >> "${benchdir}/info.txt"
COMMAND ${CMAKE_COMMAND} -E echo "config PFFFT_USE_BENCH_MKL=${PFFFT_USE_BENCH_MKL}" >> "${benchdir}/info.txt"
)
if (UNIX)
add_custom_command(OUTPUT "${benchdir}/unix_info.txt"
COMMAND ${CMAKE_COMMAND} -E touch "${benchdir}/unix_info.txt"
COMMAND bash "-c" "${CMAKE_CURRENT_SOURCE_DIR}/unix_info.sh"
DEPENDS "${benchdir}/info.txt"
WORKING_DIRECTORY ${benchdir}
)
else()
add_custom_command(OUTPUT "${benchdir}/unix_info.txt"
COMMAND ${CMAKE_COMMAND} -E touch "${benchdir}/unix_info.txt"
DEPENDS "${benchdir}/info.txt"
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
endif()
add_custom_command(OUTPUT "${builddir_flt}/directory.txt"
COMMAND ${CMAKE_COMMAND} -E make_directory "${builddir_flt}"
COMMAND ${CMAKE_COMMAND} -E touch "${builddir_flt}/directory.txt"
)
add_custom_command(OUTPUT "${builddir_dbl}/directory.txt"
COMMAND ${CMAKE_COMMAND} -E make_directory "${builddir_dbl}"
COMMAND ${CMAKE_COMMAND} -E touch "${builddir_dbl}/directory.txt"
)
add_custom_command(OUTPUT "${benchdir_flt}/directory.txt"
COMMAND ${CMAKE_COMMAND} -E make_directory "${benchdir_flt}"
COMMAND ${CMAKE_COMMAND} -E touch "${benchdir_flt}/directory.txt"
)
add_custom_command(OUTPUT "${benchdir_dbl}/directory.txt"
COMMAND ${CMAKE_COMMAND} -E make_directory "${benchdir_dbl}"
COMMAND ${CMAKE_COMMAND} -E touch "${benchdir_dbl}/directory.txt"
)
add_custom_target(build_float
COMMAND ${CMAKE_COMMAND} -E echo "start cmake for float in ${builddir_flt}"
COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" ${CMAKE_PLATFORM_OPT}
"${CMAKE_MAKE_OPT}"
-DCMAKE_BUILD_TYPE=Release
"-DARCH=${BENCH_ARCH}"
-DUSE_FAST_MATH=${BENCH_FAST_MATH}
-DPFFFT_USE_TYPE_FLOAT=ON
-DPFFFT_USE_TYPE_DOUBLE=OFF
-DUSE_FLOAT_PREC=ON
-DPFFFT_USE_SIMD=${PFFFT_USE_SIMD}
-DDISABLE_SIMD_AVX=${DISABLE_SIMD_AVX}
-DPFFFT_USE_SIMD_NEON=${PFFFT_USE_SIMD_NEON}
-DPFFFT_USE_SCALAR_VECT=${PFFFT_USE_SCALAR_VECT}
-DPFFFT_USE_BENCH_FFTW=${PFFFT_USE_BENCH_FFTW}
-DPFFFT_USE_BENCH_GREEN=${PFFFT_USE_BENCH_GREEN}
-DPFFFT_USE_BENCH_KISS=${PFFFT_USE_BENCH_KISS}
-DPFFFT_USE_BENCH_POCKET=${PFFFT_USE_BENCH_POCKET}
-DPFFFT_USE_BENCH_MKL=${PFFFT_USE_BENCH_MKL}
"${CMAKE_SOURCE_DIR}/.."
# COMMAND ${CMAKE_COMMAND} -E echo "start cmake --build . for float in ${builddir_flt}"
COMMAND ${CMAKE_COMMAND} --build . --config Release
DEPENDS "${builddir_flt}/directory.txt"
WORKING_DIRECTORY "${builddir_flt}"
)
add_custom_target(build_double
COMMAND ${CMAKE_COMMAND} -E echo "start cmake for double in ${builddir_dbl}"
COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" ${CMAKE_PLATFORM_OPT}
"${CMAKE_MAKE_OPT}"
-DCMAKE_BUILD_TYPE=Release
"-DARCH=${BENCH_ARCH}"
-DUSE_FAST_MATH=${BENCH_FAST_MATH}
-DPFFFT_USE_TYPE_FLOAT=OFF
-DPFFFT_USE_TYPE_DOUBLE=ON
-DUSE_FLOAT_PREC=OFF
-DPFFFT_USE_SIMD=${PFFFT_USE_SIMD}
-DDISABLE_SIMD_AVX=${DISABLE_SIMD_AVX}
-DPFFFT_USE_SIMD_NEON=${PFFFT_USE_SIMD_NEON}
-DPFFFT_USE_SCALAR_VECT=${PFFFT_USE_SCALAR_VECT}
-DPFFFT_USE_BENCH_FFTW=${PFFFT_USE_BENCH_FFTW}
-DPFFFT_USE_BENCH_GREEN=${PFFFT_USE_BENCH_GREEN}
-DPFFFT_USE_BENCH_KISS=${PFFFT_USE_BENCH_KISS}
-DPFFFT_USE_BENCH_POCKET=${PFFFT_USE_BENCH_POCKET}
-DPFFFT_USE_BENCH_MKL=${PFFFT_USE_BENCH_MKL}
"${CMAKE_SOURCE_DIR}/.."
COMMAND ${CMAKE_COMMAND} -E echo "start cmake --build . for double in ${builddir_dbl}"
COMMAND ${CMAKE_COMMAND} --build . --config Release
DEPENDS "${builddir_dbl}/directory.txt"
WORKING_DIRECTORY "${builddir_dbl}"
)
add_custom_target(bench_float
COMMAND ${CMAKE_COMMAND} -E echo "start benchmark for float"
COMMAND "${builddir_flt}/${BUILD_DIR_TO_EXE}bench_pffft_float${CMAKE_EXECUTABLE_SUFFIX}"
DEPENDS "${benchdir_flt}/directory.txt" build_float
WORKING_DIRECTORY "${benchdir_flt}"
)
add_custom_target(bench_double
COMMAND ${CMAKE_COMMAND} -E echo "start benchmark for double"
COMMAND "${builddir_dbl}/${BUILD_DIR_TO_EXE}bench_pffft_double${CMAKE_EXECUTABLE_SUFFIX}"
DEPENDS "${benchdir_dbl}/directory.txt" build_double
WORKING_DIRECTORY "${benchdir_dbl}"
)
add_custom_target(bench ALL
COMMAND ${CMAKE_COMMAND} -E echo ""
COMMAND ${CMAKE_COMMAND} -E tar cvz "bench_${BENCH_ID}.tgz" ${benchdir}
COMMAND ${CMAKE_COMMAND} -E echo ""
COMMAND ${CMAKE_COMMAND} -E echo "now mail result file bench_${BENCH_ID}.tgz"
# DEPENDS "${benchdir}/info.txt" "${benchdir}/unix_info.txt"
DEPENDS "${benchdir}/info.txt" bench_float bench_double "${benchdir}/unix_info.txt"
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
)
add_custom_target(bench_float_tar
COMMAND ${CMAKE_COMMAND} -E echo ""
COMMAND ${CMAKE_COMMAND} -E tar cvz "bench_${BENCH_ID}.tgz" ${benchdir}
COMMAND ${CMAKE_COMMAND} -E echo ""
COMMAND ${CMAKE_COMMAND} -E echo "now mail result file bench_${BENCH_ID}.tgz"
DEPENDS "${benchdir}/info.txt" bench_float "${benchdir}/unix_info.txt"
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
)
add_custom_target(bench_double_tar
COMMAND ${CMAKE_COMMAND} -E echo ""
COMMAND ${CMAKE_COMMAND} -E tar cvz "bench_${BENCH_ID}.tgz" ${benchdir}
COMMAND ${CMAKE_COMMAND} -E echo ""
COMMAND ${CMAKE_COMMAND} -E echo "now mail result file bench_${BENCH_ID}.tgz"
DEPENDS "${benchdir}/info.txt" bench_double "${benchdir}/unix_info.txt"
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
)
add_custom_target(clean_results
COMMAND ${CMAKE_COMMAND} -E remove_directory "${builddir_flt}"
COMMAND ${CMAKE_COMMAND} -E remove_directory "${builddir_dbl}"
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
)