1cmake_minimum_required(VERSION 2.8) 2project(BENCH_PFFFT) 3 4set(BENCH_ID "default" CACHE STRING "ID: use single word without spaces. gets part of result filename") 5 6option(BENCH_FAST_MATH "Build with fast math - non IEEE compliant" ON) 7 8if (CMAKE_C_COMPILER_ID STREQUAL "GNU") 9 set(BENCH_ARCH "native" CACHE STRING "target architecture (-march): native/SSE:core2/AVX:sandybridge/ARM-NEON:armv7-a") 10elseif (CMAKE_C_COMPILER_ID STREQUAL "Clang") 11 set(BENCH_ARCH "native" CACHE STRING "target architecture (-march): native/SSE:core2/AVX:sandybridge") 12elseif (CMAKE_C_COMPILER_ID STREQUAL "MSVC") # others: "Intel" 13 set(BENCH_ARCH "AVX" CACHE STRING "target architecture (/arch): SSE2/AVX") 14else() 15 set(BENCH_ARCH "" CACHE STRING "target architecture - use full compiler option!") 16endif() 17 18# architecture/optimization options 19option(PFFFT_USE_SIMD "use SIMD (SSE/AVX/NEON/ALTIVEC) CPU features? - " ON) 20option(DISABLE_SIMD_AVX "disable AVX CPU features? - " OFF) 21option(PFFFT_USE_SIMD_NEON "force using NEON on ARM? (requires PFFFT_USE_SIMD)" OFF) 22option(PFFFT_USE_SCALAR_VECT "use 4-element vector scalar operations (if no other SIMD)" ON) 23 24option(PFFFT_USE_BENCH_FFTW "use (system-installed) FFTW3 in fft benchmark?" OFF) 25option(PFFFT_USE_BENCH_GREEN "use Green FFT in fft benchmark? - if exists in subdir" ON) 26option(PFFFT_USE_BENCH_KISS "use KissFFT in fft benchmark? - if exists in subdir" ON) 27option(PFFFT_USE_BENCH_POCKET "use PocketFFT in fft benchmark? - if exists in subdir" ON) 28option(PFFFT_USE_BENCH_MKL "use Intel MKL in fft benchmark? needs to be installed" OFF) 29 30 31set(OSSTR "") 32if (WIN32) 33 set(OSSTR "Win32") 34endif (WIN32) 35if (UNIX) 36 set(OSSTR "Unix") 37endif (UNIX) 38 39set(BUILD_DIR_TO_EXE "") 40set(CMAKE_PLATFORM_OPT "") 41set(CMAKE_MAKE_OPT "") 42if (MSVC) 43 set(BUILD_DIR_TO_EXE "Release/") 44 set(CMAKE_PLATFORM_OPT "-A \"${CMAKE_GENERATOR_PLATFORM}\"") 45 set(CMAKE_MAKE_OPT "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}") 46endif() 47 48 49set(benchdir "${CMAKE_BINARY_DIR}/bench_${BENCH_ID}") 50set(benchdir_flt "${CMAKE_BINARY_DIR}/bench_${BENCH_ID}/float") 51set(benchdir_dbl "${CMAKE_BINARY_DIR}/bench_${BENCH_ID}/double") 52set(builddir_flt "${CMAKE_BINARY_DIR}/build_${BENCH_ID}_float") 53set(builddir_dbl "${CMAKE_BINARY_DIR}/build_${BENCH_ID}_double") 54 55add_custom_command(OUTPUT "${benchdir}/info.txt" 56 COMMAND ${CMAKE_COMMAND} -E make_directory "${benchdir}" 57 COMMAND ${CMAKE_COMMAND} -E echo "benchmark ${BENCH_ID}" > "${benchdir}/info.txt" 58 COMMAND ${CMAKE_COMMAND} -E echo "CMake major: ${CMAKE_MAJOR_VERSION}" >> "${benchdir}/info.txt" 59 COMMAND ${CMAKE_COMMAND} -E echo "CMake minor: ${CMAKE_MINOR_VERSION}" >> "${benchdir}/info.txt" 60 COMMAND ${CMAKE_COMMAND} -E echo "OS: ${OSSTR}" >> "${benchdir}/info.txt" 61 COMMAND ${CMAKE_COMMAND} -E echo "System: ${CMAKE_SYSTEM_NAME}" >> "${benchdir}/info.txt" 62 COMMAND ${CMAKE_COMMAND} -E echo "System CPU: ${CMAKE_SYSTEM_PROCESSOR}" >> "${benchdir}/info.txt" 63 COMMAND ${CMAKE_COMMAND} -E echo "System Version: ${CMAKE_HOST_SYSTEM_VERSION}" >> "${benchdir}/info.txt" 64 COMMAND ${CMAKE_COMMAND} -E echo "C Compiler: ${CMAKE_C_COMPILER_ID}" >> "${benchdir}/info.txt" 65 COMMAND ${CMAKE_COMMAND} -E echo "C Version: ${CMAKE_C_COMPILER_VERSION}" >> "${benchdir}/info.txt" 66 COMMAND ${CMAKE_COMMAND} -E echo "C++ Compiler: ${CMAKE_CXX_COMPILER_ID}" >> "${benchdir}/info.txt" 67 COMMAND ${CMAKE_COMMAND} -E echo "C++ Version: ${CMAKE_CXX_COMPILER_VERSION}" >> "${benchdir}/info.txt" 68 COMMAND ${CMAKE_COMMAND} -E echo "MSVC Version: ${MSVC_VERSION}" >> "${benchdir}/info.txt" 69 COMMAND ${CMAKE_COMMAND} -E echo "MSVC Toolset: ${MSVC_TOOLSET_VERSION}" >> "${benchdir}/info.txt" 70 COMMAND ${CMAKE_COMMAND} -E echo "Exe Suffix: ${CMAKE_EXECUTABLE_SUFFIX}" >> "${benchdir}/info.txt" 71 COMMAND ${CMAKE_COMMAND} -E echo "C Byte Order: ${CMAKE_C_BYTE_ORDER}" >> "${benchdir}/info.txt" 72 COMMAND ${CMAKE_COMMAND} -E echo "C++ Byte Order: ${CMAKE_CXX_BYTE_ORDER}" >> "${benchdir}/info.txt" 73 COMMAND ${CMAKE_COMMAND} -E echo "" >> "${benchdir}/info.txt" 74 COMMAND ${CMAKE_COMMAND} -E echo "Architecture: ${BENCH_ARCH}" >> "${benchdir}/info.txt" 75 COMMAND ${CMAKE_COMMAND} -E echo "Fast math: ${BENCH_FAST_MATH}" >> "${benchdir}/info.txt" 76 COMMAND ${CMAKE_COMMAND} -E echo "config PFFFT_USE_SIMD=${PFFFT_USE_SIMD}" >> "${benchdir}/info.txt" 77 COMMAND ${CMAKE_COMMAND} -E echo "config DISABLE_SIMD_AVX=${DISABLE_SIMD_AVX}" >> "${benchdir}/info.txt" 78 COMMAND ${CMAKE_COMMAND} -E echo "config PFFFT_USE_SIMD_NEON=${PFFFT_USE_SIMD_NEON}" >> "${benchdir}/info.txt" 79 COMMAND ${CMAKE_COMMAND} -E echo "config PFFFT_USE_SCALAR_VECT=${PFFFT_USE_SCALAR_VECT}" >> "${benchdir}/info.txt" 80 COMMAND ${CMAKE_COMMAND} -E echo "config PFFFT_USE_BENCH_FFTW=${PFFFT_USE_BENCH_FFTW}" >> "${benchdir}/info.txt" 81 COMMAND ${CMAKE_COMMAND} -E echo "config PFFFT_USE_BENCH_GREEN=${PFFFT_USE_BENCH_GREEN}" >> "${benchdir}/info.txt" 82 COMMAND ${CMAKE_COMMAND} -E echo "config PFFFT_USE_BENCH_KISS=${PFFFT_USE_BENCH_KISS}" >> "${benchdir}/info.txt" 83 COMMAND ${CMAKE_COMMAND} -E echo "config PFFFT_USE_BENCH_POCKET=${PFFFT_USE_BENCH_POCKET}" >> "${benchdir}/info.txt" 84 COMMAND ${CMAKE_COMMAND} -E echo "config PFFFT_USE_BENCH_MKL=${PFFFT_USE_BENCH_MKL}" >> "${benchdir}/info.txt" 85) 86 87if (UNIX) 88 add_custom_command(OUTPUT "${benchdir}/unix_info.txt" 89 COMMAND ${CMAKE_COMMAND} -E touch "${benchdir}/unix_info.txt" 90 COMMAND bash "-c" "${CMAKE_CURRENT_SOURCE_DIR}/unix_info.sh" 91 DEPENDS "${benchdir}/info.txt" 92 WORKING_DIRECTORY ${benchdir} 93 ) 94else() 95 add_custom_command(OUTPUT "${benchdir}/unix_info.txt" 96 COMMAND ${CMAKE_COMMAND} -E touch "${benchdir}/unix_info.txt" 97 DEPENDS "${benchdir}/info.txt" 98 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} 99 ) 100endif() 101 102 103add_custom_command(OUTPUT "${builddir_flt}/directory.txt" 104 COMMAND ${CMAKE_COMMAND} -E make_directory "${builddir_flt}" 105 COMMAND ${CMAKE_COMMAND} -E touch "${builddir_flt}/directory.txt" 106) 107 108add_custom_command(OUTPUT "${builddir_dbl}/directory.txt" 109 COMMAND ${CMAKE_COMMAND} -E make_directory "${builddir_dbl}" 110 COMMAND ${CMAKE_COMMAND} -E touch "${builddir_dbl}/directory.txt" 111) 112 113add_custom_command(OUTPUT "${benchdir_flt}/directory.txt" 114 COMMAND ${CMAKE_COMMAND} -E make_directory "${benchdir_flt}" 115 COMMAND ${CMAKE_COMMAND} -E touch "${benchdir_flt}/directory.txt" 116) 117 118add_custom_command(OUTPUT "${benchdir_dbl}/directory.txt" 119 COMMAND ${CMAKE_COMMAND} -E make_directory "${benchdir_dbl}" 120 COMMAND ${CMAKE_COMMAND} -E touch "${benchdir_dbl}/directory.txt" 121) 122 123 124 125add_custom_target(build_float 126 COMMAND ${CMAKE_COMMAND} -E echo "start cmake for float in ${builddir_flt}" 127 COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" ${CMAKE_PLATFORM_OPT} 128 "${CMAKE_MAKE_OPT}" 129 -DCMAKE_BUILD_TYPE=Release 130 "-DARCH=${BENCH_ARCH}" 131 -DUSE_FAST_MATH=${BENCH_FAST_MATH} 132 -DPFFFT_USE_TYPE_FLOAT=ON 133 -DPFFFT_USE_TYPE_DOUBLE=OFF 134 -DUSE_FLOAT_PREC=ON 135 -DPFFFT_USE_SIMD=${PFFFT_USE_SIMD} 136 -DDISABLE_SIMD_AVX=${DISABLE_SIMD_AVX} 137 -DPFFFT_USE_SIMD_NEON=${PFFFT_USE_SIMD_NEON} 138 -DPFFFT_USE_SCALAR_VECT=${PFFFT_USE_SCALAR_VECT} 139 -DPFFFT_USE_BENCH_FFTW=${PFFFT_USE_BENCH_FFTW} 140 -DPFFFT_USE_BENCH_GREEN=${PFFFT_USE_BENCH_GREEN} 141 -DPFFFT_USE_BENCH_KISS=${PFFFT_USE_BENCH_KISS} 142 -DPFFFT_USE_BENCH_POCKET=${PFFFT_USE_BENCH_POCKET} 143 -DPFFFT_USE_BENCH_MKL=${PFFFT_USE_BENCH_MKL} 144 "${CMAKE_SOURCE_DIR}/.." 145 # COMMAND ${CMAKE_COMMAND} -E echo "start cmake --build . for float in ${builddir_flt}" 146 COMMAND ${CMAKE_COMMAND} --build . --config Release 147 DEPENDS "${builddir_flt}/directory.txt" 148 WORKING_DIRECTORY "${builddir_flt}" 149) 150 151add_custom_target(build_double 152 COMMAND ${CMAKE_COMMAND} -E echo "start cmake for double in ${builddir_dbl}" 153 COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" ${CMAKE_PLATFORM_OPT} 154 "${CMAKE_MAKE_OPT}" 155 -DCMAKE_BUILD_TYPE=Release 156 "-DARCH=${BENCH_ARCH}" 157 -DUSE_FAST_MATH=${BENCH_FAST_MATH} 158 -DPFFFT_USE_TYPE_FLOAT=OFF 159 -DPFFFT_USE_TYPE_DOUBLE=ON 160 -DUSE_FLOAT_PREC=OFF 161 -DPFFFT_USE_SIMD=${PFFFT_USE_SIMD} 162 -DDISABLE_SIMD_AVX=${DISABLE_SIMD_AVX} 163 -DPFFFT_USE_SIMD_NEON=${PFFFT_USE_SIMD_NEON} 164 -DPFFFT_USE_SCALAR_VECT=${PFFFT_USE_SCALAR_VECT} 165 -DPFFFT_USE_BENCH_FFTW=${PFFFT_USE_BENCH_FFTW} 166 -DPFFFT_USE_BENCH_GREEN=${PFFFT_USE_BENCH_GREEN} 167 -DPFFFT_USE_BENCH_KISS=${PFFFT_USE_BENCH_KISS} 168 -DPFFFT_USE_BENCH_POCKET=${PFFFT_USE_BENCH_POCKET} 169 -DPFFFT_USE_BENCH_MKL=${PFFFT_USE_BENCH_MKL} 170 "${CMAKE_SOURCE_DIR}/.." 171 COMMAND ${CMAKE_COMMAND} -E echo "start cmake --build . for double in ${builddir_dbl}" 172 COMMAND ${CMAKE_COMMAND} --build . --config Release 173 DEPENDS "${builddir_dbl}/directory.txt" 174 WORKING_DIRECTORY "${builddir_dbl}" 175) 176 177add_custom_target(bench_float 178 COMMAND ${CMAKE_COMMAND} -E echo "start benchmark for float" 179 COMMAND "${builddir_flt}/${BUILD_DIR_TO_EXE}bench_pffft_float${CMAKE_EXECUTABLE_SUFFIX}" 180 DEPENDS "${benchdir_flt}/directory.txt" build_float 181 WORKING_DIRECTORY "${benchdir_flt}" 182) 183 184add_custom_target(bench_double 185 COMMAND ${CMAKE_COMMAND} -E echo "start benchmark for double" 186 COMMAND "${builddir_dbl}/${BUILD_DIR_TO_EXE}bench_pffft_double${CMAKE_EXECUTABLE_SUFFIX}" 187 DEPENDS "${benchdir_dbl}/directory.txt" build_double 188 WORKING_DIRECTORY "${benchdir_dbl}" 189) 190 191add_custom_target(bench ALL 192 COMMAND ${CMAKE_COMMAND} -E echo "" 193 COMMAND ${CMAKE_COMMAND} -E tar cvz "bench_${BENCH_ID}.tgz" ${benchdir} 194 COMMAND ${CMAKE_COMMAND} -E echo "" 195 COMMAND ${CMAKE_COMMAND} -E echo "now mail result file bench_${BENCH_ID}.tgz" 196 # DEPENDS "${benchdir}/info.txt" "${benchdir}/unix_info.txt" 197 DEPENDS "${benchdir}/info.txt" bench_float bench_double "${benchdir}/unix_info.txt" 198 WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" 199) 200 201add_custom_target(bench_float_tar 202 COMMAND ${CMAKE_COMMAND} -E echo "" 203 COMMAND ${CMAKE_COMMAND} -E tar cvz "bench_${BENCH_ID}.tgz" ${benchdir} 204 COMMAND ${CMAKE_COMMAND} -E echo "" 205 COMMAND ${CMAKE_COMMAND} -E echo "now mail result file bench_${BENCH_ID}.tgz" 206 DEPENDS "${benchdir}/info.txt" bench_float "${benchdir}/unix_info.txt" 207 WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" 208) 209 210add_custom_target(bench_double_tar 211 COMMAND ${CMAKE_COMMAND} -E echo "" 212 COMMAND ${CMAKE_COMMAND} -E tar cvz "bench_${BENCH_ID}.tgz" ${benchdir} 213 COMMAND ${CMAKE_COMMAND} -E echo "" 214 COMMAND ${CMAKE_COMMAND} -E echo "now mail result file bench_${BENCH_ID}.tgz" 215 DEPENDS "${benchdir}/info.txt" bench_double "${benchdir}/unix_info.txt" 216 WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" 217) 218 219add_custom_target(clean_results 220 COMMAND ${CMAKE_COMMAND} -E remove_directory "${builddir_flt}" 221 COMMAND ${CMAKE_COMMAND} -E remove_directory "${builddir_dbl}" 222 WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" 223) 224 225