1cmake_minimum_required(VERSION 2.8) 2project(PRETTY_FAST_FFT) 3 4# smaller library size? 5option(PFFFT_USE_TYPE_FLOAT "activate single precision 'float'?" ON) 6option(PFFFT_USE_TYPE_DOUBLE "activate 'double' precision float?" ON) 7 8# architecture/optimization options 9option(PFFFT_USE_SIMD "use SIMD (SSE/AVX/NEON/ALTIVEC) CPU features? - " ON) 10option(PFFFT_USE_SCALAR_VECT "use 4-element vector scalar operations (if no other SIMD)" ON) 11 12# what to install? 13option(INSTALL_PFFFT "install pffft to CMAKE_INSTALL_PREFIX?" ON) 14option(INSTALL_PFDSP "install pfdsp to CMAKE_INSTALL_PREFIX?" OFF) 15option(INSTALL_PFFASTCONV "install pffastconv to CMAKE_INSTALL_PREFIX?" OFF) 16 17# test options 18option(PFFFT_USE_BENCH_FFTW "use (system-installed) FFTW3 in fft benchmark?" OFF) 19option(PFFFT_USE_BENCH_GREEN "use Green FFT in fft benchmark? - if exists in subdir" ON) 20option(PFFFT_USE_BENCH_KISS "use KissFFT in fft benchmark? - if exists in subdir" ON) 21option(PFFFT_USE_BENCH_POCKET "use PocketFFT in fft benchmark? - if exists in subdir" ON) 22option(PFFFT_USE_BENCH_MKL "use Intel MKL in fft benchmark? needs to be installed" OFF) 23option(PFFFT_USE_FFTPACK "compile and use FFTPACK in fft benchmark & validation?" ON) 24 25option(PFFFT_USE_DEBUG_ASAN "use GCC's address sanitizer?" OFF) 26 27option(PFFFT_DISABLE_LINK_WITH_M "Disables linking with m library to build with clangCL from MSVC" OFF) 28 29# C90 requires the gcc extensions for function attributes like always_inline 30# C99 provides the function attributes: no gcc extensions required 31set(CMAKE_C_STANDARD 99) 32set(CMAKE_C_EXTENSIONS OFF) 33 34set(CMAKE_CXX_STANDARD 98) 35set(CMAKE_CXX_STANDARD_REQUIRED ON) 36set(CMAKE_CXX_EXTENSIONS OFF) 37 38# populate what to install 39set(INSTALL_TARGETS "") 40set(INSTALL_HEADERS "") 41 42 43if ( (NOT PFFFT_USE_TYPE_FLOAT) AND (NOT PFFFT_USE_TYPE_DOUBLE) ) 44 message(FATAL_ERROR "activate at least one of PFFFT_USE_TYPE_FLOAT or PFFFT_USE_TYPE_DOUBLE") 45endif() 46 47list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/") 48include(cmake/target_optimizations.cmake) 49include(cmake/compiler_warnings.cmake) 50find_package(PAPI) 51find_package(MIPP) 52if (MIPP_FOUND) 53# if (TARGET MIPP) 54 message(STATUS "found MIPP") 55else() 56 message(STATUS "NOT found MIPP") 57endif() 58 59 60if (PFFFT_USE_DEBUG_ASAN) 61 set(ASANLIB "asan") 62else() 63 set(ASANLIB "") 64endif() 65 66message(STATUS "INFO: CMAKE_C_COMPILER_ID is ${CMAKE_C_COMPILER_ID}") 67message(STATUS "INFO: CMAKE_CXX_COMPILER_ID is ${CMAKE_CXX_COMPILER_ID}") 68if (WIN32) 69 message(STATUS "INFO: detected WIN32") 70else() 71 message(STATUS "INFO: NOT WIN32") 72endif() 73if (MINGW) 74 message(STATUS "INFO: detected MINGW with compiler ${CMAKE_C_COMPILER_ID}") 75else() 76 message(STATUS "INFO: NOT MINGW") 77endif() 78if ( CMAKE_C_COMPILER_ID MATCHES "MSVC" ) 79 message(STATUS "INFO: detected MSVC with compiler ${CMAKE_C_COMPILER_ID}") 80endif() 81 82 83if (PFFFT_USE_BENCH_GREEN) 84 if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/greenffts/CMakeLists.txt") 85 message(STATUS "found subdir greenffts") 86 set(PATH_GREEN "${CMAKE_CURRENT_LIST_DIR}/greenffts") 87 add_subdirectory( "${PATH_GREEN}" ) 88 else() 89 message(WARNING "GreenFFT not found in subdir greenffts") 90 endif() 91endif() 92 93if (PFFFT_USE_BENCH_KISS) 94 # git submodule add https://github.com/hayguen/kissfft.git 95 if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/kissfft/CMakeLists.txt") 96 message(STATUS "found subdir kissfft") 97 set(PATH_KISS "${CMAKE_CURRENT_LIST_DIR}/kissfft") 98 add_subdirectory( "${PATH_KISS}" ) 99 else() 100 message(WARNING "KissFFT not found in subdir kissfft") 101 endif() 102endif() 103 104if (PFFFT_USE_BENCH_POCKET) 105 # git submodule add https://github.com/hayguen/pocketfft.git 106 if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/pocketfft/pocketfft_double.c") 107 message(STATUS "found subdir pocketfft") 108 set(PATH_POCKET "${CMAKE_CURRENT_LIST_DIR}/pocketfft") 109 add_subdirectory( "${PATH_POCKET}" ) 110 else() 111 message(WARNING "PocketFFT not found in subdir pocketfft") 112 endif() 113endif() 114 115 116######################################################################## 117# select the release build type by default to get optimization flags 118######################################################################## 119if(NOT CMAKE_BUILD_TYPE) 120 set(CMAKE_BUILD_TYPE "Release") 121 message(STATUS "Build type not specified: defaulting to release.") 122endif(NOT CMAKE_BUILD_TYPE) 123 124if ( CMAKE_C_COMPILER_ID MATCHES "MSVC" ) 125 # using Visual Studio C++ 126 message(STATUS "INFO: detected MSVC: will not link math lib m") 127 set(MATHLIB "") 128 129 add_definitions("/D_CRT_SECURE_NO_WARNINGS") 130 131 set(MSVC_DISABLED_WARNINGS_LIST 132 "C4996" 133 ) 134 135else() 136 if(PFFFT_DISABLE_LINK_WITH_M) 137 else() 138 message(STATUS "INFO: detected NO MSVC: ${CMAKE_C_COMPILER_ID}: will link math lib m") 139 set(MATHLIB "m") 140 endif() 141endif() 142 143set(STDCXXLIB "") 144if (MINGW) 145 set(STDCXXLIB "stdc++") 146endif() 147 148 149set( SIMD_FLOAT_HDRS simd/pf_float.h simd/pf_sse1_float.h simd/pf_altivec_float.h simd/pf_neon_float.h simd/pf_scalar_float.h ) 150set( SIMD_DOUBLE_HDRS simd/pf_double.h simd/pf_avx_double.h simd/pf_scalar_double.h ) 151 152if (PFFFT_USE_TYPE_FLOAT) 153 set( FLOAT_SOURCES pffft.c pffft.h ${SIMD_FLOAT_HDRS} ) 154 if (INSTALL_PFFFT) 155 set(INSTALL_HEADERS ${INSTALL_HEADERS} pffft.h) 156 endif() 157else() 158 set( FLOAT_SOURCES ) 159endif() 160 161 162if (PFFFT_USE_TYPE_DOUBLE) 163 set( DOUBLE_SOURCES pffft_double.c pffft_double.h ${SIMD_DOUBLE_HDRS} ) 164 if (INSTALL_PFFFT) 165 set(INSTALL_HEADERS ${INSTALL_HEADERS} pffft_double.h) 166 endif() 167else() 168 set( DOUBLE_SOURCES ) 169endif() 170 171###################################################### 172 173add_library(PFFFT STATIC ${FLOAT_SOURCES} ${DOUBLE_SOURCES} pffft_common.c pffft_priv_impl.h pffft.hpp ) 174set_target_properties(PFFFT PROPERTIES OUTPUT_NAME "pffft") 175target_compile_definitions(PFFFT PRIVATE _USE_MATH_DEFINES) 176target_activate_c_compiler_warnings(PFFFT) 177if (PFFFT_USE_SCALAR_VECT) 178 target_compile_definitions(PFFFT PRIVATE PFFFT_SCALVEC_ENABLED=1) 179endif() 180if (PFFFT_USE_DEBUG_ASAN) 181 target_compile_options(PFFFT PRIVATE "-fsanitize=address") 182endif() 183target_set_c_arch_flags(PFFFT) 184if (NOT PFFFT_USE_SIMD) 185 target_compile_definitions(PFFFT PRIVATE PFFFT_SIMD_DISABLE=1) 186endif() 187target_link_libraries( PFFFT ${ASANLIB} ${MATHLIB} ) 188set_property(TARGET PFFFT APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES 189 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> 190) 191if (INSTALL_PFFFT) 192 set(INSTALL_TARGETS ${INSTALL_TARGETS} PFFFT) 193 set(INSTALL_HEADERS ${INSTALL_HEADERS} pffft.hpp) 194endif() 195 196###################################################### 197 198if (PFFFT_USE_TYPE_FLOAT) 199 add_library(PFDSP STATIC pf_mixer.cpp pf_mixer.h pf_cplx.h pf_carrier.cpp pf_carrier.h pf_cic.cpp pf_cic.h fmv.h ) 200 set_property(TARGET PFDSP PROPERTY CXX_STANDARD 11) 201 set_property(TARGET PFDSP PROPERTY CXX_STANDARD_REQUIRED ON) 202 set_target_properties(PFDSP PROPERTIES OUTPUT_NAME "pfdsp") 203 target_compile_definitions(PFDSP PRIVATE _USE_MATH_DEFINES) 204 target_activate_cxx_compiler_warnings(PFDSP) 205 if (PFFFT_USE_DEBUG_ASAN) 206 target_compile_options(PFDSP PRIVATE "-fsanitize=address") 207 endif() 208 if (PFFFT_USE_SIMD) 209 target_set_cxx_arch_flags(PFDSP) 210 else() 211 target_compile_definitions(PFDSP PRIVATE PFFFT_SIMD_DISABLE=1) 212 endif() 213 target_link_libraries( PFDSP ${MATHLIB} ) 214 set_property(TARGET PFDSP APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES 215 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> 216 ) 217 if (INSTALL_PFDSP) 218 set(INSTALL_TARGETS ${INSTALL_TARGETS} PFDSP) 219 set(INSTALL_HEADERS ${INSTALL_HEADERS} pf_mixer.h pf_cplx.h pf_carrier.h pf_cic.h) 220 endif() 221endif() 222 223###################################################### 224 225if (PFFFT_USE_FFTPACK) 226 227 # float / single precision 228 add_library(FFTPACK_FLOAT STATIC fftpack.c fftpack.h) 229 target_compile_definitions(FFTPACK_FLOAT PRIVATE _USE_MATH_DEFINES) 230 target_activate_c_compiler_warnings(FFTPACK_FLOAT) 231 target_link_libraries( FFTPACK_FLOAT ${MATHLIB} ) 232 set_property(TARGET FFTPACK_FLOAT APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES 233 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> 234 ) 235 236 # double precision 237 add_library(FFTPACK_DOUBLE STATIC fftpack.c fftpack.h) 238 target_compile_definitions(FFTPACK_DOUBLE PRIVATE _USE_MATH_DEFINES) 239 target_compile_definitions(FFTPACK_DOUBLE PUBLIC FFTPACK_DOUBLE_PRECISION) 240 target_activate_c_compiler_warnings(FFTPACK_DOUBLE) 241 target_link_libraries( FFTPACK_DOUBLE ${MATHLIB} ) 242 set_property(TARGET FFTPACK_DOUBLE APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES 243 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> 244 ) 245 246 # builtin test program of fftpack 247 add_executable(test_fftpack_float fftpack.c fftpack.h) 248 target_compile_definitions(test_fftpack_float PRIVATE _USE_MATH_DEFINES TESTING_FFTPACK) 249 target_link_libraries(test_fftpack_float ${MATHLIB}) 250 251 add_executable(test_fftpack_double fftpack.c fftpack.h) 252 target_compile_definitions(test_fftpack_double PRIVATE _USE_MATH_DEFINES FFTPACK_DOUBLE_PRECISION TESTING_FFTPACK) 253 target_link_libraries(test_fftpack_double ${MATHLIB}) 254 255endif() 256 257###################################################### 258 259if (PFFFT_USE_TYPE_FLOAT) 260 # only 'float' supported in PFFASTCONV 261 add_library(PFFASTCONV STATIC pffastconv.c pffastconv.h pffft.h ) 262 set_target_properties(PFFASTCONV PROPERTIES OUTPUT_NAME "pffastconv") 263 target_compile_definitions(PFFASTCONV PRIVATE _USE_MATH_DEFINES) 264 target_activate_c_compiler_warnings(PFFASTCONV) 265 if (PFFFT_USE_DEBUG_ASAN) 266 target_compile_options(PFFASTCONV PRIVATE "-fsanitize=address") 267 endif() 268 target_link_libraries( PFFASTCONV PFFFT ${ASANLIB} ${MATHLIB} ) 269 set_property(TARGET PFFASTCONV APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES 270 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> 271 ) 272 if (INSTALL_PFFASTCONV) 273 set(INSTALL_TARGETS ${INSTALL_TARGETS} PFFASTCONV) 274 set(INSTALL_HEADERS ${INSTALL_HEADERS} pffastconv.h) 275 endif() 276endif() 277 278 279###################################################### 280 281install( TARGETS ${INSTALL_TARGETS} DESTINATION lib) 282install( FILES ${INSTALL_HEADERS} DESTINATION include) 283 284add_custom_target(uninstall 285 "${CMAKE_COMMAND}" -P "${CMAKE_SOURCE_DIR}/uninstall.cmake" 286) 287 288####################################################### 289 290if (PFFFT_USE_TYPE_FLOAT) 291 add_executable( test_pffft_float test_pffft.c ) 292 target_compile_definitions(test_pffft_float PRIVATE _USE_MATH_DEFINES) 293 target_compile_definitions(test_pffft_float PRIVATE PFFFT_ENABLE_FLOAT) 294 target_link_libraries( test_pffft_float PFFFT ${ASANLIB} ) 295endif() 296 297###################################################### 298 299if (PFFFT_USE_TYPE_DOUBLE) 300 add_executable( test_pffft_double test_pffft.c ) 301 target_compile_definitions(test_pffft_double PRIVATE _USE_MATH_DEFINES) 302 target_compile_definitions(test_pffft_double PRIVATE PFFFT_ENABLE_DOUBLE) 303 target_link_libraries( test_pffft_double PFFFT ${ASANLIB} ) 304endif() 305 306###################################################### 307 308add_executable( test_fft_factors test_fft_factors.c ) 309if (PFFFT_USE_TYPE_FLOAT) 310 target_compile_definitions(test_fft_factors PRIVATE PFFFT_ENABLE_FLOAT) 311endif() 312if (PFFFT_USE_TYPE_DOUBLE) 313 target_compile_definitions(test_fft_factors PRIVATE PFFFT_ENABLE_DOUBLE) 314endif() 315target_link_libraries(test_fft_factors PFFFT ${ASANLIB} ${MATHLIB}) 316 317###################################################### 318 319add_executable( test_pffft_cpp test_pffft.cpp ) 320target_compile_definitions(test_pffft_cpp PRIVATE _USE_MATH_DEFINES) 321if (PFFFT_USE_TYPE_FLOAT) 322 target_compile_definitions(test_pffft_cpp PRIVATE PFFFT_ENABLE_FLOAT) 323endif() 324if (PFFFT_USE_TYPE_DOUBLE) 325 target_compile_definitions(test_pffft_cpp PRIVATE PFFFT_ENABLE_DOUBLE) 326endif() 327target_link_libraries( test_pffft_cpp PFFFT ${STDCXXLIB} ${ASANLIB} ) 328 329###################################################### 330 331add_executable( test_pffft_cpp_11 test_pffft.cpp ) 332target_compile_definitions(test_pffft_cpp_11 PRIVATE _USE_MATH_DEFINES) 333if (PFFFT_USE_TYPE_FLOAT) 334 target_compile_definitions(test_pffft_cpp_11 PRIVATE PFFFT_ENABLE_FLOAT) 335endif() 336if (PFFFT_USE_TYPE_DOUBLE) 337 target_compile_definitions(test_pffft_cpp_11 PRIVATE PFFFT_ENABLE_DOUBLE) 338endif() 339target_link_libraries( test_pffft_cpp_11 PFFFT ${STDCXXLIB} ${ASANLIB} ) 340 341set_property(TARGET test_pffft_cpp_11 PROPERTY CXX_STANDARD 11) 342set_property(TARGET test_pffft_cpp_11 PROPERTY CXX_STANDARD_REQUIRED ON) 343 344###################################################### 345 346if (PFFFT_USE_TYPE_FLOAT) 347 add_executable(test_pffastconv test_pffastconv.c 348 ${SIMD_FLOAT_HDRS} ${SIMD_DOUBLE_HDRS} 349 ) 350 target_compile_definitions(test_pffastconv PRIVATE _USE_MATH_DEFINES) 351 if (PFFFT_USE_DEBUG_ASAN) 352 target_compile_options(test_pffastconv PRIVATE "-fsanitize=address") 353 endif() 354 target_set_c_arch_flags(test_pffastconv) 355 if (NOT PFFFT_USE_SIMD) 356 target_compile_definitions(test_pffastconv PRIVATE PFFFT_SIMD_DISABLE=1) 357 endif() 358 target_link_libraries( test_pffastconv PFFASTCONV ${ASANLIB} ${MATHLIB} ) 359 360endif() 361 362###################################################### 363 364if (PFFFT_USE_TYPE_FLOAT) 365 add_executable(bench_pffft_float bench_pffft.c pffft.h) 366 target_compile_definitions(bench_pffft_float PRIVATE _USE_MATH_DEFINES) 367 target_compile_definitions(bench_pffft_float PRIVATE PFFFT_ENABLE_FLOAT) 368 if (PFFFT_USE_DEBUG_ASAN) 369 target_compile_options(bench_pffft_float PRIVATE "-fsanitize=address") 370 endif() 371 372 target_link_libraries( bench_pffft_float PFFFT ${ASANLIB} ) 373 374 if (PFFFT_USE_FFTPACK) 375 target_compile_definitions(bench_pffft_float PRIVATE HAVE_FFTPACK=1) 376 target_link_libraries(bench_pffft_float FFTPACK_FLOAT) 377 endif() 378 379 if (PFFFT_USE_BENCH_FFTW) 380 target_compile_definitions(bench_pffft_float PRIVATE HAVE_FFTW=1) 381 target_link_libraries(bench_pffft_float fftw3f) 382 endif() 383 384 if (PATH_GREEN AND PFFFT_USE_BENCH_GREEN) 385 target_compile_definitions(bench_pffft_float PRIVATE HAVE_GREEN_FFTS=1) 386 target_link_libraries(bench_pffft_float GreenFFT) 387 endif() 388 389 if (PATH_KISS AND PFFFT_USE_BENCH_KISS) 390 target_compile_definitions(bench_pffft_float PRIVATE HAVE_KISS_FFT=1) 391 target_link_libraries(bench_pffft_float KissFFT) 392 endif() 393 394 if (PATH_POCKET AND PFFFT_USE_BENCH_POCKET) 395 target_compile_definitions(bench_pffft_float PRIVATE HAVE_POCKET_FFT=1) 396 target_link_libraries(bench_pffft_float PocketFFT) 397 endif() 398 399 if (PFFFT_USE_BENCH_MKL) 400 if ( (CMAKE_SYSTEM_PROCESSOR STREQUAL "i686") OR (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") ) 401 # has chances to work 402 else() 403 # other PROCESSORs could be "ppc", "ppc64", "arm", "aarch64", "armv7l" - or something else?! 404 message(WARNING "using Intel MKL on '${CMAKE_SYSTEM_PROCESSOR}' might fail.") 405 endif() 406 message(STATUS "In case compiling/linking with Intel MKL fails, check CMakeLists.txt or deactivate PFFFT_USE_BENCH_MKL") 407 target_compile_definitions(bench_pffft_float PRIVATE HAVE_MKL=1) 408 target_link_libraries(bench_pffft_float mkl_intel_lp64 mkl_sequential -lmkl_core) 409 endif() 410endif() 411 412if (PFFFT_USE_TYPE_DOUBLE) 413 add_executable(bench_pffft_double bench_pffft.c pffft.h) 414 target_compile_definitions(bench_pffft_double PRIVATE _USE_MATH_DEFINES) 415 target_compile_definitions(bench_pffft_double PRIVATE PFFFT_ENABLE_DOUBLE) 416 if (PFFFT_USE_DEBUG_ASAN) 417 target_compile_options(bench_pffft_double PRIVATE "-fsanitize=address") 418 endif() 419 target_link_libraries( bench_pffft_double PFFFT ${ASANLIB} ) 420 421 if (PFFFT_USE_FFTPACK) 422 target_compile_definitions(bench_pffft_double PRIVATE HAVE_FFTPACK=1) 423 target_link_libraries(bench_pffft_double FFTPACK_DOUBLE) 424 endif() 425 426 if (PFFFT_USE_BENCH_FFTW) 427 target_compile_definitions(bench_pffft_double PRIVATE HAVE_FFTW=1) 428 target_link_libraries(bench_pffft_double fftw3) 429 endif() 430 431 if (PATH_POCKET AND PFFFT_USE_BENCH_POCKET) 432 target_compile_definitions(bench_pffft_double PRIVATE HAVE_POCKET_FFT=1) 433 target_link_libraries(bench_pffft_double PocketFFT) 434 endif() 435 436 if (PFFFT_USE_BENCH_MKL) 437 if ( (CMAKE_SYSTEM_PROCESSOR STREQUAL "i686") OR (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") ) 438 # has chances to work 439 else() 440 # other PROCESSORs could be "ppc", "ppc64", "arm", "aarch64", "armv7l" - or something else?! 441 message(WARNING "using Intel MKL on '${CMAKE_SYSTEM_PROCESSOR}' might fail.") 442 endif() 443 message(STATUS "In case compiling/linking with Intel MKL fails, check CMakeLists.txt or deactivate PFFFT_USE_BENCH_MKL") 444 target_compile_definitions(bench_pffft_double PRIVATE HAVE_MKL=1) 445 target_link_libraries(bench_pffft_double mkl_intel_lp64 mkl_sequential -lmkl_core) 446 endif() 447endif() 448 449###################################################### 450 451if (PFFFT_USE_TYPE_FLOAT) 452 453 add_executable(bench_pf_mixer_float bench_mixers.cpp papi_perf_counter.h) 454 target_compile_definitions(bench_pf_mixer_float PRIVATE _USE_MATH_DEFINES) 455 target_compile_definitions(bench_pf_mixer_float PRIVATE PFFFT_ENABLE_FLOAT) 456 target_link_libraries( bench_pf_mixer_float ${ASANLIB} ) 457 if (PFFFT_USE_DEBUG_ASAN) 458 target_compile_options(bench_pf_mixer_float PRIVATE "-fsanitize=address") 459 endif() 460 if (PAPI_FOUND) 461 target_compile_definitions(bench_pf_mixer_float PRIVATE HAVE_PAPI=1) 462 target_link_libraries(bench_pf_mixer_float ${PAPI_LIBRARIES}) 463 endif() 464 target_link_libraries( bench_pf_mixer_float PFDSP $<$<CXX_COMPILER_ID:GNU>:stdc++> ) 465 466 467 ############################################################################ 468 469 add_library(pf_conv_arch_none pf_conv.cpp pf_conv.h pf_cplx.h) 470 target_compile_definitions(pf_conv_arch_none PRIVATE CONV_ARCH_POST=none MIPP_NO_INTRINSICS=1) 471 set_property(TARGET pf_conv_arch_none PROPERTY CXX_STANDARD 11) 472 set_property(TARGET pf_conv_arch_none PROPERTY CXX_STANDARD_REQUIRED ON) 473 target_activate_cxx_compiler_warnings(pf_conv_arch_none) 474 add_library(pf_conv_dispatcher pf_conv_dispatcher.cpp pf_conv_dispatcher.h pf_conv.h pf_cplx.h) 475 set_property(TARGET pf_conv_dispatcher PROPERTY CXX_STANDARD 11) 476 set_property(TARGET pf_conv_dispatcher PROPERTY CXX_STANDARD_REQUIRED ON) 477 target_activate_cxx_compiler_warnings(pf_conv_dispatcher) 478 479 add_library(pf_conv_arch_dflt pf_conv.cpp pf_conv.h pf_cplx.h) 480 target_compile_definitions(pf_conv_arch_dflt PRIVATE CONV_ARCH_POST=dflt) 481 set_property(TARGET pf_conv_arch_dflt PROPERTY CXX_STANDARD 11) 482 set_property(TARGET pf_conv_arch_dflt PROPERTY CXX_STANDARD_REQUIRED ON) 483 target_activate_cxx_compiler_warnings(pf_conv_arch_dflt) 484 target_set_cxx_arch_flags(pf_conv_arch_dflt) 485 486 target_link_libraries(pf_conv_dispatcher pf_conv_arch_none pf_conv_arch_dflt) 487 488 if ((CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") OR (CMAKE_SYSTEM_PROCESSOR MATCHES "AMD64")) 489 490 if ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") 491 set(PF_CONV_ARCHES "sse3;sse4;avx;avx2") 492 set(PF_CONV_OPT_sse3 "core2") # emulate a map 493 set(PF_CONV_OPT_sse4 "nehalem") 494 set(PF_CONV_OPT_avx "sandybridge") 495 set(PF_CONV_OPT_avx2 "haswell") 496 target_compile_definitions(pf_conv_dispatcher PRIVATE CONV_ARCH_GCC_AMD64) 497 elseif (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") 498 set(PF_CONV_ARCHES "sse2;avx;avx2") 499 set(PF_CONV_OPT_sse2 "SSE2") # emulate a map 500 set(PF_CONV_OPT_avx "AVX") 501 set(PF_CONV_OPT_avx2 "AVX2") 502 target_compile_definitions(pf_conv_dispatcher PRIVATE CONV_ARCH_MSVC_AMD64) 503 else() 504 set(PF_CONV_ARCHES "") 505 message(WARNING "unknown compiler ${CMAKE_CXX_COMPILER_ID} on CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}: can't do architecture specific compilation") 506 endif() 507 508 elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") 509 510 if ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") 511 set(PF_CONV_ARCHES "armv8a") 512 set(PF_CONV_OPT_armv8a "armv8-a") # emulate a map for arch 513 514 target_compile_definitions(pf_conv_dispatcher PRIVATE CONV_ARCH_GCC_AARCH64) 515 else() 516 set(PF_CONV_ARCHES "") 517 message(WARNING "unknown compiler ${CMAKE_CXX_COMPILER_ID} on CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}: can't do architecture specific compilation") 518 endif() 519 520 elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "armv7l") 521 522 if ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") 523 set(PF_CONV_ARCHES "neon_vfpv4;neon_rpi3_a53;neon_rpi4_a72") 524 set(PF_CONV_OPT_neon_vfpv4 "armv7-a") # emulate a map for arch 525 set(PF_CONV_EXTRA_neon_vfpv4 "neon_vfpv4") # emulate a map for additional options (EXTRA) 526 set(PF_CONV_OPT_neon_rpi3_a53 "armv7-a") 527 set(PF_CONV_EXTRA_neon_rpi3_a53 "neon_rpi3_a53") 528 set(PF_CONV_OPT_neon_rpi4_a72 "armv7-a") 529 set(PF_CONV_EXTRA_neon_rpi4_a72 "neon_rpi4_a72") 530 531 target_compile_definitions(pf_conv_dispatcher PRIVATE CONV_ARCH_GCC_ARM32NEON) 532 else() 533 set(PF_CONV_ARCHES "") 534 message(WARNING "unknown compiler ${CMAKE_CXX_COMPILER_ID} on CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}: can't do architecture specific compilation") 535 endif() 536 537 else() 538 message(WARNING "this is unforseen CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}: can't do architecture specific compilation") 539 endif() 540 541 foreach (arch_opt ${PF_CONV_ARCHES}) 542 add_library(pf_conv_arch_${arch_opt} pf_conv.cpp pf_conv.h pf_cplx.h) 543 set_property(TARGET pf_conv_arch_${arch_opt} PROPERTY CXX_STANDARD 11) 544 set_property(TARGET pf_conv_arch_${arch_opt} PROPERTY CXX_STANDARD_REQUIRED ON) 545 target_activate_cxx_compiler_warnings(pf_conv_arch_${arch_opt}) 546 target_compile_definitions(pf_conv_arch_${arch_opt} PRIVATE CONV_ARCH_POST=${arch_opt}) 547 548 target_set_cxx_arch_option(pf_conv_arch_${arch_opt} "${PF_CONV_OPT_${arch_opt}}" "${PF_CONV_EXTRA_${arch_opt}}" "${PF_CONV_OPT_${arch_opt}}") 549 target_link_libraries(pf_conv_dispatcher pf_conv_arch_${arch_opt}) 550 message(STATUS "added library pf_conv_arch_${arch_opt} with CONV_ARCH_POST=${arch_opt}") 551 endforeach() 552 553 if (PFFFT_USE_DEBUG_ASAN) 554 foreach (arch_opt ${PF_CONV_ARCHES}) 555 target_compile_options(pf_conv_arch_${arch_opt} PRIVATE "-fsanitize=address") 556 target_link_libraries( pf_conv_arch_${arch_opt} ${ASANLIB}) 557 endforeach() 558 559 target_compile_options(pf_conv_arch_none PRIVATE "-fsanitize=address") 560 target_link_libraries( pf_conv_arch_none ${ASANLIB}) 561 562 target_compile_options(pf_conv_dispatcher PRIVATE "-fsanitize=address") 563 target_link_libraries(pf_conv_dispatcher ${ASANLIB}) 564 endif() 565 566 if(MIPP_FOUND) 567 foreach (arch_opt ${PF_CONV_ARCHES}) 568 message(STATUS "link pf_conv_arch_${arch_opt} against MIPP") 569 target_link_libraries(pf_conv_arch_${arch_opt} MIPP) 570 endforeach() 571 572 message(STATUS "link pf_conv_arch_none against MIPP") 573 target_link_libraries(pf_conv_arch_none MIPP) 574 endif() 575 576 ############################################################################ 577 578 add_executable(bench_pf_conv_float bench_conv.cpp papi_perf_counter.h) 579 set_property(TARGET bench_pf_conv_float PROPERTY CXX_STANDARD 11) 580 set_property(TARGET bench_pf_conv_float PROPERTY CXX_STANDARD_REQUIRED ON) 581 target_compile_definitions(bench_pf_conv_float PRIVATE _USE_MATH_DEFINES) 582 target_compile_definitions(bench_pf_conv_float PRIVATE PFFFT_ENABLE_FLOAT) 583 if (PFFFT_USE_DEBUG_ASAN) 584 target_compile_options(bench_pf_conv_float PRIVATE "-fsanitize=address") 585 endif() 586 target_link_libraries( bench_pf_conv_float ${ASANLIB} ) 587 if (PAPI_FOUND) 588 target_compile_definitions(bench_pf_conv_float PRIVATE HAVE_PAPI=1) 589 target_link_libraries(bench_pf_conv_float ${PAPI_LIBRARIES}) 590 endif() 591 if(MIPP_FOUND) 592 target_link_libraries(bench_pf_conv_float MIPP) 593 endif() 594 target_link_libraries( bench_pf_conv_float pf_conv_dispatcher PFDSP $<$<CXX_COMPILER_ID:GNU>:stdc++> ) 595 596endif() 597 598###################################################### 599 600add_subdirectory(examples) 601 602###################################################### 603 604enable_testing() 605 606 607add_test(NAME test_fft_factors 608 COMMAND "${CMAKE_CURRENT_BINARY_DIR}/test_fft_factors" 609 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} 610) 611 612if (PFFFT_USE_FFTPACK) 613 add_test(NAME test_fftpack_float 614 COMMAND "${CMAKE_CURRENT_BINARY_DIR}/test_fftpack_float" 615 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} 616 ) 617 618 add_test(NAME test_fftpack_double 619 COMMAND "${CMAKE_CURRENT_BINARY_DIR}/test_fftpack_double" 620 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} 621 ) 622endif() 623 624 625if (PFFFT_USE_TYPE_FLOAT) 626 627 add_test(NAME bench_pffft_pow2 628 COMMAND "${CMAKE_CURRENT_BINARY_DIR}/bench_pffft_float" "--max-len" "128" "--quick" 629 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} 630 ) 631 632 add_test(NAME bench_pffft_non2 633 COMMAND "${CMAKE_CURRENT_BINARY_DIR}/bench_pffft_float" "--non-pow2" "--max-len" "192" "--quick" 634 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} 635 ) 636 637 # add_test(NAME bench_plots 638 # COMMAND bash "-c" "${CMAKE_CURRENT_SOURCE_DIR}/plots.sh" 639 # WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} 640 # ) 641 642 add_test(NAME test_pfconv_lens_symetric 643 COMMAND "${CMAKE_CURRENT_BINARY_DIR}/test_pffastconv" "--no-bench" "--quick" "--sym" 644 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} 645 ) 646 647 add_test(NAME test_pfconv_lens_non_sym 648 COMMAND "${CMAKE_CURRENT_BINARY_DIR}/test_pffastconv" "--no-bench" "--quick" 649 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} 650 ) 651 652 add_test(NAME bench_pfconv_symetric 653 COMMAND "${CMAKE_CURRENT_BINARY_DIR}/test_pffastconv" "--no-len" "--quick" "--sym" 654 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} 655 ) 656 657 add_test(NAME bench_pfconv_non_sym 658 COMMAND "${CMAKE_CURRENT_BINARY_DIR}/test_pffastconv" "--no-len" "--quick" 659 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} 660 ) 661 662endif() 663 664