diff --git a/.gitignore b/.gitignore index 140ed43..d0d3fb6 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ include .cache img .vscode +.DS_Store diff --git a/CMakeLists.txt b/CMakeLists.txt index fdb7514..f402625 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,9 +1,11 @@ +# CMake Configuration cmake_minimum_required(VERSION 3.12) +list(PREPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules) + set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_EXTENSIONS ON) - -project(fft_benchmark) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) if (MSVC) add_compile_definitions(_CRT_SECURE_NO_WARNINGS) @@ -12,19 +14,19 @@ endif () add_compile_definitions(CMAKE_CXX_COMPILER_ID="${CMAKE_CXX_COMPILER_ID}") add_compile_definitions(CMAKE_CXX_COMPILER_VERSION="${CMAKE_CXX_COMPILER_VERSION}") -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) - -set(COMMON_INCLUDES ${CMAKE_CURRENT_LIST_DIR}/src) - -set(COMMON_SRCS ${CMAKE_CURRENT_LIST_DIR}/src/fft_benchmark.cpp ${CMAKE_CURRENT_LIST_DIR}/src/benchmark.hpp - ${CMAKE_CURRENT_LIST_DIR}/src/benchmark.cpp ${CMAKE_CURRENT_LIST_DIR}/src/utils.cpp) +# Project information & includes +project(fft_benchmark) +add_compile_options(-Wextra -Wno-sign-compare -Wimplicit-fallthrough) -function (add_fft NAME) - cmake_parse_arguments(LIB "" "" "SOURCES;LIBRARIES;INCLUDES" ${ARGN}) +if(APPLE) + set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON) + set(CMAKE_INSTALL_NAME_DIR "@rpath") + set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) + set(CMAKE_INSTALL_RPATH "@loader_path") +endif() - add_executable(fft_benchmark_${NAME} ${COMMON_SRCS} ${LIB_SOURCES}) - target_link_libraries(fft_benchmark_${NAME} PRIVATE ${LIB_LIBRARIES}) - target_include_directories(fft_benchmark_${NAME} PRIVATE ${COMMON_INCLUDES} ${LIB_INCLUDES}) -endfunction () +include(DisableInSourceBuild) +include(FindPackageStandard) -add_subdirectory(fftlibs) +# Adding libraries +add_subdirectory(src) diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ad5a0d1 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,53 @@ +# Use the rootproject/root image as the base image +FROM rootproject/root:latest + +# Update package lists and install necessary packages +ENV LANG=C.UTF-8 +ENV DEBIAN_FRONTEND noninteractive +ENV NPROC=8 + +COPY Dockerfile.packages packages + +RUN apt-get update -qq && \ + ln -sf /usr/share/zoneinfo/UTC /etc/localtime && \ + apt-get -y install $(cat packages | grep -v '#') && \ + apt-get autoremove -y && \ + apt-get clean -y && \ + rm -rf /var/cache/apt/archives/* && \ + rm -rf /var/lib/apt/lists/* + +ENV LD_LIBRARY_PATH /usr/local/lib:/usr:/usr/lib/aarch64-linux-gnu:/usr/lib/x86_64-linux-gnu + +COPY . /opt/fft-benchmark +WORKDIR /opt/fft-benchmark + +# KFR5/6 +RUN wget https://github.com/kfrlib/kfr/archive/refs/tags/6.0.2.tar.gz +RUN tar -xzvf 6.0.2.tar.gz +RUN cd kfr-6.0.2 && mkdir build +RUN cd kfr-6.0.2/build && cmake .. -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_INSTALL_PREFIX=/opt/kfr/6.0.2 +RUN cd kfr-6.0.2/build && make -j8 && make install + +RUN wget https://github.com/kfrlib/kfr/archive/refs/tags/5.2.0.tar.gz +RUN tar -xzvf 5.2.0.tar.gz +RUN cd kfr-5.2.0 && mkdir build +RUN cd kfr-5.2.0/build && cmake .. -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_INSTALL_PREFIX=/opt/kfr/5.2.0 +RUN cd kfr-5.2.0/build && make -j8 && make install + +RUN wget https://github.com/kfrlib/kfr/archive/refs/tags/5.0.0.tar.gz +RUN tar -xzvf 5.0.0.tar.gz +RUN cd kfr-5.0.0 && mkdir build +RUN cd kfr-5.0.0/build && cmake .. -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_INSTALL_PREFIX=/opt/kfr/5.0.0 +RUN cd kfr-5.0.0/build && make -j8 && make install + +# FFTW3 (Optional) +RUN apt-get update && apt-get install libfftw3-dev || true + +# Intel IPP (Optional) +RUN wget https://registrationcenter-download.intel.com/akdlm/IRC_NAS/046b1402-c5b8-4753-9500-33ffb665123f/l_ipp_oneapi_p_2021.10.1.16.sh || true +RUN ./l_ipp_oneapi_p_2021.10.1.16.sh || true + +# Intel MKP (Optional) +RUN apt-get update && apt-get install intel-oneapi-mkl-devel || true + +CMD ["make", "all"] diff --git a/Dockerfile.packages b/Dockerfile.packages new file mode 100644 index 0000000..4b6dc43 --- /dev/null +++ b/Dockerfile.packages @@ -0,0 +1,12 @@ +bash +git +wget +make +supervisor +lsb-release +gnupg2 +ca-certificates +nano +procps +cmake +clang diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..866cc4c --- /dev/null +++ b/Makefile @@ -0,0 +1,38 @@ +.PHONY: all smalln highn potn plot +all: + @$(MAKE) smalln + @$(MAKE) highn + @$(MAKE) potn + + @$(MAKE) plot + +smalln: + @share/benchmark/fftdivision share/kfr5-smalln kfr5 1000 100 + @share/benchmark/fftdivision share/kfr6-smalln kfr6 1000 100 + @share/benchmark/fftdivision share/fftw-smalln fftw 1000 100 + @share/benchmark/fftdivision share/ipp-smalln ipp 1000 100 + @share/benchmark/fftdivision share/mkl-smalln mkl 1000 100 + +highn: + @share/benchmark/fftdivision share/kfr5-highn kfr5 1000000 100 + @share/benchmark/fftdivision share/kfr6-highn kfr6 1000000 100 + @share/benchmark/fftdivision share/fftw-highn fftw 1000000 100 + @share/benchmark/fftdivision share/ipp-highn ipp 1000000 100 + @share/benchmark/fftdivision share/mkl-highn mkl 1000000 100 + +potn: + @share/benchmark/fftpot share/kfr5-potn kfr5 20 + @share/benchmark/fftpot share/kfr6-potn kfr6 20 + @share/benchmark/fftpot share/fftw-potn fftw 20 + @share/benchmark/fftpot share/ipp-potn ipp 20 + @share/benchmark/fftpot share/mkl-potn mkl 20 + +plot: + @share/benchmark/plot.py share/kfr5-highn/*.json share/kfr6-highn/*.json share/fftw-highn/*.json share/ipp-highn/*.json share/mkl-highn/*.json + @share/benchmark/plot.py share/kfr5-smalln/*.json share/kfr6-smalln/*.json share/fftw-smalln/*.json share/ipp-smalln/*.json share/mkl-smalln/*.json + @share/benchmark/plot.py share/kfr5-potn/*.json share/kfr6-potn/*.json share/fftw-potn/*.json share/ipp-potn/*.json share/mkl-potn/*.json + + @root -l share/benchmark/plot.C share/kfr5-highn/*.json share/kfr6-highn/*.json share/fftw-highn/*.json share/ipp-highn/*.json share/mkl-highn/*.json + @root -l share/benchmark/plot.C share/kfr5-smalln/*.json share/kfr6-smalln/*.json share/fftw-smalln/*.json share/ipp-smalln/*.json share/mkl-smalln/*.json + @root -l share/benchmark/plot.C share/kfr5-potn/*.json share/kfr6-potn/*.json share/fftw-potn/*.json share/ipp-potn/*.json share/mkl-potn/*.json + \ No newline at end of file diff --git a/bootstrap.sh b/bootstrap.sh new file mode 100755 index 0000000..2e4e384 --- /dev/null +++ b/bootstrap.sh @@ -0,0 +1,13 @@ +#! /bin/bash + +# KFR 5 +mkdir -p build +cd build +cmake .. -DCMAKE_INSTALL_PREFIX=$PWD/../install \ + -DKFR5="$KFR5" -DKFR6="$KFR6" \ + -DFFTW="$FFTW" \ + -DIPP="$IPP" \ + -DMKL="$MKL"\ + +make -j8 && make install +cd .. diff --git a/cmake/DisableInSourceBuild.cmake b/cmake/DisableInSourceBuild.cmake new file mode 100644 index 0000000..44d7915 --- /dev/null +++ b/cmake/DisableInSourceBuild.cmake @@ -0,0 +1,5 @@ +# Check if the source directory is the same as the binary directory +if (${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) + # Display a fatal error message if it's an in-source build + message(FATAL_ERROR "In-source build not allowed. Please make a new directory (called a build directory) and run the cmake command from there (don't forget now to remove the cached variables).") +endif() \ No newline at end of file diff --git a/cmake/FindPackageStandard.cmake b/cmake/FindPackageStandard.cmake new file mode 100644 index 0000000..2985e93 --- /dev/null +++ b/cmake/FindPackageStandard.cmake @@ -0,0 +1,403 @@ +function(find_package_standard) + + # Parse expected arguments and extract expected library headers + set(options "HEADER_FILE_ONLY") + set(oneValueArgs "") + set(multiValueArgs NAMES HEADERS HINTS PATHS PATH_SUFFIXES) + + cmake_parse_arguments(LIBRARY "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + # Extract package name from basename + list(LENGTH LIBRARY_UNPARSED_ARGUMENTS ARGC) + if(ARGC GREATER 0) + list(GET LIBRARY_UNPARSED_ARGUMENTS 0 LIBRARY) + else() + get_filename_component(FILE_NAME ${CMAKE_CURRENT_LIST_FILE} NAME_WE) + if(${FILE_NAME} MATCHES "^Find(.+)$") + set(LIBRARY ${CMAKE_MATCH_1}) + else() + message(WARNING "Library name cannot be extracted from `${CMAKE_CURRENT_LIST_FILE}`.") + endif() + endif() + + if (${LIBRARY}_FOUND) + return() + endif() + + # Hints for default system directory paths for libraries and includes (Linux specific) + if (UNIX AND NOT APPLE) + list(APPEND CMAKE_SYSTEM_LIBRARY_PATH /usr/lib /usr/local/lib) + list(APPEND CMAKE_SYSTEM_INCLUDE_PATH /usr/include /usr/local/include) + endif() + + # Prepare include and library file location variables + set(_INCLUDE_PATHS) + set(_LIBRARY_PATHS) + + if(DEFINED ${LIBRARY}_DIR) # Priority to input cmake variables + set(_INCLUDE_PATHS "${${LIBRARY}_DIR}/include") + set(_LIBRARY_PATHS "${${LIBRARY}_DIR}/lib") + endif() + + foreach(LIBRARY_PATH ${LIBRARY_PATHS}) + list(APPEND _LIBRARY_PATHS "${LIBRARY_PATH}/lib") + list(APPEND _INCLUDE_PATHS "${LIBRARY_PATH}/include") + endforeach() + + if(DEFINED ENV{${LIBRARY}_DIR}) # Less priority for environment variables + set(_INCLUDE_PATHS "${ENV{${LIBRARY}_DIR}}/include") + set(_LIBRARY_PATHS "${ENV{${LIBRARY}_DIR}}/lib") + endif() + + # Merge with LD_LIBRARY_PATH and DYLD_LIBRARY_PATH (lower priority) + if (DEFINED ENV{LD_LIBRARY_PATH}) + string(REPLACE ":" ";" LD_LIBRARY_PATH_LIST $ENV{LD_LIBRARY_PATH}) + list(APPEND _LIBRARY_PATHS ${LD_LIBRARY_PATH_LIST}) + endif() + + if (DEFINED ENV{DYLD_LIBRARY_PATH}) + string(REPLACE ":" ";" DYLD_LIBRARY_PATH_LIST $ENV{DYLD_LIBRARY_PATH}) + list(APPEND _LIBRARY_PATHS ${DYLD_LIBRARY_PATH_LIST}) + endif() + + list(REMOVE_DUPLICATES _LIBRARY_PATHS) + list(REMOVE_DUPLICATES _INCLUDE_PATHS) + + # Looking for library headers + if(LIBRARY_HEADERS) + + find_path(${LIBRARY}_INCLUDE_DIRS + NAMES + ${LIBRARY_HEADERS} + PATHS + ${${LIBRARY}_INCLUDE_DIR} ${CMAKE_SYSTEM_INCLUDE_PATH} ${_INCLUDE_PATHS} + PATH_SUFFIXES + include + HINTS + ${LIBRARY_HINTS} + ) + + endif() + + # Looking for library version + set(${LIBRARY}_VERSION "0.0.0") + foreach(LIBRARY_HEADER ${LIBRARY_HEADERS}) + + set(LIBRARY_HEADER "${${LIBRARY}_INCLUDE_DIRS}/${LIBRARY_HEADER}") + if("${${LIBRARY}_VERSION}" STREQUAL "0.0.0" AND EXISTS ${LIBRARY_HEADER}) + + file(READ "${LIBRARY_HEADER}" LIBRARY_HEADER_CONTENTS) + + string(REGEX MATCH "#define [^ ]*VERSION_MAJOR ([0-9]+)" VERSION_MAJOR_MATCH "${LIBRARY_HEADER_CONTENTS}") + if(VERSION_MAJOR_MATCH) + set(${LIBRARY}_VERSION_MAJOR ${CMAKE_MATCH_1}) + else() + set(${LIBRARY}_VERSION_MAJOR 0) + endif() + + string(REGEX MATCH "#define [^ ]*VERSION_MINOR ([0-9]+)" VERSION_MINOR_MATCH "${LIBRARY_HEADER_CONTENTS}") + if(VERSION_MINOR_MATCH) + set(${LIBRARY}_VERSION_MINOR ${CMAKE_MATCH_1}) + else() + set(${LIBRARY}_VERSION_MINOR 0) + endif() + + string(REGEX MATCH "#define [^ ]*VERSION_PATCH ([0-9]+)" VERSION_PATCH_MATCH "${LIBRARY_HEADER_CONTENTS}") + if(VERSION_PATCH_MATCH) + set(${LIBRARY}_VERSION_PATCH ${CMAKE_MATCH_1}) + else() + set(${LIBRARY}_VERSION_PATCH 0) + endif() + + string(REGEX MATCH "#define [^ ]*VERSION_TWEAK ([0-9]+)" VERSION_TWEAK_MATCH "${LIBRARY_HEADER_CONTENTS}") + if(VERSION_TWEAK_MATCH) + set(${LIBRARY}_VERSION_TWEAK ${CMAKE_MATCH_1}) + else() + set(${LIBRARY}_VERSION_TWEAK 0) + endif() + + string(REGEX MATCH "#define [^ ]*VERSION_COUNT([0-9]+)" VERSION_COUNT_MATCH "${LIBRARY_HEADER_CONTENTS}") + if(VERSION_COUNT_MATCH) + set(${LIBRARY}_VERSION_COUNT ${CMAKE_MATCH_1}) + else() + set(${LIBRARY}_VERSION_COUNT 0) + endif() + if(${LIBRARY}_VERSION_COUNT GREATER 4) + set(${LIBRARY}_VERSION_COUNT 4) + endif() + + string(REGEX MATCH "#define [^ ]*VERSION ([0-9]+)" VERSION_MATCH "${LIBRARY_HEADER_CONTENTS}") + if(VERSION_MATCH) + set(${LIBRARY}_VERSION ${CMAKE_MATCH_1}) + else() + set(${LIBRARY}_VERSION "${${LIBRARY}_VERSION_MAJOR}.${${LIBRARY}_VERSION_MINOR}.${${LIBRARY}_VERSION_PATCH}") + endif() + + endif() + + endforeach() + + if("${${LIBRARY}_VERSION}" STREQUAL "0.0.0") + set(${LIBRARY}_VERSION "") + endif() + + # Look for libraries + if(NOT LIBRARY_HEADER_FILE_ONLY) + + if(NOT DEFINED ${LIBRARY}_LIBRARIES) + + if(NOT LIBRARY_NAMES) + message(FATAL_ERROR "Missing library name looking for package `${LIBRARY}`") + endif() + + foreach(LIBRARY_NAME IN LISTS LIBRARY_NAMES) + + string(REGEX REPLACE "^lib" "" STRIPLIB "${LIBRARY_NAME}") + + string(TOLOWER ${STRIPLIB} LOWER_STRIPLIB) + string(TOUPPER ${STRIPLIB} UPPER_STRIPLIB) + + string(TOLOWER ${LIBRARY_NAME} LOWER_LIBRARY) + string(TOUPPER ${LIBRARY_NAME} UPPER_LIBRARY) + + if(TARGET ${${LIBRARY_NAME}_LIBRARY}) + + set(${LIBRARY_NAME}_LIBRARY ${CMAKE_BINARY_DIR}/lib/lib${LIBRARY_NAME}.so) + if(APPLE) + set(${LIBRARY_NAME}_LIBRARY ${CMAKE_BINARY_DIR}/lib/lib${LIBRARY_NAME}.dylib) + endif() + + else() + + find_library( + ${LIBRARY_NAME}_LIBRARY + NAMES ${LIBRARY_NAME} ${LOWER_LIBRARY} ${UPPER_LIBRARY} + ${STRIPLIB} ${LOWER_STRIPLIB} ${UPPER_STRIPLIB} + PATHS ${_LIBRARY_PATHS} + PATH_SUFFIXES lib lib64 + ) + + endif() + + if(${LIBRARY_NAME}_LIBRARY) + list(APPEND ${LIBRARY}_LIBRARIES ${${LIBRARY_NAME}_LIBRARY}) + unset(${LIBRARY_NAME}_LIBRARY CACHE) + endif() + + + endforeach() + + if(TARGET ${LIBRARY}) + + set(${LIBRARY}_FOUND TRUE) + set(${LIBRARY}_INCLUDE_DIRS ${CMAKE_BINARY_DIR}/include) + + else() + + # Provide information about how to use the library + include(FindPackageHandleStandardArgs) + if(NOT ${LIBRARY}_VERSION) + find_package_handle_standard_args(${LIBRARY} + FOUND_VAR ${LIBRARY}_FOUND + REQUIRED_VARS ${LIBRARY}_LIBRARIES ${LIBRARY}_INCLUDE_DIRS + ) + else() + find_package_handle_standard_args(${LIBRARY} + FOUND_VAR ${LIBRARY}_FOUND + REQUIRED_VARS ${LIBRARY}_LIBRARIES ${LIBRARY}_INCLUDE_DIRS + VERSION_VAR "${LIBRARY}_VERSION" + HANDLE_VERSION_RANGE + ) + endif() + endif() + + endif() + + elseif(${LIBRARY}_INCLUDE_DIRS) + + set(${LIBRARY}_FOUND TRUE) + + endif() + + # Pass the variables back to the parent scope + set(${LIBRARY}_FOUND ${${LIBRARY}_FOUND} PARENT_SCOPE) + set(${LIBRARY}_LIBRARIES ${${LIBRARY}_LIBRARIES} PARENT_SCOPE) + set(${LIBRARY}_INCLUDE_DIRS ${${LIBRARY}_INCLUDE_DIRS} PARENT_SCOPE) + set(${LIBRARY}_VERSION ${${LIBRARY}_VERSION} PARENT_SCOPE) + set(${LIBRARY}_VERSION_MAJOR ${${LIBRARY}_VERSION_MAJOR} PARENT_SCOPE) + set(${LIBRARY}_VERSION_MINOR ${${LIBRARY}_VERSION_MINOR} PARENT_SCOPE) + set(${LIBRARY}_VERSION_PATCH ${${LIBRARY}_VERSION_PATCH} PARENT_SCOPE) + set(${LIBRARY}_VERSION_TWEAK ${${LIBRARY}_VERSION_TWEAK} PARENT_SCOPE) + set(${LIBRARY}_VERSION_COUNT ${${LIBRARY}_VERSION_COUNT} PARENT_SCOPE) + + # Remove cache variables + if(DEFINED ${LIBRARY}_LIBRARIES) + unset(${LIBRARY}_LIBRARIES CACHE) + endif() + + if(DEFINED ${LIBRARY}_INCLUDE_DIRS) + unset(${LIBRARY}_INCLUDE_DIRS CACHE) + endif() + + if(DEFINED ${LIBRARY}_INCLUDE_DIR) + unset(${LIBRARY}_INCLUDE_DIR CACHE) + endif() + +endfunction() + +macro(target_link_package) + + # Parse expected arguments + set(options EXACT QUIET REQUIRED CONFIG NO_MODULE GLOBAL NO_POLICY_SCOPE BYPASS_PROVIDER + NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH + NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_PACKAGE_REGISTRY NO_CMAKE_BUILDS_PATH + NO_CMAKE_SYSTEM_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_SYSTEM_PACKAGE_REGISTRY + CMAKE_FIND_ROOT_PATH_BOTH ONLY_CMAKE_FIND_ROOT_PATH NO_CMAKE_FIND_ROOT_PATH) + + set(oneValueArgs NAMES REGISTRY_VIEW DESTINATION RENAME) + + set(multiValueArgs COMPONENTS OPTIONAL_COMPONENTS CONFIGS HINTS PATHS PATH_SUFFIXES TARGETS CONFIGURATIONS) + + cmake_parse_arguments(MY "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + # Check mandatory and optional unparsed aguments + list(LENGTH MY_UNPARSED_ARGUMENTS ARGC) + if(ARGC LESS 1) + message(FATAL_ERROR "target_link_package: Please provide at least TARGET_NAME and PACKAGE_NAME.") + elseif(ARGC LESS 2) + message(FATAL_ERROR "target_link_package: Please provide PACKAGE_NAME.") + else() + + list(GET MY_UNPARSED_ARGUMENTS 0 MY_TARGET_NAME) + list(GET MY_UNPARSED_ARGUMENTS 1 MY_PACKAGE_NAME) + if(ARGC GREATER 2) + list(GET MY_UNPARSED_ARGUMENTS 2 MY_VERSION) + endif() + endif() + + # Prepare find_package arguments + set(ARGS) + if(MY_EXACT) + list(APPEND ARGS EXACT) + endif() + if(MY_QUIET) + list(APPEND ARGS QUIET) + endif() + if(MY_REQUIRED) + list(APPEND ARGS REQUIRED ${ENDIF_MY_REQUIRED}) + endif() + if(MY_CONFIG) + list(APPEND ARGS CONFIG ${ENDIF_MY_CONFIG}) + endif() + if(MY_NO_MODULE) + list(APPEND ARGS NO_MODULE ${ENDIF_MY_NO_MODULE}) + endif() + if(MY_GLOBAL) + list(APPEND ARGS GLOBAL ${ENDIF_MY_GLOBAL}) + endif() + if(MY_NO_POLICY_SCOPE) + list(APPEND ARGS NO_POLICY_SCOPE ${ENDIF_MY_NO_POLICY_SCOPE}) + endif() + if(MY_BYPASS_PROVIDER) + list(APPEND ARGS BYPASS_PROVIDER ${ENDIF_MY_BYPASS_PROVIDER}) + endif() + if(MY_NO_DEFAULT_PATH) + list(APPEND ARGS NO_DEFAULT_PATH ${ENDIF_MY_NO_DEFAULT_PATH}) + endif() + if(MY_NO_PACKAGE_ROOT_PATH) + list(APPEND ARGS NO_PACKAGE_ROOT_PATH ${ENDIF_MY_NO_PACKAGE_ROOT_PATH}) + endif() + if(MY_NO_CMAKE_PATH) + list(APPEND ARGS NO_CMAKE_PATH ${ENDIF_MY_NO_CMAKE_PATH}) + endif() + if(MY_NO_CMAKE_ENVIRONMENT_PATH) + list(APPEND ARGS NO_CMAKE_ENVIRONMENT_PATH ${ENDIF_MY_NO_CMAKE_ENVIRONMENT_PATH}) + endif() + if(MY_NO_SYSTEM_ENVIRONMENT_PATH) + list(APPEND ARGS NO_SYSTEM_ENVIRONMENT_PATH ${ENDIF_MY_NO_SYSTEM_ENVIRONMENT_PATH}) + endif() + if(MY_NO_CMAKE_PACKAGE_REGISTRY) + list(APPEND ARGS NO_CMAKE_PACKAGE_REGISTRY ${ENDIF_MY_NO_CMAKE_PACKAGE_REGISTRY}) + endif() + if(MY_NO_CMAKE_BUILDS_PATH) + list(APPEND ARGS NO_CMAKE_BUILDS_PATH ${ENDIF_MY_NO_CMAKE_BUILDS_PATH}) + endif() + if(MY_NO_CMAKE_SYSTEM_PATH) + list(APPEND ARGS NO_CMAKE_SYSTEM_PATH ${ENDIF_MY_NO_CMAKE_SYSTEM_PATH}) + endif() + if(MY_NO_CMAKE_INSTALL_PREFIX) + list(APPEND ARGS NO_CMAKE_INSTALL_PREFIX ${ENDIF_MY_NO_CMAKE_INSTALL_PREFIX}) + endif() + if(MY_NO_CMAKE_SYSTEM_PACKAGE_REGISTRY) + list(APPEND ARGS NO_CMAKE_SYSTEM_PACKAGE_REGISTRY ${ENDIF_MY_NO_CMAKE_SYSTEM_PACKAGE_REGISTRY}) + endif() + if(MY_CMAKE_FIND_ROOT_PATH_BOTH) + list(APPEND ARGS CMAKE_FIND_ROOT_PATH_BOTH ${ENDIF_MY_CMAKE_FIND_ROOT_PATH_BOTH}) + endif() + if(MY_ONLY_CMAKE_FIND_ROOT_PATH) + list(APPEND ARGS ONLY_CMAKE_FIND_ROOT_PATH ${ENDIF_MY_ONLY_CMAKE_FIND_ROOT_PATH}) + endif() + if(MY_NO_CMAKE_FIND_ROOT_PATH) + list(APPEND ARGS NO_CMAKE_FIND_ROOT_PATH ${ENDIF_MY_NO_CMAKE_FIND_ROOT_PATH}) + endif() + + if(MY_COMPONENTS) + list(APPEND ARGS COMPONENTS ${MY_COMPONENTS}) + endif() + if(MY_OPTIONAL_COMPONENTS) + list(APPEND ARGS OPTIONAL_COMPONENTS ${MY_OPTIONAL_COMPONENTS}) + endif() + if(MY_CONFIGS) + list(APPEND ARGS CONFIGS ${MY_CONFIGS}) + endif() + if(MY_HINTS) + list(APPEND ARGS HINTS ${MY_HINTS}) + endif() + if(MY_PATHS) + list(APPEND ARGS PATHS ${MY_PATHS}) + endif() + if(MY_PATH_SUFFIXES) + list(APPEND ARGS PATH_SUFFIXES ${MY_PATH_SUFFIXES}) + endif() + if(MY_TARGETS) + list(APPEND ARGS TARGETS ${MY_TARGETS}) + endif() + if(MY_CONFIGURATIONS) + list(APPEND ARGS CONFIGURATIONS ${MY_CONFIGURATIONS}) + endif() + + if(NOT "${MY_REGISTRY_VIEW}" STREQUAL "") + list(APPEND ARGS REGISTRY_VIEW "${MY_REGISTRY_VIEW}") + endif() + if(NOT "${MY_DESTINATION}" STREQUAL "") + list(APPEND ARGS DESTINATION "${MY_DESTINATION}") + endif() + if(NOT "${MY_RENAME}" STREQUAL "") + list(APPEND ARGS RENAME "${MY_RENAME}") + endif() + + # Call find package + if(TARGET ${MY_PACKAGE_NAME}) + + target_link_libraries(${MY_TARGET_NAME} ${MY_PACKAGE_NAME}) + if(APPLE) # Set the rpath for the test executable to find the library at runtime + set_target_properties(${MY_TARGET_NAME} PROPERTIES + BUILD_WITH_INSTALL_RPATH TRUE + INSTALL_RPATH "@executable_path/../${CMAKE_INSTALL_LIBDIR}") + endif() + + else() + + # Load library if not found + if (NOT ${MY_PACKAGE_NAME}_FOUND) + find_package(${MY_PACKAGE_NAME} ${ARGS}) + endif() + + # Make connection between target and package + if (${MY_PACKAGE_NAME}_FOUND) + target_link_libraries(${MY_TARGET_NAME} ${${MY_PACKAGE_NAME}_LIBRARIES}) + target_include_directories(${MY_TARGET_NAME} PUBLIC ${${MY_PACKAGE_NAME}_INCLUDE_DIRS}) + endif() + endif() + +endmacro() diff --git a/cmake/Modules/FindFFTW3.cmake b/cmake/Modules/FindFFTW3.cmake new file mode 100644 index 0000000..a2117b6 --- /dev/null +++ b/cmake/Modules/FindFFTW3.cmake @@ -0,0 +1,9 @@ +# Include custom standard package +include(FindPackageStandard) + +# Load using standard package finder +find_package_standard( + NAMES fftw3 fftw3f + HEADERS "fftw3.h" + PATHS ${FFTW} ${FFTW3} $ENV{FFTW} $ENV{FFTW3} +) \ No newline at end of file diff --git a/cmake/Modules/FindIPP.cmake b/cmake/Modules/FindIPP.cmake new file mode 100644 index 0000000..7d3f3d1 --- /dev/null +++ b/cmake/Modules/FindIPP.cmake @@ -0,0 +1,9 @@ +# Include custom standard package +include(FindPackageStandard) + +# Load using standard package finder +find_package_standard( + NAMES ipp + HEADERS "ipp.h" + PATHS ${IPP} $ENV{IPP} +) \ No newline at end of file diff --git a/cmake/Modules/FindKFR.cmake b/cmake/Modules/FindKFR.cmake new file mode 100644 index 0000000..0101fb1 --- /dev/null +++ b/cmake/Modules/FindKFR.cmake @@ -0,0 +1,9 @@ +# Include custom standard package +include(FindPackageStandard) + +# Load using standard package finder +find_package_standard( + NAMES kfr_io kfr_capi kfr_dft + HEADERS "kfr/kfr.h" + PATHS ${KFR} $ENV{KFR} +) \ No newline at end of file diff --git a/cmake/Modules/FindMKL.cmake b/cmake/Modules/FindMKL.cmake new file mode 100644 index 0000000..189e851 --- /dev/null +++ b/cmake/Modules/FindMKL.cmake @@ -0,0 +1,9 @@ +# Include custom standard package +include(FindPackageStandard) + +# Load using standard package finder +find_package_standard( + NAMES mkl + HEADERS "mkl.h" + PATHS ${MKL} $ENV{MKL} +) \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..733cb45 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,11 @@ +version: '3.8' + +services: + client: + build: + context: . + dockerfile: Dockerfile + volumes: + - ./share:/opt/kafka/share + environment: + BENCHMARK: "KFR5 KFR6 FFTW3 IPP MKL" \ No newline at end of file diff --git a/fftlibs/CMakeLists.txt b/fftlibs/CMakeLists.txt deleted file mode 100644 index 3849324..0000000 --- a/fftlibs/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ -cmake_minimum_required(VERSION 3.12) - - -add_subdirectory(kfr) -add_subdirectory(ipp) -add_subdirectory(mkl) -add_subdirectory(fftw) diff --git a/fftlibs/fftw/CMakeLists.txt b/fftlibs/fftw/CMakeLists.txt deleted file mode 100644 index 9067509..0000000 --- a/fftlibs/fftw/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -cmake_minimum_required(VERSION 3.12) - -find_package(FFTW3) -find_package(FFTW3f) - -if (FFTW3_FOUND AND FFTW3f_FOUND) - message(STATUS "FFTW3 ${FFTW3_VERSION} is found. Enabling FFTW3") - - add_fft(fftw SOURCES ${CMAKE_CURRENT_LIST_DIR}/fftw.cpp LIBRARIES FFTW3::fftw3 FFTW3::fftw3f) - -else () - message(STATUS "FFTW3 is not found. Disabling FFTW3. Add to CMAKE_PREFIX_PATH") -endif () diff --git a/fftlibs/ipp/CMakeLists.txt b/fftlibs/ipp/CMakeLists.txt deleted file mode 100644 index e05119c..0000000 --- a/fftlibs/ipp/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -cmake_minimum_required(VERSION 3.12) - -find_package(IPP CONFIG) - -if (IPP_FOUND AND IPP_ipps_FOUND) - message(STATUS "IPP ${IPP_VERSION} is found. Enabling IPP") - - add_fft(ipp SOURCES ${CMAKE_CURRENT_LIST_DIR}/ipp.cpp LIBRARIES IPP::ipps) - -else () - message(STATUS "IPP is not found. Disabling IPP. Add /lib/cmake to CMAKE_PREFIX_PATH") -endif () diff --git a/fftlibs/kfr/CMakeLists.txt b/fftlibs/kfr/CMakeLists.txt deleted file mode 100644 index 2f6a3f5..0000000 --- a/fftlibs/kfr/CMakeLists.txt +++ /dev/null @@ -1,34 +0,0 @@ -cmake_minimum_required(VERSION 3.12) - -find_package(KFR CONFIG) -if (KFR_FOUND) - message(STATUS "KFR ${KFR_VERSION} is found. Enabling KFR") - - add_fft( - kfr - SOURCES - ${CMAKE_CURRENT_LIST_DIR}/kfr.cpp - LIBRARIES - kfr - kfr_dft) -else () - - if (KFR_DIR) - set(KFR_ARCH avx2 CACHE STRING "" FORCE) - set(KFR_ENABLE_MULTIARCH FALSE CACHE BOOL "" FORCE) - add_subdirectory(${KFR_DIR} kfr) - - message(STATUS "KFR_DIR is set. Enabling KFR") - - add_fft( - kfr - SOURCES - ${CMAKE_CURRENT_LIST_DIR}/kfr.cpp - LIBRARIES - kfr - kfr_dft) - - else () - message(STATUS "KFR is not found. Disabling KFR Add /lib/cmake to CMAKE_PREFIX_PATH") - endif () -endif () diff --git a/fftlibs/mkl/CMakeLists.txt b/fftlibs/mkl/CMakeLists.txt deleted file mode 100644 index 004052c..0000000 --- a/fftlibs/mkl/CMakeLists.txt +++ /dev/null @@ -1,15 +0,0 @@ -cmake_minimum_required(VERSION 3.12) - -set(MKL_THREADING sequential CACHE STRING "" FORCE) -set(MKL_LINK static CACHE STRING "" FORCE) - -find_package(MKL CONFIG) - -if (MKL_FOUND) - message(STATUS "MKL ${MKL_VERSION} is found. Enabling MKL") - - add_fft(mkl SOURCES ${CMAKE_CURRENT_LIST_DIR}/mkl.cpp LIBRARIES MKL::MKL) - -else () - message(STATUS "MKL is not found. Disabling MKL. Add /lib/cmake to CMAKE_PREFIX_PATH") -endif () diff --git a/share/benchmark/fftdivision.sh b/share/benchmark/fftdivision.sh new file mode 100755 index 0000000..3c4f0f1 --- /dev/null +++ b/share/benchmark/fftdivision.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +if [ $# -ne 3 ]; then + echo "Usage: $0 FFTOUTPUT FFTALGOS FFTSIZE_MAX FFTDIV" + exit 1 +fi + +FFTOUTPUT="$1" +FFTALGOS="$2" +FFTSIZE="$2" +FFTDIV="$3" + +mkdir -p "$FFTOUTPUT" +for FFTALGO in $FFTALGOS; do + + if [ ! -f "$(which fft_benchmark_${FFTALGO})"]; then + echo "Benchmark test for $FFTALGO not found. skip." + fi + + for i in {1..$FFTDIV}; do + + FFTSIZE=$((FFTSIZE_MAX / NDIV * i)) + if [ ! -f "$FFTOUTPUT/${FFTALGO}-${FFTSIZE}.txt" ]; then + echo -ne "Running benchmark for $FFTALGO(N = $FFTSIZE): " + fft_benchmark_${FFTALGO} $FFTSIZE --save $FFTOUTPUT/${FFTALGO}-$FFTSIZE.json + echo "results stored in $FFTOUTPUT/${FFTALGO}-$FFTSIZE.json" + else + echo "File for for $FFTALGO(N = $FFTSIZE) already exists." + fi + + done +done \ No newline at end of file diff --git a/share/benchmark/fftpot.sh b/share/benchmark/fftpot.sh new file mode 100755 index 0000000..388781a --- /dev/null +++ b/share/benchmark/fftpot.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +if [ $# -ne 3 ]; then + echo "Usage: $0 FFTOUTPUT FFTALGOS FFTPOT" + exit 1 +fi + +FFTOUTPUT="$1" +FFTALGOS="$2" +FFTPOT="$2" + +mkdir -p "$FFTOUTPUT" +for FFTALGO in $FFTALGOS; do + + if [ ! -f "$(which fft_benchmark_${FFTALGO})"]; then + echo "Benchmark test for $FFTALGO not found. skip." + fi + + for i in {1..$FFTPOT}; do + + FFTSIZE=$((2 ** i)) + if [ ! -f "$FFTOUTPUT/${FFTALGO}-${FFTSIZE}.txt" ]; then + echo -ne "Running benchmark for $FFTALGO(N = $FFTSIZE): " + fft_benchmark_${FFTALGO} $FFTSIZE --save $FFTOUTPUT/${FFTALGO}-$FFTSIZE.json + echo "results stored in $FFTOUTPUT/${FFTALGO}-$FFTSIZE.json" + else + echo "File for for $FFTALGO(N = $FFTSIZE) already exists." + fi + + done +done \ No newline at end of file diff --git a/share/benchmark/plot.C b/share/benchmark/plot.C new file mode 100644 index 0000000..8a5d641 --- /dev/null +++ b/share/benchmark/plot.C @@ -0,0 +1,7 @@ +#include +#include + +int plot() +{ + return 0; +} \ No newline at end of file diff --git a/plot.py b/share/benchmark/plot.py similarity index 100% rename from plot.py rename to share/benchmark/plot.py diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..c05a2e2 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,51 @@ +cmake_minimum_required(VERSION 3.12) + +set(COMMON_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR}) +set(COMMON_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/fft_benchmark.cpp ${CMAKE_CURRENT_SOURCE_DIR}/benchmark.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/benchmark.cpp ${CMAKE_CURRENT_SOURCE_DIR}/utils.cpp) + +function (add_benchmark NAME) + + cmake_parse_arguments(LIB "" "" "SOURCES;LIBRARIES;INCLUDES" ${ARGN}) + + add_executable(fft_benchmark_${NAME} ${COMMON_SRCS} ${LIB_SOURCES}) + target_link_libraries(fft_benchmark_${NAME} PUBLIC ${LIB_LIBRARIES}) + target_include_directories(fft_benchmark_${NAME} PUBLIC ${COMMON_INCLUDES} ${LIB_INCLUDES}) + + install(FILES ${CMAKE_BINARY_DIR}/fft_benchmark_${NAME} + DESTINATION bin + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE + OPTIONAL + ) + +endfunction () + +if(KFR6) + add_subdirectory(fft/kfr6) +else() + message(STATUS "KFR6 benchmark test disabled.") +endif() + +if(KFR5) + add_subdirectory(fft/kfr5) +else() + message(STATUS "KFR5 benchmark test disabled.") +endif() + +if(IPP) + add_subdirectory(fft/ipp) +else() + message(STATUS "IPP benchmark test disabled.") +endif() + +if(MKL) + add_subdirectory(fft/mkl) +else() + message(STATUS "MKL benchmark test disabled.") +endif() + +if(FFTW) + add_subdirectory(fft/fftw) +else() + message(STATUS "FFTW benchmark test disabled.") +endif() diff --git a/src/fft/fftw/CMakeLists.txt b/src/fft/fftw/CMakeLists.txt new file mode 100644 index 0000000..2a4d3f0 --- /dev/null +++ b/src/fft/fftw/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.12) + +find_package(FFTW3) +if (FFTW3_FOUND) + + add_benchmark(fftw + SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp + LIBRARIES + ${FFTW3_LIBRARIES} + INCLUDES + ${FFTW3_INCLUDE_DIRS} + VERSION + ${FFTW3_VERSION} + ) + +endif () diff --git a/fftlibs/fftw/fftw.cpp b/src/fft/fftw/main.cpp similarity index 100% rename from fftlibs/fftw/fftw.cpp rename to src/fft/fftw/main.cpp diff --git a/src/fft/ipp/CMakeLists.txt b/src/fft/ipp/CMakeLists.txt new file mode 100644 index 0000000..5dbddcc --- /dev/null +++ b/src/fft/ipp/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.12) + +find_package(IPP) +if (IPP_FOUND) + + add_benchmark(ipp + SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp + LIBRARIES + ${IPP_LIBRARIES} + INCLUDES + ${IPP_INCLUDE_DIRS} + VERSION + ${IPP_VERSION} + ) + +endif () diff --git a/fftlibs/ipp/ipp.cpp b/src/fft/ipp/main.cpp similarity index 100% rename from fftlibs/ipp/ipp.cpp rename to src/fft/ipp/main.cpp diff --git a/src/fft/kfr5/CMakeLists.txt b/src/fft/kfr5/CMakeLists.txt new file mode 100644 index 0000000..c46ef92 --- /dev/null +++ b/src/fft/kfr5/CMakeLists.txt @@ -0,0 +1,20 @@ +cmake_minimum_required(VERSION 3.12) + +# set(KFR "${KFR5}") +# find_package(KFR "5...<6" REQUIRED) + +# if (KFR_FOUND) + +# add_benchmark( kfr5 + +# SOURCES + # ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp +# LIBRARIES +# ${KFR_LIBRARIES} +# INCLUDES +# ${KFR_INCLUDE_DIRS} +# VERSION +# ${KFR_VERSION} +# ) + +# endif () diff --git a/fftlibs/kfr/kfr.cpp b/src/fft/kfr5/main.cpp similarity index 100% rename from fftlibs/kfr/kfr.cpp rename to src/fft/kfr5/main.cpp diff --git a/src/fft/kfr6/CMakeLists.txt b/src/fft/kfr6/CMakeLists.txt new file mode 100644 index 0000000..15f4e8f --- /dev/null +++ b/src/fft/kfr6/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 3.12) + +set(KFR "${KFR6}") +find_package(KFR 6 REQUIRED) + +if (KFR_FOUND) + + add_benchmark( kfr6 + SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp + LIBRARIES + ${KFR_LIBRARIES} + INCLUDES + ${KFR_INCLUDE_DIRS} + VERSION + ${KFR_VERSION} + ) + +endif () diff --git a/src/fft/kfr6/main.cpp b/src/fft/kfr6/main.cpp new file mode 100644 index 0000000..32322af --- /dev/null +++ b/src/fft/kfr6/main.cpp @@ -0,0 +1,133 @@ +/** + * FFT bencmarking tool (http://kfrlib.com) + * Copyright (C) 2016-2023 Dan Cazarin + * Benchmark source code is MIT-licensed + * See LICENSE.txt for details + */ + +#include "benchmark.hpp" +#include "kfr/dft/fft.hpp" +#include "kfr/version.hpp" +#include + +namespace kfr +{ +const char* library_version_dft(); +} // namespace kfr + +std::string fft_name() +{ +#if defined(__x86_64__) || defined(_M_X64) + kfr::override_cpu(kfr::cpu_t::avx2); +#endif + return std::string(kfr::library_version_dft()); +} + +template +class fft_implementation : public fft_impl_stub +{ +public: +}; + +// complex +template +class fft_implementation<1, real, true, invert, inplace> : public fft_impl +{ +public: + PICK; + fft_implementation(sizes_t<1> size) + : plan(size[0]), temp(kfr::aligned_allocate(plan.temp_size)) + { + } + void execute(real* out, const real* in) final + { + plan.execute(kfr::ptr_cast>(out), kfr::ptr_cast>(in), temp, + kfr::cbool); + } + ~fft_implementation() { kfr::aligned_deallocate(temp); } + +private: + kfr::dft_plan plan; + unsigned char* temp; +}; + +// real +template +class fft_implementation<1, real, false, invert, inplace> : public fft_impl +{ +public: + PICK; + fft_implementation(sizes_t<1> size) + : plan(size[0]), temp(kfr::aligned_allocate(plan.temp_size)) + { + } + void execute(real* out, const real* in) final + { + if constexpr (invert) + plan.execute(out, kfr::ptr_cast>(in), temp, kfr::cbool); + else + plan.execute(kfr::ptr_cast>(out), in, temp, kfr::cbool); + } + ~fft_implementation() { kfr::aligned_deallocate(temp); } + +private: + kfr::dft_plan_real plan; + unsigned char* temp; +}; + +// complex, multidimensional +template +class fft_implementation : public fft_impl +{ +public: + PICK; + fft_implementation(sizes_t sizes) + : plan(kfr::shape::from_std_array(sizes)), + temp(kfr::aligned_allocate(plan.temp_size)) + { + } + void execute(real* out, const real* in) final + { + plan.execute(kfr::ptr_cast>(out), kfr::ptr_cast>(in), temp, + kfr::cbool); + } + ~fft_implementation() { kfr::aligned_deallocate(temp); } + +private: + kfr::dft_plan_md plan; + unsigned char* temp; +}; + +// real, multidimensional +template +class fft_implementation : public fft_impl +{ +public: + PICK; + fft_implementation(sizes_t sizes) + : plan(kfr::shape::from_std_array(sizes), true), + temp(kfr::aligned_allocate(plan.temp_size)) + { + } + void execute(real* out, const real* in) final + { + if constexpr (invert) + plan.execute(out, kfr::ptr_cast>(in), temp, kfr::cbool); + else + plan.execute(kfr::ptr_cast>(out), in, temp, kfr::cbool); + } + ~fft_implementation() { kfr::aligned_deallocate(temp); } + +private: + kfr::dft_plan_md_real plan; + unsigned char* temp; +}; + +template +fft_impl_ptr fft_create(const std::vector& size, bool is_complex, bool invert, bool inplace) +{ + return fft_create_for(size, is_complex, invert, inplace); +} + +template std::unique_ptr> fft_create(const std::vector&, bool, bool, bool); +template std::unique_ptr> fft_create(const std::vector&, bool, bool, bool); diff --git a/src/fft/mkl/CMakeLists.txt b/src/fft/mkl/CMakeLists.txt new file mode 100644 index 0000000..140e4bf --- /dev/null +++ b/src/fft/mkl/CMakeLists.txt @@ -0,0 +1,21 @@ +cmake_minimum_required(VERSION 3.12) + +set(MKL_THREADING sequential CACHE STRING "" FORCE) +set(MKL_LINK static CACHE STRING "" FORCE) + +find_package(MKL) + +if (MKL_FOUND) + + add_benchmark(mkl + SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp + LIBRARIES + ${MKL_LIBRARIES} + INCLUDES + ${MKL_INCLUDE_DIRS} + VERSION + ${MKL_VERSION} + ) + +endif () diff --git a/fftlibs/mkl/mkl.cpp b/src/fft/mkl/main.cpp similarity index 100% rename from fftlibs/mkl/mkl.cpp rename to src/fft/mkl/main.cpp