1- cmake_minimum_required (VERSION 3.18 )
1+ cmake_minimum_required (VERSION 3.21 )
22# If scikit-build-core sets SKBUILD_PROJECT_NAME / VERSION, prefer those.
33if (DEFINED SKBUILD_PROJECT_NAME)
44 project (${SKBUILD_PROJECT_NAME} LANGUAGES C )
77endif ()
88
99# Detect and enable CUDA if present
10- if (CMAKE_CUDA_COMPILER)
10+ find_package (CUDAToolkit )
11+ if (CUDAToolkit_FOUND)
1112 enable_language (CUDA )
12- set (CMAKE_CUDA_STANDARD 11)
1313else ()
1414 message (WARNING "CUDA not found. Building without CUDA support." )
1515endif ()
@@ -19,10 +19,49 @@ if(NOT CMAKE_BUILD_TYPE)
1919 set (CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE )
2020endif ()
2121
22- # Find OpenMP quietly (optional)
23- find_package (OpenMP QUIET )
22+ # --- OpenMP Configuration ---
23+ add_library (Deepwave::OpenMP INTERFACE )
24+ set (OPENMP_CONFIGURED FALSE )
25+
26+ if (WIN32 )
27+ # On Windows, prioritize the Intel OpenMP library to avoid conflicts with PyTorch.
28+ set (INTEL_OMP_LIB_PATH "${CMAKE_CURRENT_SOURCE_DIR } /src/deepwave/libiomp5md.lib" )
29+ if (EXISTS "${INTEL_OMP_LIB_PATH} " )
30+ message (STATUS "Found Intel OpenMP library for Windows build." )
31+ # Use /openmp:experimental, link the Intel lib, and exclude the default MSVC lib.
32+ target_compile_options (Deepwave::OpenMP INTERFACE /openmp:experimental )
33+ target_link_libraries (Deepwave::OpenMP INTERFACE "${INTEL_OMP_LIB_PATH} " )
34+ target_link_options (Deepwave::OpenMP INTERFACE "/nodefaultlib:vcomp" )
35+ set (OPENMP_CONFIGURED TRUE )
36+ else ()
37+ # Fallback for users building from source without the Intel lib.
38+ # Use standard MSVC OpenMP, but with the user-required experimental flag.
39+ message (STATUS "Intel OpenMP library not found. Falling back to standard MSVC OpenMP." )
40+ find_package (OpenMP QUIET )
41+ if (OpenMP_C_FOUND)
42+ target_link_libraries (Deepwave::OpenMP INTERFACE OpenMP::OpenMP_C )
43+ target_compile_options (Deepwave::OpenMP INTERFACE /openmp:experimental )
44+ set (OPENMP_CONFIGURED TRUE )
45+ endif ()
46+ endif ()
47+ else ()
48+ # For non-Windows, use the standard find_package
49+ find_package (OpenMP QUIET )
50+ if (OpenMP_C_FOUND)
51+ target_link_libraries (Deepwave::OpenMP INTERFACE OpenMP::OpenMP_C )
52+ set (OPENMP_CONFIGURED TRUE )
53+ endif ()
54+ endif ()
55+
56+ if (OPENMP_CONFIGURED)
57+ message (STATUS "OpenMP enabled." )
58+ else ()
59+ message (STATUS "OpenMP not found or not configured." )
60+ endif ()
61+ # --- End OpenMP Configuration ---
62+
2463
25- # AVX2 test: use CMAKE_REQUIRED_FLAGS (safer than clobbering CMAKE_C_FLAGS)
64+ # AVX2 test
2665include (CheckCSourceCompiles )
2766set (AVX2_TEST_CODE "
2867 #include <immintrin.h>
@@ -31,16 +70,13 @@ set(AVX2_TEST_CODE "
3170 return 0;
3271 }" )
3372
34- # Prepare flags for the test based on compiler
3573if (CMAKE_C_COMPILER_ID MATCHES "GNU|Clang|Intel" )
3674 set (CMAKE_REQUIRED_FLAGS "-mavx2" )
37- elseif (CMAKE_C_COMPILER_ID MATCHES "MSVC" )
75+ elif (CMAKE_C_COMPILER_ID MATCHES "MSVC" )
3876 set (CMAKE_REQUIRED_FLAGS "/arch:AVX2" )
3977endif ()
4078
4179check_c_source_compiles ("${AVX2_TEST_CODE} " HAVE_AVX2 )
42-
43- # Clear any test-only flags
4480unset (CMAKE_REQUIRED_FLAGS)
4581
4682if (HAVE_AVX2)
@@ -49,20 +85,24 @@ else()
4985 message (STATUS "AVX2 is not supported." )
5086endif ()
5187
52- # Compiler optimization flags — prefer target/compile-options but keep simple here
88+ # Compiler optimization flags
89+ add_compile_options (
90+ $<$<CONFIG :Release >:$<$<C_COMPILER_ID :GNU ,Clang ,Intel >:-Ofast >>
91+ $<$<CONFIG :Release >:$<$<C_COMPILER_ID :MSVC >:/O2 /fp :fast >>
92+ $<$<BOOL :${HAVE_AVX2} >:$<$<C_COMPILER_ID :GNU ,Clang ,Intel >:-mavx2 >>
93+ $<$<BOOL :${HAVE_AVX2} >:$<$<C_COMPILER_ID :MSVC >:/arch :AVX2 >>
94+ )
95+
96+ # Add warning flags for GCC/Clang
97+ add_compile_options (
98+ $<$<C_COMPILER_ID :GNU ,Clang >:-Wall >
99+ $<$<C_COMPILER_ID :GNU ,Clang >:-Wextra >
100+ $<$<C_COMPILER_ID :GNU ,Clang >:-pedantic >
101+ )
102+
53103if (CMAKE_BUILD_TYPE MATCHES Release)
54104 if (CMAKE_C_COMPILER_ID MATCHES "GNU|Clang|Intel" )
55- add_compile_options (-Ofast )
56- if (HAVE_AVX2)
57- add_compile_options (-mavx2 )
58- endif ()
59- # Ensure -Ofast in link step
60105 set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS } -Ofast" )
61- elseif (CMAKE_C_COMPILER_ID MATCHES "MSVC" )
62- add_compile_options (/O2 /fp:fast )
63- if (HAVE_AVX2)
64- add_compile_options (/arch:AVX2 )
65- endif ()
66106 endif ()
67107endif ()
68108
@@ -72,39 +112,45 @@ set(SCALAR_ACCURACIES 2 4 6 8)
72112set (ELASTIC_ACCURACIES 2 4)
73113set (DTYPES float double)
74114
75- # CPU object libraries (scalar and scalar_born)
115+ # --- CPU object libraries ---
116+ # All CPU object libraries will link to our unified OpenMP target if it was configured.
117+ set (CPU_TARGETS)
118+
119+ # scalar and scalar_born
76120foreach (ACCURACY ${SCALAR_ACCURACIES} )
77121 foreach (DTYPE ${DTYPES} )
78122 add_library (scalar_${ACCURACY}_${DTYPE}_obj OBJECT src/deepwave/scalar.c )
79123 target_compile_definitions (scalar_${ACCURACY}_${DTYPE}_obj PRIVATE DW_ACCURACY=${ACCURACY} DW_DTYPE=${DTYPE} DW_DEVICE=cpu )
80124 list (APPEND DEEPWAVE_OBJECTS $<TARGET_OBJECTS :scalar_ ${ACCURACY} _ ${DTYPE} _obj >)
125+ list (APPEND CPU_TARGETS scalar_${ACCURACY} _${DTYPE} _obj)
81126
82127 add_library (scalar_born_${ACCURACY}_${DTYPE}_obj OBJECT src/deepwave/scalar_born.c )
83128 target_compile_definitions (scalar_born_${ACCURACY}_${DTYPE}_obj PRIVATE DW_ACCURACY=${ACCURACY} DW_DTYPE=${DTYPE} DW_DEVICE=cpu )
84129 list (APPEND DEEPWAVE_OBJECTS $<TARGET_OBJECTS :scalar_born_ ${ACCURACY} _ ${DTYPE} _obj >)
85-
86- if (OpenMP_C_FOUND)
87- target_link_libraries (scalar_${ACCURACY}_${DTYPE}_obj PRIVATE OpenMP::OpenMP_C )
88- target_link_libraries (scalar_born_${ACCURACY}_${DTYPE}_obj PRIVATE OpenMP::OpenMP_C )
89- endif ()
130+ list (APPEND CPU_TARGETS scalar_born_${ACCURACY} _${DTYPE} _obj)
90131 endforeach ()
91132endforeach ()
92133
93- # CPU object libraries ( elastic)
134+ # elastic
94135foreach (ACCURACY ${ELASTIC_ACCURACIES} )
95136 foreach (DTYPE ${DTYPES} )
96137 add_library (elastic_${ACCURACY}_${DTYPE}_obj OBJECT src/deepwave/elastic.c )
97138 target_compile_definitions (elastic_${ACCURACY}_${DTYPE}_obj PRIVATE DW_ACCURACY=${ACCURACY} DW_DTYPE=${DTYPE} DW_DEVICE=cpu )
98139 list (APPEND DEEPWAVE_OBJECTS $<TARGET_OBJECTS :elastic_ ${ACCURACY} _ ${DTYPE} _obj >)
99-
100- if (OpenMP_C_FOUND)
101- target_link_libraries (elastic_${ACCURACY}_${DTYPE}_obj PRIVATE OpenMP::OpenMP_C )
102- endif ()
140+ list (APPEND CPU_TARGETS elastic_${ACCURACY} _${DTYPE} _obj)
103141 endforeach ()
104142endforeach ()
105143
106- # CUDA object libraries (if CUDA available)
107- if (CMAKE_CUDA_COMPILER)
144+ if (OPENMP_CONFIGURED)
145+ # Link all CPU targets to our unified OpenMP interface library in one go.
146+ target_link_libraries (${CPU_TARGETS} PRIVATE Deepwave::OpenMP )
147+ endif ()
148+ # --- End CPU object libraries ---
149+
150+
151+ # --- CUDA object libraries ---
152+ if (CUDAToolkit_FOUND)
153+ # scalar and scalar_born
108154 foreach (ACCURACY ${SCALAR_ACCURACIES} )
109155 foreach (DTYPE ${DTYPES} )
110156 add_library (scalar_cu_${ACCURACY}_${DTYPE}_obj OBJECT src/deepwave/scalar.cu )
@@ -116,29 +162,32 @@ if(CMAKE_CUDA_COMPILER)
116162 list (APPEND DEEPWAVE_OBJECTS $<TARGET_OBJECTS :scalar_born_cu_ ${ACCURACY} _ ${DTYPE} _obj >)
117163
118164 if (CMAKE_BUILD_TYPE MATCHES Release)
119- target_compile_options (scalar_cu_${ACCURACY}_${DTYPE}_obj PRIVATE --use_fast_math -O3 )
120- target_compile_options (scalar_born_cu_${ACCURACY}_${DTYPE}_obj PRIVATE --use_fast_math -O3 )
165+ target_compile_options (scalar_cu_${ACCURACY}_${DTYPE}_obj PRIVATE --use_fast_math -O3 --restrict )
166+ target_compile_options (scalar_born_cu_${ACCURACY}_${DTYPE}_obj PRIVATE --use_fast_math -O3 --restrict )
121167 set_target_properties (scalar_cu_${ACCURACY} _${DTYPE} _obj PROPERTIES CUDA_ARCHITECTURES all-major)
122168 set_target_properties (scalar_born_cu_${ACCURACY} _${DTYPE} _obj PROPERTIES CUDA_ARCHITECTURES all-major)
123169 endif ()
124170 endforeach ()
125171 endforeach ()
126172
173+ # elastic
127174 foreach (ACCURACY ${ELASTIC_ACCURACIES} )
128175 foreach (DTYPE ${DTYPES} )
129176 add_library (elastic_cu_${ACCURACY}_${DTYPE}_obj OBJECT src/deepwave/elastic.cu )
130177 target_compile_definitions (elastic_cu_${ACCURACY}_${DTYPE}_obj PRIVATE DW_ACCURACY=${ACCURACY} DW_DTYPE=${DTYPE} DW_DEVICE=cuda )
131178 list (APPEND DEEPWAVE_OBJECTS $<TARGET_OBJECTS :elastic_cu_ ${ACCURACY} _ ${DTYPE} _obj >)
132179
133180 if (CMAKE_BUILD_TYPE MATCHES Release)
134- target_compile_options (elastic_cu_${ACCURACY}_${DTYPE}_obj PRIVATE --use_fast_math -O3 )
181+ target_compile_options (elastic_cu_${ACCURACY}_${DTYPE}_obj PRIVATE --use_fast_math -O3 --restrict )
135182 set_target_properties (elastic_cu_${ACCURACY} _${DTYPE} _obj PROPERTIES CUDA_ARCHITECTURES all-major)
136183 endif ()
137184 endforeach ()
138185 endforeach ()
139186endif ()
187+ # --- End CUDA object libraries ---
188+
140189
141- # Build shared lib from object files (this is what Python/ctypes will load)
190+ # --- Final Library Build ---
142191add_library (deepwave_C SHARED ${DEEPWAVE_OBJECTS} )
143192set_target_properties (deepwave_C PROPERTIES
144193 C_VISIBILITY_PRESET default
@@ -147,35 +196,17 @@ set_target_properties(deepwave_C PROPERTIES
147196 WINDOWS_EXPORT_ALL_SYMBOLS ON
148197)
149198
150- # Link libs
151- if (CMAKE_CUDA_COMPILER)
152- find_package (CUDAToolkit REQUIRED ) # prefer CUDA::cudart via the toolkit package
199+ if (CUDAToolkit_FOUND)
153200 target_link_libraries (deepwave_C PRIVATE CUDA::cudart )
154201endif ()
155202
156- if (OpenMP_C_FOUND)
157- target_link_libraries (deepwave_C PRIVATE OpenMP::OpenMP_C )
158- endif ()
159-
160203if (HAVE_AVX2)
161204 target_compile_definitions (deepwave_C PRIVATE HAVE_AVX2 )
162205endif ()
163206
164207# Install
165- # If scikit-build-core drives the build, install into the package name — scikit-build-core
166- # will map that to platlib/site-packages for wheels/editable redirects.
167- if (DEFINED SKBUILD)
168- message (STATUS "scikit-build-core detected; installing into package '${SKBUILD_PROJECT_NAME} '." )
169- install (TARGETS deepwave_C
170- LIBRARY DESTINATION ${SKBUILD_PROJECT_NAME}
171- ARCHIVE DESTINATION ${SKBUILD_PROJECT_NAME}
172- RUNTIME DESTINATION ${SKBUILD_PROJECT_NAME}
173- )
174- else ()
175- message (WARNING "scikit-build-core not detected; using fallback install directories under CMAKE_INSTALL_PREFIX." )
176- install (TARGETS deepwave_C
177- LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX } /lib
178- ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX } /lib
179- RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX } /bin
180- )
181- endif ()
208+ install (TARGETS deepwave_C
209+ LIBRARY DESTINATION deepwave
210+ ARCHIVE DESTINATION deepwave
211+ RUNTIME DESTINATION deepwave
212+ )
0 commit comments