diff options
author | hayati ayguen <h_ayguen@web.de> | 2021-04-19 19:29:46 +0200 |
---|---|---|
committer | Márton Danóczy <marton78@gmail.com> | 2022-04-04 13:32:31 +0200 |
commit | e9e028b88dbc188597a766ebc1a5bdb38467c560 (patch) | |
tree | 06cd49af95eb1d25a11b35b64ca8b9e1fbc6bd25 | |
parent | 81a79bb7dfec57668752cd5600da35c5da6c76c5 (diff) | |
download | pffft-upstream-master.tar.gz |
add cross build scripts and github build actionsupstream-master
* build on Ubuntu Linux
* cross build for Windows on Ubuntu Linux
* build on Windows with MSVC (Visual Studio)
* build on Windows with MINGW (gcc)
see https://ariya.io/2020/07/on-github-actions-with-msys2
* build on MacOS (x64_64)
* create artifacts for all build machines
* allow finding MIPP headers below in $ENV{HOME}/.local
Signed-off-by: hayati ayguen <h_ayguen@web.de>
-rw-r--r-- | .github/workflows/c-cpp.yml | 279 | ||||
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | CMakeLists.txt | 121 | ||||
-rw-r--r-- | bench_conv.cpp | 2 | ||||
-rw-r--r-- | cmake/FindMIPP.cmake | 13 | ||||
-rw-r--r-- | cmake/target_optimizations.cmake | 1 | ||||
-rwxr-xr-x | cross_build_mingw32.sh | 25 | ||||
-rwxr-xr-x | cross_build_mingw64.sh | 25 | ||||
-rw-r--r-- | mingw-w32-i686.cmake | 25 | ||||
-rw-r--r-- | mingw-w64-x64_64.cmake | 25 | ||||
-rw-r--r-- | pf_cic.cpp | 5 | ||||
-rw-r--r-- | pf_conv.cpp | 8 | ||||
-rw-r--r-- | pf_conv.h | 4 | ||||
-rw-r--r-- | pf_conv_dispatcher.cpp | 8 | ||||
-rw-r--r-- | pffft.hpp | 2 |
15 files changed, 477 insertions, 67 deletions
diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml new file mode 100644 index 0000000..9a5430c --- /dev/null +++ b/.github/workflows/c-cpp.yml @@ -0,0 +1,279 @@ +name: C/C++ CI + +on: + push: + branches: + - master + - github_actions + pull_request: + branches: + - master + - github_actions + +env: + # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) + BUILD_TYPE: Release + +jobs: + build_w_mipp_ubuntu-amd64: + runs-on: ubuntu-latest + + steps: + - name: check out MIPP + uses: actions/checkout@master + with: + repository: hayguen/MIPP + path: ./MIPP + - name: cmake configure MIPP + run: cmake -S MIPP -B MIPP_build -DCMAKE_INSTALL_PREFIX=$HOME/.local + - name: cmake install MIPP headers + run: cmake --build MIPP_build --target install && ls -alh $HOME/.local/ && ls -alh $HOME/.local/include/ + + - uses: actions/checkout@v2 + - name: cmake_make_simd_float_double + run: mkdir build_simd_full && cmake -S . -B build_simd_full -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DTARGET_CXX_ARCH=native -DTARGET_C_ARCH=native && cmake --build build_simd_full + - name: cmake_make_simd_float + run: mkdir build_simd_float && cmake -S . -B build_simd_float -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_TYPE_DOUBLE=OFF -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DTARGET_CXX_ARCH=native -DTARGET_C_ARCH=native && cmake --build build_simd_float + - name: cmake_make_simd_double + run: mkdir build_simd_double && cmake -S . -B build_simd_double -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_TYPE_FLOAT=OFF -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DTARGET_CXX_ARCH=native -DTARGET_C_ARCH=native && cmake --build build_simd_double + - name: cmake_make_no-simd_float_double + run: mkdir build_no-simd_full && cmake -S . -B build_no-simd_full -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_SIMD=OFF -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DTARGET_CXX_ARCH=native -DTARGET_C_ARCH=native && cmake --build build_no-simd_full + - name: cmake_make_no-simd_scalar_float_double + run: mkdir build_no-simd_scalar_full && cmake -S . -B build_no-simd_scalar_full -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_SIMD=OFF -DUSE_SCALAR_VECT=ON -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DTARGET_CXX_ARCH=native -DTARGET_C_ARCH=native && cmake --build build_no-simd_scalar_full + - name: compress + run: tar zcvf pffft_w_mipp_ubuntu-amd64.tar.gz --exclude=CMakeFiles --exclude=*.cmake --exclude=Makefile --exclude=CMakeCache.txt build_simd_full build_simd_float build_simd_double build_no-simd_full build_no-simd_scalar_full + - name: 'Upload Artifact' + uses: actions/upload-artifact@v2 + with: + name: pffft_ubuntu_builds + path: pffft_w_mipp_ubuntu-amd64.tar.gz + + build_ubuntu-amd64: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: cmake_make_simd_float_double + run: mkdir build_simd_full && cmake -S . -B build_simd_full -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DTARGET_CXX_ARCH=native -DTARGET_C_ARCH=native && cmake --build build_simd_full + - name: cmake_make_simd_float + run: mkdir build_simd_float && cmake -S . -B build_simd_float -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_TYPE_DOUBLE=OFF -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DTARGET_CXX_ARCH=native -DTARGET_C_ARCH=native && cmake --build build_simd_float + - name: cmake_make_simd_double + run: mkdir build_simd_double && cmake -S . -B build_simd_double -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_TYPE_FLOAT=OFF -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DTARGET_CXX_ARCH=native -DTARGET_C_ARCH=native && cmake --build build_simd_double + - name: cmake_make_no-simd_float_double + run: mkdir build_no-simd_full && cmake -S . -B build_no-simd_full -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_SIMD=OFF -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DTARGET_CXX_ARCH=native -DTARGET_C_ARCH=native && cmake --build build_no-simd_full + - name: cmake_make_no-simd_scalar_float_double + run: mkdir build_no-simd_scalar_full && cmake -S . -B build_no-simd_scalar_full -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_SIMD=OFF -DUSE_SCALAR_VECT=ON -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DTARGET_CXX_ARCH=native -DTARGET_C_ARCH=native && cmake --build build_no-simd_scalar_full + - name: compress + run: tar zcvf pffft_ubuntu-amd64.tar.gz --exclude=CMakeFiles --exclude=*.cmake --exclude=Makefile --exclude=CMakeCache.txt build_simd_full build_simd_float build_simd_double build_no-simd_full build_no-simd_scalar_full + - name: 'Upload Artifact' + uses: actions/upload-artifact@v2 + with: + name: pffft_ubuntu_builds + path: pffft_ubuntu-amd64.tar.gz + + cross_build_win_from_linux: + runs-on: ubuntu-20.04 + + steps: + - name: prerequisites + run: sudo apt -qq update && sudo apt -yqq install gcc-mingw-w64 g++-mingw-w64 + + - name: check out MIPP + uses: actions/checkout@master + with: + repository: hayguen/MIPP + path: ./MIPP + - name: cmake configure MIPP + working-directory: ${{runner.workspace}} + run: cmake -S pffft/MIPP -B MIPP_build -DCMAKE_INSTALL_PREFIX=$(pwd) + - name: cmake install MIPP headers + working-directory: ${{runner.workspace}} + run: cmake --build MIPP_build --target install + + - uses: actions/checkout@v2 + - name: build_w32_no-simd + working-directory: ${{runner.workspace}} + run: cd $GITHUB_WORKSPACE && bash ./cross_build_mingw32.sh no-simd -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_SIMD=OFF -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF + - name: build_w32_simd_full + working-directory: ${{runner.workspace}} + run: X=$(pwd) && cd $GITHUB_WORKSPACE && bash ./cross_build_mingw32.sh simd_full -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DTARGET_CXX_ARCH=pentium4 -DTARGET_C_ARCH=pentium4 -DMIPP_INCLUDE_DIRS=$X/include/mipp + + - name: build_w64_no-simd + working-directory: ${{runner.workspace}} + run: cd $GITHUB_WORKSPACE && bash ./cross_build_mingw64.sh no-simd -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_SIMD=OFF -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF + - name: build_w64_simd_full + working-directory: ${{runner.workspace}} + run: X=$(pwd) && cd $GITHUB_WORKSPACE && bash ./cross_build_mingw64.sh simd_full -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DTARGET_CXX_ARCH=sandybridge -DTARGET_C_ARCH=sandybridge -DMIPP_INCLUDE_DIRS=$X/include/mipp + + - name: compress + run: tar zcvf pffft_cross-build-windows-from-linux-amd64.tar.gz --exclude=CMakeFiles --exclude=*.cmake --exclude=Makefile --exclude=CMakeCache.txt build_w32_no-simd build_w32_simd_full build_w64_no-simd build_w64_simd_full + - name: 'Upload Artifact' + uses: actions/upload-artifact@v2 + with: + name: pffft_windows_from_cross_builds + path: pffft_cross-build-windows-from-linux-amd64.tar.gz + + + build_win_msvc: + # The CMake configure and build commands are platform agnostic and should work equally + # well on Windows or Mac. You can convert this to a matrix build if you need + # cross-platform coverage. + # See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix + runs-on: windows-2019 + + steps: + - name: check out MIPP + uses: actions/checkout@master + with: + repository: hayguen/MIPP + path: ./MIPP + - name: cmake configure MIPP + shell: bash + working-directory: ${{runner.workspace}} + run: cmake -S pffft/MIPP -B MIPP_build -DCMAKE_INSTALL_PREFIX=$(pwd) + - name: cmake install MIPP headers + working-directory: ${{runner.workspace}} + run: cmake --build MIPP_build --target install + + - uses: actions/checkout@v2 + + - name: Configure CMake No-SIMD + shell: bash + working-directory: ${{runner.workspace}} + run: cmake -S $GITHUB_WORKSPACE -B build_no-simd -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DENABLE_PFDSP=ON -DUSE_SIMD=OFF -DTARGET_CXX_ARCH=none -DTARGET_C_ARCH=none + - name: Build No-SIMD + shell: bash + working-directory: ${{runner.workspace}} + # Execute the build. You can specify a specific target with "--target <NAME>" + run: cmake --build build_no-simd --config $BUILD_TYPE + + - name: Configure CMake SSE2 + shell: bash + working-directory: ${{runner.workspace}} + run: cmake -S $GITHUB_WORKSPACE -B build_sse2 -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DENABLE_PFDSP=ON -DTARGET_CXX_ARCH=SSE2 -DTARGET_C_ARCH=SSE2 -DMIPP_INCLUDE_DIRS=$(pwd)/include/mipp + - name: Build SSE2 + shell: bash + working-directory: ${{runner.workspace}} + # Execute the build. You can specify a specific target with "--target <NAME>" + run: cmake --build build_sse2 --config $BUILD_TYPE + + - name: Configure CMake AVX + # Use a bash shell so we can use the same syntax for environment variable + # access regardless of the host operating system + shell: bash + working-directory: ${{runner.workspace}} + run: cmake -S $GITHUB_WORKSPACE -B build_avx -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DENABLE_PFDSP=ON -DTARGET_CXX_ARCH=AVX -DTARGET_C_ARCH=AVX -DMIPP_INCLUDE_DIRS=$(pwd)/include/mipp + - name: Build AVX + working-directory: ${{runner.workspace}} + shell: bash + # Execute the build. You can specify a specific target with "--target <NAME>" + run: cmake --build build_avx --config $BUILD_TYPE + + - name: Configure CMake AVX2 + # Use a bash shell so we can use the same syntax for environment variable + # access regardless of the host operating system + shell: bash + working-directory: ${{runner.workspace}} + run: cmake -S $GITHUB_WORKSPACE -B build_avx2 -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DENABLE_PFDSP=ON -DTARGET_CXX_ARCH=AVX2 -DTARGET_C_ARCH=AVX2 -DMIPP_INCLUDE_DIRS=$(pwd)/include/mipp + - name: Build AVX2 + working-directory: ${{runner.workspace}} + shell: bash + # Execute the build. You can specify a specific target with "--target <NAME>" + run: cmake --build build_avx2 --config $BUILD_TYPE + + - name: compress + working-directory: ${{runner.workspace}} + run: tar zcvf pffft_windows-msvc-amd64.tar.gz --exclude=CMakeFiles --exclude=*.cmake --exclude=Makefile --exclude=CMakeCache.txt build_no-simd build_sse2 build_avx build_avx2 + - name: 'Upload Artifact' + uses: actions/upload-artifact@v2 + with: + name: pffft_windows_msvc_builds + path: ${{runner.workspace}}/pffft_windows-msvc-amd64.tar.gz + + + build_win_mingw: + runs-on: windows-2019 + strategy: + matrix: + compiler: [gcc] + msystem: [MINGW64] + defaults: + run: + shell: msys2 {0} + steps: + - uses: actions/checkout@v2 + - uses: msys2/setup-msys2@v2 + with: + msystem: MINGW64 + install: gcc cmake make + - name: Configure cmake + run: CC=gcc cmake -DMINGW=ON -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DTARGET_CXX_ARCH=native -DTARGET_C_ARCH=native -S . -B build_mgw64 + - name: Build + run: cmake --build build_mgw64 + + - name: compress + run: tar zcvf pffft_windows-mingw-amd64.tar.gz --exclude=CMakeFiles --exclude=*.cmake --exclude=Makefile --exclude=CMakeCache.txt build_mgw64 + - name: 'Upload Artifact' + uses: actions/upload-artifact@v2 + with: + name: pffft_windows_mingw_builds + path: pffft_windows-mingw-amd64.tar.gz + + + build_macos11: + # copied from build_ubuntu-amd64 with minor renaming + runs-on: macos-11 + + steps: + - uses: actions/checkout@v2 + - name: cmake_make_simd_float_double + run: mkdir build_simd_full && cmake -S . -B build_simd_full -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DTARGET_CXX_ARCH=native -DTARGET_C_ARCH=native && cmake --build build_simd_full + - name: cmake_make_simd_float + run: mkdir build_simd_float && cmake -S . -B build_simd_float -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_TYPE_DOUBLE=OFF -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DTARGET_CXX_ARCH=native -DTARGET_C_ARCH=native && cmake --build build_simd_float + - name: cmake_make_simd_double + run: mkdir build_simd_double && cmake -S . -B build_simd_double -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_TYPE_FLOAT=OFF -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DTARGET_CXX_ARCH=native -DTARGET_C_ARCH=native && cmake --build build_simd_double + - name: cmake_make_no-simd_float_double + run: mkdir build_no-simd_full && cmake -S . -B build_no-simd_full -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_SIMD=OFF -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DTARGET_CXX_ARCH=native -DTARGET_C_ARCH=native && cmake --build build_no-simd_full + - name: cmake_make_no-simd_scalar_float_double + run: mkdir build_no-simd_scalar_full && cmake -S . -B build_no-simd_scalar_full -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_SIMD=OFF -DUSE_SCALAR_VECT=ON -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DTARGET_CXX_ARCH=native -DTARGET_C_ARCH=native && cmake --build build_no-simd_scalar_full + - name: compress + run: tar zcvf pffft_macos-11.tar.gz --exclude=CMakeFiles --exclude=*.cmake --exclude=Makefile --exclude=CMakeCache.txt build_simd_full build_simd_float build_simd_double build_no-simd_full build_no-simd_scalar_full + - name: 'Upload Artifact' + uses: actions/upload-artifact@v2 + with: + name: pffft_macos_builds + path: pffft_macos-11.tar.gz + + build_w_mipp_macos11: + # copied from build_w_mipp_ubuntu-amd64 with minor renaming + runs-on: macos-11 + + steps: + - name: check out MIPP + uses: actions/checkout@master + with: + repository: hayguen/MIPP + path: ./MIPP + - name: cmake configure MIPP + run: cmake -S MIPP -B MIPP_build -DCMAKE_INSTALL_PREFIX=$HOME/.local + - name: cmake install MIPP headers + run: cmake --build MIPP_build --target install && ls -alh $HOME/.local/ && ls -alh $HOME/.local/include/ + + - uses: actions/checkout@v2 + - name: cmake_make_simd_float_double + run: mkdir build_simd_full && cmake -S . -B build_simd_full -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DTARGET_CXX_ARCH=native -DTARGET_C_ARCH=native && cmake --build build_simd_full + - name: cmake_make_simd_float + run: mkdir build_simd_float && cmake -S . -B build_simd_float -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_TYPE_DOUBLE=OFF -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DTARGET_CXX_ARCH=native -DTARGET_C_ARCH=native && cmake --build build_simd_float + - name: cmake_make_simd_double + run: mkdir build_simd_double && cmake -S . -B build_simd_double -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_TYPE_FLOAT=OFF -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DTARGET_CXX_ARCH=native -DTARGET_C_ARCH=native && cmake --build build_simd_double + - name: cmake_make_no-simd_float_double + run: mkdir build_no-simd_full && cmake -S . -B build_no-simd_full -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_SIMD=OFF -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DTARGET_CXX_ARCH=native -DTARGET_C_ARCH=native && cmake --build build_no-simd_full + - name: cmake_make_no-simd_scalar_float_double + run: mkdir build_no-simd_scalar_full && cmake -S . -B build_no-simd_scalar_full -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DUSE_SIMD=OFF -DUSE_SCALAR_VECT=ON -DUSE_BENCH_GREEN=OFF -DUSE_BENCH_KISS=OFF -DUSE_BENCH_POCKET=OFF -DTARGET_CXX_ARCH=native -DTARGET_C_ARCH=native && cmake --build build_no-simd_scalar_full + - name: compress + run: tar zcvf pffft_w_mipp_macos-11.tar.gz --exclude=CMakeFiles --exclude=*.cmake --exclude=Makefile --exclude=CMakeCache.txt build_simd_full build_simd_float build_simd_double build_no-simd_full build_no-simd_scalar_full + - name: 'Upload Artifact' + uses: actions/upload-artifact@v2 + with: + name: pffft_macos_builds + path: pffft_w_mipp_macos-11.tar.gz @@ -1,3 +1,4 @@ build build_benches +build_* .vscode diff --git a/CMakeLists.txt b/CMakeLists.txt index 572d276..fb985b4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,6 +63,22 @@ else() set(ASANLIB "") endif() +message(STATUS "INFO: CMAKE_C_COMPILER_ID is ${CMAKE_C_COMPILER_ID}") +message(STATUS "INFO: CMAKE_CXX_COMPILER_ID is ${CMAKE_CXX_COMPILER_ID}") +if (WIN32) + message(STATUS "INFO: detected WIN32") +else() + message(STATUS "INFO: NOT WIN32") +endif() +if (MINGW) + message(STATUS "INFO: detected MINGW with compiler ${CMAKE_C_COMPILER_ID}") +else() + message(STATUS "INFO: NOT MINGW") +endif() +if ( CMAKE_C_COMPILER_ID MATCHES "MSVC" ) + message(STATUS "INFO: detected MSVC with compiler ${CMAKE_C_COMPILER_ID}") +endif() + if (USE_BENCH_GREEN) if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/greenffts/CMakeLists.txt") @@ -180,7 +196,6 @@ endif() ###################################################### if (USE_TYPE_FLOAT) - 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 ) set_property(TARGET PFDSP PROPERTY CXX_STANDARD 11) set_property(TARGET PFDSP PROPERTY CXX_STANDARD_REQUIRED ON) @@ -188,18 +203,20 @@ if (USE_TYPE_FLOAT) target_compile_definitions(PFDSP PRIVATE _USE_MATH_DEFINES) target_activate_cxx_compiler_warnings(PFDSP) if (USE_DEBUG_ASAN) - target_compile_options(PFDSP PRIVATE "-fsanitize=address") + target_compile_options(PFDSP PRIVATE "-fsanitize=address") endif() if (USE_SIMD) - target_set_cxx_arch_flags(PFDSP) + target_set_cxx_arch_flags(PFDSP) + else() + target_compile_definitions(PFDSP PRIVATE PFFFT_SIMD_DISABLE=1) endif() target_link_libraries( PFDSP ${MATHLIB} ) set_property(TARGET PFDSP APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES - $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> + $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> ) if (INSTALL_PFDSP) - set(INSTALL_TARGETS ${INSTALL_TARGETS} PFDSP) - set(INSTALL_HEADERS ${INSTALL_HEADERS} pf_mixer.h pf_cplx.h pf_carrier.h pf_cic.h) + set(INSTALL_TARGETS ${INSTALL_TARGETS} PFDSP) + set(INSTALL_HEADERS ${INSTALL_HEADERS} pf_mixer.h pf_cplx.h pf_carrier.h pf_cic.h) endif() endif() @@ -433,18 +450,18 @@ endif() if (USE_TYPE_FLOAT) - add_executable(bench_pf_mixer_float bench_mixers.cpp papi_perf_counter.h) - target_compile_definitions(bench_pf_mixer_float PRIVATE _USE_MATH_DEFINES) - target_compile_definitions(bench_pf_mixer_float PRIVATE PFFFT_ENABLE_FLOAT) - target_link_libraries( bench_pf_mixer_float ${ASANLIB} ) - if (USE_DEBUG_ASAN) - target_compile_options(bench_pf_mixer_float PRIVATE "-fsanitize=address") - endif() - if (PAPI_FOUND) - target_compile_definitions(bench_pf_mixer_float PRIVATE HAVE_PAPI=1) - target_link_libraries(bench_pf_mixer_float ${PAPI_LIBRARIES}) - endif() - target_link_libraries( bench_pf_mixer_float PFDSP ) + add_executable(bench_pf_mixer_float bench_mixers.cpp papi_perf_counter.h) + target_compile_definitions(bench_pf_mixer_float PRIVATE _USE_MATH_DEFINES) + target_compile_definitions(bench_pf_mixer_float PRIVATE PFFFT_ENABLE_FLOAT) + target_link_libraries( bench_pf_mixer_float ${ASANLIB} ) + if (USE_DEBUG_ASAN) + target_compile_options(bench_pf_mixer_float PRIVATE "-fsanitize=address") + endif() + if (PAPI_FOUND) + target_compile_definitions(bench_pf_mixer_float PRIVATE HAVE_PAPI=1) + target_link_libraries(bench_pf_mixer_float ${PAPI_LIBRARIES}) + endif() + target_link_libraries( bench_pf_mixer_float PFDSP $<$<CXX_COMPILER_ID:GNU>:stdc++> ) ############################################################################ @@ -470,25 +487,23 @@ if (USE_TYPE_FLOAT) if ((CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") OR (CMAKE_SYSTEM_PROCESSOR MATCHES "AMD64")) - if ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - set(PF_CONV_ARCHES "sse3;sse4;avx;avx2") - set(PF_CONV_OPT_sse3 "core2") # emulate a map - set(PF_CONV_OPT_sse4 "nehalem") - set(PF_CONV_OPT_avx "sandybridge") - set(PF_CONV_OPT_avx2 "haswell") - target_compile_definitions(pf_conv_dispatcher PRIVATE CONV_ARCH_GCC_AMD64) - - elseif (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") - set(PF_CONV_ARCHES "sse2;avx;avx2") - set(PF_CONV_OPT_sse2 "SSE2") # emulate a map - set(PF_CONV_OPT_avx "AVX") - set(PF_CONV_OPT_avx2 "AVX2") - target_compile_definitions(pf_conv_dispatcher PRIVATE CONV_ARCH_MSVC_AMD64) - - else() - set(PF_CONV_ARCHES "") - message(WARNING "unknown compiler ${CMAKE_CXX_COMPILER_ID} on CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}: can't do architecture specific compilation") - endif() + if ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + set(PF_CONV_ARCHES "sse3;sse4;avx;avx2") + set(PF_CONV_OPT_sse3 "core2") # emulate a map + set(PF_CONV_OPT_sse4 "nehalem") + set(PF_CONV_OPT_avx "sandybridge") + set(PF_CONV_OPT_avx2 "haswell") + target_compile_definitions(pf_conv_dispatcher PRIVATE CONV_ARCH_GCC_AMD64) + elseif (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + set(PF_CONV_ARCHES "sse2;avx;avx2") + set(PF_CONV_OPT_sse2 "SSE2") # emulate a map + set(PF_CONV_OPT_avx "AVX") + set(PF_CONV_OPT_avx2 "AVX2") + target_compile_definitions(pf_conv_dispatcher PRIVATE CONV_ARCH_MSVC_AMD64) + else() + set(PF_CONV_ARCHES "") + message(WARNING "unknown compiler ${CMAKE_CXX_COMPILER_ID} on CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}: can't do architecture specific compilation") + endif() elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") @@ -504,20 +519,20 @@ if (USE_TYPE_FLOAT) elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "armv7l") - if ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - set(PF_CONV_ARCHES "neon_vfpv4;neon_rpi3_a53;neon_rpi4_a72") - set(PF_CONV_OPT_neon_vfpv4 "armv7-a") # emulate a map for arch - set(PF_CONV_EXTRA_neon_vfpv4 "neon_vfpv4") # emulate a map for additional options (EXTRA) - set(PF_CONV_OPT_neon_rpi3_a53 "armv7-a") - set(PF_CONV_EXTRA_neon_rpi3_a53 "neon_rpi3_a53") - set(PF_CONV_OPT_neon_rpi4_a72 "armv7-a") - set(PF_CONV_EXTRA_neon_rpi4_a72 "neon_rpi4_a72") - - target_compile_definitions(pf_conv_dispatcher PRIVATE CONV_ARCH_GCC_ARM32NEON) - else() - set(PF_CONV_ARCHES "") - message(WARNING "unknown compiler ${CMAKE_CXX_COMPILER_ID} on CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}: can't do architecture specific compilation") - endif() + if ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + set(PF_CONV_ARCHES "neon_vfpv4;neon_rpi3_a53;neon_rpi4_a72") + set(PF_CONV_OPT_neon_vfpv4 "armv7-a") # emulate a map for arch + set(PF_CONV_EXTRA_neon_vfpv4 "neon_vfpv4") # emulate a map for additional options (EXTRA) + set(PF_CONV_OPT_neon_rpi3_a53 "armv7-a") + set(PF_CONV_EXTRA_neon_rpi3_a53 "neon_rpi3_a53") + set(PF_CONV_OPT_neon_rpi4_a72 "armv7-a") + set(PF_CONV_EXTRA_neon_rpi4_a72 "neon_rpi4_a72") + + target_compile_definitions(pf_conv_dispatcher PRIVATE CONV_ARCH_GCC_ARM32NEON) + else() + set(PF_CONV_ARCHES "") + message(WARNING "unknown compiler ${CMAKE_CXX_COMPILER_ID} on CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}: can't do architecture specific compilation") + endif() else() message(WARNING "this is unforseen CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}: can't do architecture specific compilation") @@ -560,7 +575,6 @@ if (USE_TYPE_FLOAT) ############################################################################ - add_executable(bench_pf_conv_float bench_conv.cpp papi_perf_counter.h) set_property(TARGET bench_pf_conv_float PROPERTY CXX_STANDARD 11) set_property(TARGET bench_pf_conv_float PROPERTY CXX_STANDARD_REQUIRED ON) @@ -577,8 +591,7 @@ if (USE_TYPE_FLOAT) if(MIPP_FOUND) target_link_libraries(bench_pf_conv_float MIPP) endif() - - target_link_libraries( bench_pf_conv_float pf_conv_dispatcher PFDSP ) + target_link_libraries( bench_pf_conv_float pf_conv_dispatcher PFDSP $<$<CXX_COMPILER_ID:GNU>:stdc++> ) endif() diff --git a/bench_conv.cpp b/bench_conv.cpp index 3fbbcb5..a42d8ef 100644 --- a/bench_conv.cpp +++ b/bench_conv.cpp @@ -13,7 +13,7 @@ //#if defined(HAVE_MIPP) && !defined(NO_MIPP) #if defined(HAVE_MIPP) -#include <mipp/mipp.h> +#include <mipp.h> #define MIPP_VECTOR mipp::vector #else diff --git a/cmake/FindMIPP.cmake b/cmake/FindMIPP.cmake index 60e97d9..afd840d 100644 --- a/cmake/FindMIPP.cmake +++ b/cmake/FindMIPP.cmake @@ -3,17 +3,24 @@ if(MIPP_INCLUDE_DIRS) set(MIPP_FIND_QUIETLY TRUE) endif() -find_path(MIPP_INCLUDE_DIRS NAMES mipp.h HINTS ${MIPP_ROOT} PATH_SUFFIXES include/mipp) +find_path(MIPP_INCLUDE_DIRS NAMES mipp.h + HINTS + ${MIPP_ROOT} + $ENV{HOME}/.local + PATH_SUFFIXES include/mipp +) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(MIPP DEFAULT_MSG MIPP_INCLUDE_DIRS) if(MIPP_FOUND AND NOT TARGET MIPP) - message(STATUS "MIPP_FOUND -> creating interface library MIPP") + message(STATUS "MIPP_FOUND -> creating interface library MIPP at ${MIPP_INCLUDE_DIRS}") add_library(MIPP INTERFACE) target_compile_definitions(MIPP INTERFACE HAVE_MIPP=1) - target_include_directories(MIPP INTERFACE MIPP_INCLUDE_DIRS) + target_include_directories(MIPP INTERFACE ${MIPP_INCLUDE_DIRS}) target_compile_features(MIPP INTERFACE cxx_std_11) +else() + message(WARNING "MIPP not found.") endif() mark_as_advanced(MIPP_INCLUDE_DIRS) diff --git a/cmake/target_optimizations.cmake b/cmake/target_optimizations.cmake index 23160ee..6d19fdb 100644 --- a/cmake/target_optimizations.cmake +++ b/cmake/target_optimizations.cmake @@ -54,6 +54,7 @@ elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "armv7l") set(GCC_MARCH_VALUES "none;native;armv7-a" CACHE INTERNAL "List of possible architectures") set(GCC_EXTRA_VALUES "none;neon_vfpv4;neon_rpi3_a53;neon_rpi4_a72" CACHE INTERNAL "List of possible additional options") else() + message(WARNING "unsupported CMAKE_SYSTEM_PROCESSOR '${CMAKE_SYSTEM_PROCESSOR}'") # other PROCESSORs could be "ppc", "ppc64", "arm" - or something else?! set(GCC_MARCH_DESC "native") set(GCC_MARCH_VALUES "none;native" CACHE INTERNAL "List of possible architectures") diff --git a/cross_build_mingw32.sh b/cross_build_mingw32.sh new file mode 100755 index 0000000..94f05f9 --- /dev/null +++ b/cross_build_mingw32.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# requires debian/ubuntu packages: zip gcc-mingw-w64 + +if [ -z "$1" ]; then + echo "usage: $0 <zip-post> <any other cmake options>" + exit 1 +fi + +ZIP_POST="$1" +shift + +CROSS="i686-w64-mingw32" +WN="w32" +TOOLCHAIN="mingw-w32-i686.cmake" + +rm -rf build_${WN}_${ZIP_POST} +echo -e "\n\n********************************************************" +echo "start build of pffft_${WN}_${ZIP_POST}" +mkdir build_${WN}_${ZIP_POST} && \ +cmake -S . -B build_${WN}_${ZIP_POST} \ + -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN} \ + -DCMAKE_INSTALL_PREFIX=pffft_bin-${WN}_${ZIP_POST} \ + "$@" && \ +cmake --build build_${WN}_${ZIP_POST} diff --git a/cross_build_mingw64.sh b/cross_build_mingw64.sh new file mode 100755 index 0000000..23c251f --- /dev/null +++ b/cross_build_mingw64.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# requires debian/ubuntu packages: zip gcc-mingw-w64 + +if [ -z "$1" ]; then + echo "usage: $0 <zip-post> <any other cmake options>" + exit 1 +fi + +ZIP_POST="$1" +shift + +# CROSS="x86_64-w64-mingw32" +WN="w64" +TOOLCHAIN="mingw-w64-x64_64.cmake" + +rm -rf build_${WN}_${ZIP_POST} +echo -e "\n\n********************************************************" +echo "start build of pffft_${WN}_${ZIP_POST}" +mkdir build_${WN}_${ZIP_POST} && \ +cmake -S . -B build_${WN}_${ZIP_POST} \ + -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN} \ + -DCMAKE_INSTALL_PREFIX=pffft_bin-${WN}_${ZIP_POST} \ + "$@" && \ +cmake --build build_${WN}_${ZIP_POST} diff --git a/mingw-w32-i686.cmake b/mingw-w32-i686.cmake new file mode 100644 index 0000000..eecd236 --- /dev/null +++ b/mingw-w32-i686.cmake @@ -0,0 +1,25 @@ +# Sample toolchain file for building for Windows from an Ubuntu Linux system. +# +# Typical usage: +# *) install cross compiler: `sudo apt-get install mingw-w64` +# *) cd build +# *) cmake -DCMAKE_TOOLCHAIN_FILE=~/mingw-w32-i686.cmake .. +# +# build for Windows' 32 bit architecture + +set(CMAKE_SYSTEM_NAME Windows) +set(CMAKE_SYSTEM_PROCESSOR x86_64) +set(TOOLCHAIN_PREFIX i686-w64-mingw32) + +# cross compilers to use for C, C++ and Fortran +set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc) +set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++) +set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres) + +# target environment on the build host system +set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX}) + +# modify default behavior of FIND_XXX() commands +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff --git a/mingw-w64-x64_64.cmake b/mingw-w64-x64_64.cmake new file mode 100644 index 0000000..1ed08f0 --- /dev/null +++ b/mingw-w64-x64_64.cmake @@ -0,0 +1,25 @@ +# Sample toolchain file for building for Windows from an Ubuntu Linux system. +# +# Typical usage: +# *) install cross compiler: `sudo apt-get install mingw-w64` +# *) cd build +# *) cmake -DCMAKE_TOOLCHAIN_FILE=~/mingw-w64-x86_64.cmake .. +# +# build for Windows' 64 bit architecture + +set(CMAKE_SYSTEM_NAME Windows) +set(CMAKE_SYSTEM_PROCESSOR x86_64) +set(TOOLCHAIN_PREFIX x86_64-w64-mingw32) + +# cross compilers to use for C, C++ and Fortran +set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc) +set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++) +set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres) + +# target environment on the build host system +set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX}) + +# modify default behavior of FIND_XXX() commands +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) @@ -28,6 +28,9 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* gcc requires this for M_PI !? */ +#undef __STRICT_ANSI__ + /* include own header first, to see missing includes */ #include "pf_cic.h" #include "fmv.h" @@ -70,7 +73,7 @@ void *cicddc_init(int factor) { s->gain = 1.0f / SHRT_MAX / sineamp / factor / factor / factor; // compensate for gain of 3 integrators s->sinetable = (int16_t *)malloc(sinesize2 * sizeof(*s->sinetable)); - double f = 2.0*M_PI / (double)SINESIZE; + double f = 2.0 * M_PI / (double)SINESIZE; for(i = 0; i < sinesize2; i++) { s->sinetable[i] = sineamp * cos(f * i); } diff --git a/pf_conv.cpp b/pf_conv.cpp index eb362c1..45e56d5 100644 --- a/pf_conv.cpp +++ b/pf_conv.cpp @@ -17,7 +17,7 @@ #ifdef HAVE_MIPP -#include <mipp/mipp.h> +#include <mipp.h> #endif @@ -315,6 +315,8 @@ const conv_f_ptrs* ARCHFUNCNAME(conv_ptrs)() return nullptr; } - -[[maybe_unused]] static f_conv_ptrs test_f_ptrs = ARCHFUNCNAME(conv_ptrs); +#if defined(__cplusplus) && (__cplusplus >= 201703L) +[[maybe_unused]] +#endif +static f_conv_ptrs test_f_ptrs = ARCHFUNCNAME(conv_ptrs); @@ -98,6 +98,10 @@ extern const conv_f_ptrs* CONV_FN_ARCH(conv_ptrs, sse4)(); extern const conv_f_ptrs* CONV_FN_ARCH(conv_ptrs, avx)(); extern const conv_f_ptrs* CONV_FN_ARCH(conv_ptrs, avx2)(); +extern const conv_f_ptrs* CONV_FN_ARCH(conv_ptrs, sse2)(); +//extern const conv_f_ptrs* CONV_FN_ARCH(conv_ptrs, avx)(); // already declared +//extern const conv_f_ptrs* CONV_FN_ARCH(conv_ptrs, avx2)(); // already declared + extern const conv_f_ptrs* CONV_FN_ARCH(conv_ptrs, neon_vfpv4)(); // for armv7l / 32-bit ARM extern const conv_f_ptrs* CONV_FN_ARCH(conv_ptrs, neon_rpi3_a53)(); extern const conv_f_ptrs* CONV_FN_ARCH(conv_ptrs, neon_rpi4_a72)(); diff --git a/pf_conv_dispatcher.cpp b/pf_conv_dispatcher.cpp index 0b1c223..8a5f725 100644 --- a/pf_conv_dispatcher.cpp +++ b/pf_conv_dispatcher.cpp @@ -32,10 +32,10 @@ ptr_to_conv_f_ptrs * get_all_conv_arch_ptrs(int * p_num_arch) conv_arch_ptrs[n_arch++] = CONV_FN_ARCH(conv_ptrs, avx2)(); #elif defined(CONV_ARCH_MSVC_AMD64) static const conv_f_ptrs *conv_arch_ptrs[N_DEFAULT_ARCHES+3] = {0}; - DPRINT("CONV_ARCH_MSVC_AMD64: SSE2, AVX, AVX2\n"); - conv_arch_ptrs[n_arch++] = CONV_FN_ARCH(conv_ptrs, SSE2)(); - conv_arch_ptrs[n_arch++] = CONV_FN_ARCH(conv_ptrs, AVX) (); - conv_arch_ptrs[n_arch++] = CONV_FN_ARCH(conv_ptrs, AVX2)(); + DPRINT("CONV_ARCH_MSVC_AMD64: sse2, avx, avx2\n"); + conv_arch_ptrs[n_arch++] = CONV_FN_ARCH(conv_ptrs, sse2)(); + conv_arch_ptrs[n_arch++] = CONV_FN_ARCH(conv_ptrs, avx) (); + conv_arch_ptrs[n_arch++] = CONV_FN_ARCH(conv_ptrs, avx2)(); #elif defined(CONV_ARCH_GCC_ARM32NEON) static const conv_f_ptrs *conv_arch_ptrs[N_DEFAULT_ARCHES+3] = {0}; DPRINT("CONV_ARCH_GCC_ARM32NEON: neon_vfpv4, neon_rpi3_a53\n"); @@ -1018,7 +1018,7 @@ class PFAlloc { // allocate but don't initialize num elements of type T pointer allocate (size_type num, const void* = 0) { - pointer ret = (pointer)( alignedAlloc<T>(num) ); + pointer ret = (pointer)( alignedAlloc<T>(int(num)) ); return ret; } |