Skip to content

Commit f41ae29

Browse files
committed
cmake/ restore
1 parent a8c3a8b commit f41ae29

7 files changed

+340
-0
lines changed

cmake/CheckAVX.cpp

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#include <array>
2+
#include <intrin.h>
3+
#include <iostream>
4+
5+
bool is_sse2_supported() {
6+
std::array<int, 4> cpui;
7+
__cpuid(cpui.data(), 1);
8+
return (cpui[3] & (1 << 26)) != 0;
9+
}
10+
11+
bool is_avx_supported() {
12+
std::array<int, 4> cpui;
13+
__cpuid(cpui.data(), 1);
14+
bool osUsesXSAVE_XRSTORE = (cpui[2] & (1 << 27)) != 0;
15+
bool cpuAVXSupport = (cpui[2] & (1 << 28)) != 0;
16+
if (osUsesXSAVE_XRSTORE && cpuAVXSupport) {
17+
unsigned long long xcrFeatureMask = _xgetbv(_XCR_XFEATURE_ENABLED_MASK);
18+
return (xcrFeatureMask & 0x6) == 0x6;
19+
}
20+
return false;
21+
}
22+
23+
bool is_avx2_supported() {
24+
std::array<int, 4> cpui;
25+
__cpuid(cpui.data(), 7);
26+
return (cpui[1] & (1 << 5)) != 0;
27+
}
28+
29+
bool is_avx512_supported() {
30+
std::array<int, 4> cpui;
31+
__cpuidex(cpui.data(), 7, 0);
32+
return (cpui[1] & (1 << 16)) != 0;
33+
}
34+
35+
int main() {
36+
if (is_avx512_supported()) {
37+
std::cout << "AVX512";
38+
} else if (is_avx2_supported()) {
39+
std::cout << "AVX2";
40+
} else if (is_avx_supported()) {
41+
std::cout << "AVX";
42+
} else if (is_sse2_supported()) {
43+
std::cout << "SSE2";
44+
} else {
45+
std::cout << "NONE";
46+
}
47+
return 0;
48+
}

cmake/setupCPM.cmake

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# USING CPM TO HANDLE DEPENDENCIES
2+
if(CPM_SOURCE_CACHE)
3+
set(CPM_DOWNLOAD_LOCATION
4+
"${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
5+
elseif(DEFINED ENV{CPM_SOURCE_CACHE})
6+
set(CPM_DOWNLOAD_LOCATION
7+
"$ENV{CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
8+
else()
9+
set(CPM_DOWNLOAD_LOCATION
10+
"${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
11+
endif()
12+
13+
if(NOT (EXISTS ${CPM_DOWNLOAD_LOCATION}))
14+
message(STATUS "Downloading CPM.cmake to ${CPM_DOWNLOAD_LOCATION}")
15+
file(
16+
DOWNLOAD
17+
https://github.com/cpm-cmake/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake
18+
${CPM_DOWNLOAD_LOCATION})
19+
endif()
20+
21+
include(${CPM_DOWNLOAD_LOCATION})

cmake/setupDUCC.cmake

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
cpmaddpackage(
2+
NAME
3+
ducc0
4+
GIT_REPOSITORY
5+
https://gitlab.mpcdf.mpg.de/mtr/ducc.git
6+
GIT_TAG
7+
${DUCC0_VERSION}
8+
DOWNLOAD_ONLY
9+
YES)
10+
11+
if(ducc0_ADDED)
12+
add_library(
13+
ducc0 STATIC
14+
${ducc0_SOURCE_DIR}/src/ducc0/infra/string_utils.cc
15+
${ducc0_SOURCE_DIR}/src/ducc0/infra/threading.cc
16+
${ducc0_SOURCE_DIR}/src/ducc0/infra/mav.cc
17+
${ducc0_SOURCE_DIR}/src/ducc0/math/gridding_kernel.cc
18+
${ducc0_SOURCE_DIR}/src/ducc0/math/gl_integrator.cc)
19+
target_include_directories(ducc0 PUBLIC ${ducc0_SOURCE_DIR}/src/)
20+
target_compile_options(
21+
ducc0 PRIVATE $<$<CONFIG:Release,RelWithDebInfo>:${FINUFFT_ARCH_FLAGS}>)
22+
target_compile_options(
23+
ducc0 PRIVATE $<$<CONFIG:Release>:${FINUFFT_CXX_FLAGS_RELEASE}>)
24+
target_compile_options(
25+
ducc0
26+
PRIVATE $<$<CONFIG:RelWithDebInfo>:${FINUFFT_CXX_FLAGS_RELWITHDEBINFO}>)
27+
target_compile_features(ducc0 PRIVATE cxx_std_17)
28+
# private because we do not want to propagate this requirement
29+
set_target_properties(
30+
ducc0
31+
PROPERTIES MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>"
32+
POSITION_INDEPENDENT_CODE ${FINUFFT_SHARED_LINKING})
33+
check_cxx_compiler_flag(-ffast-math HAS_FAST_MATH)
34+
if(HAS_FAST_MATH)
35+
target_compile_options(ducc0 PRIVATE -ffast-math)
36+
endif()
37+
check_cxx_compiler_flag(/fp:fast HAS_FP_FAST)
38+
if(HAS_FP_FAST)
39+
target_compile_options(ducc0 PRIVATE /fp:fast)
40+
endif()
41+
if(NOT OpenMP_CXX_FOUND)
42+
find_package(Threads REQUIRED)
43+
target_link_libraries(ducc0 PRIVATE Threads::Threads)
44+
endif()
45+
enable_asan(ducc0)
46+
endif()

cmake/setupFFTW.cmake

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
cpmaddpackage(
2+
NAME
3+
findfftw
4+
GIT_REPOSITORY
5+
"https://github.com/egpbos/findFFTW.git"
6+
GIT_TAG
7+
"master"
8+
EXCLUDE_FROM_ALL
9+
YES
10+
GIT_SHALLOW
11+
YES)
12+
13+
list(APPEND CMAKE_MODULE_PATH "${findfftw_SOURCE_DIR}")
14+
15+
if(FINUFFT_FFTW_LIBRARIES STREQUAL DEFAULT OR FINUFFT_FFTW_LIBRARIES STREQUAL
16+
DOWNLOAD)
17+
find_package(FFTW)
18+
if((NOT FFTW_FOUND) OR (FINUFFT_FFTW_LIBRARIES STREQUAL DOWNLOAD))
19+
if(FINUFFT_FFTW_SUFFIX STREQUAL THREADS)
20+
set(FINUFFT_USE_THREADS ON)
21+
else()
22+
set(FINUFFT_USE_THREADS OFF)
23+
endif()
24+
cpmaddpackage(
25+
NAME
26+
fftw3
27+
OPTIONS
28+
"ENABLE_SSE2 ON"
29+
"ENABLE_AVX ON"
30+
"ENABLE_AVX2 ON"
31+
"BUILD_TESTS OFF"
32+
"BUILD_SHARED_LIBS OFF"
33+
"ENABLE_THREADS ${FINUFFT_USE_THREADS}"
34+
"ENABLE_OPENMP ${FINUFFT_USE_OPENMP}"
35+
URL
36+
"http://www.fftw.org/fftw-${FFTW_VERSION}.tar.gz"
37+
URL_HASH
38+
"MD5=8ccbf6a5ea78a16dbc3e1306e234cc5c"
39+
EXCLUDE_FROM_ALL
40+
YES
41+
GIT_SHALLOW
42+
YES)
43+
44+
cpmaddpackage(
45+
NAME
46+
fftw3f
47+
OPTIONS
48+
"ENABLE_SSE2 ON"
49+
"ENABLE_AVX ON"
50+
"ENABLE_AVX2 ON"
51+
"ENABLE_FLOAT ON"
52+
"BUILD_TESTS OFF"
53+
"BUILD_SHARED_LIBS OFF"
54+
"ENABLE_THREADS ${FINUFFT_USE_THREADS}"
55+
"ENABLE_OPENMP ${FINUFFT_USE_OPENMP}"
56+
URL
57+
"http://www.fftw.org/fftw-${FFTW_VERSION}.tar.gz"
58+
URL_HASH
59+
"MD5=8ccbf6a5ea78a16dbc3e1306e234cc5c"
60+
EXCLUDE_FROM_ALL
61+
YES
62+
GIT_SHALLOW
63+
YES)
64+
set(FINUFFT_FFTW_LIBRARIES fftw3 fftw3f)
65+
if(FINUFFT_USE_THREADS)
66+
list(APPEND FINUFFT_FFTW_LIBRARIES fftw3_threads fftw3f_threads)
67+
elseif(FINUFFT_USE_OPENMP)
68+
list(APPEND FINUFFT_FFTW_LIBRARIES fftw3_omp fftw3f_omp)
69+
endif()
70+
71+
foreach(element IN LISTS FINUFFT_FFTW_LIBRARIES)
72+
set_target_properties(
73+
${element}
74+
PROPERTIES MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>"
75+
POSITION_INDEPENDENT_CODE ${FINUFFT_SHARED_LINKING})
76+
endforeach()
77+
78+
target_include_directories(
79+
fftw3 PUBLIC $<BUILD_INTERFACE:${fftw3_SOURCE_DIR}/api>)
80+
81+
else()
82+
set(FINUFFT_FFTW_LIBRARIES
83+
"FFTW::Float" "FFTW::Double" "FFTW::Float${FINUFFT_FFTW_SUFFIX}"
84+
"FFTW::Double${FINUFFT_FFTW_SUFFIX}")
85+
endif()
86+
endif()

cmake/setupSphinx.cmake

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
cpmaddpackage(
2+
NAME
3+
sphinx_cmake
4+
GIT_REPOSITORY
5+
https://github.com/k0ekk0ek/cmake-sphinx.git
6+
GIT_TAG
7+
e13c40a
8+
DOWNLOAD_ONLY
9+
YES)
10+
11+
list(APPEND CMAKE_MODULE_PATH ${sphinx_cmake_SOURCE_DIR}/cmake/Modules)
12+
13+
# requires pip install sphinx texext
14+
find_package(Sphinx)
15+
if(SPHINX_FOUND)
16+
message(STATUS "Sphinx found")
17+
sphinx_add_docs(finufft_sphinx BUILDER html SOURCE_DIRECTORY
18+
${FINUFFT_SOURCE_DIR}/docs)
19+
else()
20+
message(STATUS "Sphinx not found docs will not be generated")
21+
endif()

cmake/setupXSIMD.cmake

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
cpmaddpackage(
2+
NAME
3+
xtl
4+
GIT_REPOSITORY
5+
"https://github.com/xtensor-stack/xtl.git"
6+
GIT_TAG
7+
${XTL_VERSION}
8+
EXCLUDE_FROM_ALL
9+
YES
10+
GIT_SHALLOW
11+
YES
12+
OPTIONS
13+
"XTL_DISABLE_EXCEPTIONS YES")
14+
15+
cpmaddpackage(
16+
NAME
17+
xsimd
18+
GIT_REPOSITORY
19+
"https://github.com/xtensor-stack/xsimd.git"
20+
GIT_TAG
21+
${XSIMD_VERSION}
22+
EXCLUDE_FROM_ALL
23+
YES
24+
GIT_SHALLOW
25+
YES
26+
OPTIONS
27+
"XSIMD_SKIP_INSTALL YES"
28+
"XSIMD_ENABLE_XTL_COMPLEX YES")

cmake/utils.cmake

+90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
include(CheckCXXCompilerFlag)
2+
# Define the function
3+
function(filter_supported_compiler_flags input_flags_var output_flags_var)
4+
# Create an empty list to store supported flags
5+
set(supported_flags)
6+
7+
# Iterate over each flag in the input list
8+
foreach(flag ${${input_flags_var}})
9+
string(REPLACE "=" "_" flag_var ${flag}) # Convert flag to a valid variable
10+
# name
11+
string(REPLACE "-" "" flag_var ${flag_var}) # Remove '-' for the variable
12+
# name
13+
14+
# Append the test linker flag to the existing flags
15+
list(APPEND CMAKE_EXE_LINKER_FLAGS ${flag})
16+
check_cxx_compiler_flag(${flag} ${flag_var})
17+
if(${flag_var})
18+
# If supported, append the flag to the list of supported flags
19+
list(APPEND supported_flags ${flag})
20+
else()
21+
message(STATUS "Flag ${flag} is not supported")
22+
endif()
23+
unset(${flag_var} CACHE)
24+
# remove last flag from linker flags
25+
list(REMOVE_ITEM CMAKE_EXE_LINKER_FLAGS ${flag})
26+
endforeach()
27+
# Set the output variable to the list of supported flags
28+
set(${output_flags_var}
29+
${supported_flags}
30+
PARENT_SCOPE)
31+
endfunction()
32+
33+
function(check_arch_support)
34+
message(STATUS "Checking for AVX, AVX512 and SSE support")
35+
try_run(
36+
RUN_RESULT_VAR COMPILE_RESULT_VAR ${CMAKE_BINARY_DIR}
37+
${CMAKE_CURRENT_SOURCE_DIR}/cmake/CheckAVX.cpp
38+
COMPILE_OUTPUT_VARIABLE COMPILE_OUTPUT
39+
RUN_OUTPUT_VARIABLE RUN_OUTPUT)
40+
if(RUN_OUTPUT MATCHES "AVX512")
41+
set(FINUFFT_ARCH_FLAGS
42+
"/arch:AVX512"
43+
CACHE STRING "" FORCE)
44+
elseif(RUN_OUTPUT MATCHES "AVX2")
45+
set(FINUFFT_ARCH_FLAGS
46+
"/arch:AVX2"
47+
CACHE STRING "" FORCE)
48+
elseif(RUN_OUTPUT MATCHES "AVX")
49+
set(FINUFFT_ARCH_FLAGS
50+
"/arch:AVX"
51+
CACHE STRING "" FORCE)
52+
elseif(RUN_OUTPUT MATCHES "SSE")
53+
set(FINUFFT_ARCH_FLAGS
54+
"/arch:SSE"
55+
CACHE STRING "" FORCE)
56+
else()
57+
set(FINUFFT_ARCH_FLAGS
58+
""
59+
CACHE STRING "" FORCE)
60+
endif()
61+
message(STATUS "CPU supports: ${RUN_OUTPUT}")
62+
message(STATUS "Using MSVC flags: ${FINUFFT_ARCH_FLAGS}")
63+
endfunction()
64+
65+
function(copy_dll source_target destination_target)
66+
if(NOT WIN32)
67+
return()
68+
endif()
69+
# Get the binary directory of the destination target
70+
get_target_property(DESTINATION_DIR ${destination_target} BINARY_DIR)
71+
set(DESTINATION_FILE ${DESTINATION_DIR}/$<TARGET_FILE_NAME:${source_target}>)
72+
if(NOT EXISTS ${DESTINATION_FILE})
73+
message(
74+
STATUS
75+
"Copying ${source_target} to ${DESTINATION_DIR} directory for ${destination_target}"
76+
)
77+
# Define the custom command to copy the source target to the destination
78+
# directory
79+
add_custom_command(
80+
TARGET ${destination_target}
81+
POST_BUILD
82+
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${source_target}>
83+
${DESTINATION_FILE}
84+
COMMENT "Copying ${source_target} to ${destination_target} directory")
85+
endif()
86+
# Unset the variables to leave a clean state
87+
unset(DESTINATION_DIR)
88+
unset(SOURCE_FILE)
89+
unset(DESTINATION_FILE)
90+
endfunction()

0 commit comments

Comments
 (0)