• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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