Skip to content

Commit bb03777

Browse files
committed
Continue working on cibuildwheel to try to replicate previous setup
1 parent 905ae47 commit bb03777

4 files changed

Lines changed: 178 additions & 92 deletions

File tree

.github/workflows/build.yml

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,41 +8,45 @@ jobs:
88
runs-on: ${{ matrix.os }}
99
strategy:
1010
matrix:
11-
os: [ubuntu-latest, windows-latest, macos-latest]
11+
os: [ubuntu-latest, windows-2022, macos-13, macos-14]
1212

1313
steps:
14-
- uses: actions/checkout@v3
14+
- uses: actions/checkout@v5
1515

16-
- name: Set up QEMU
17-
if: runner.os == 'Linux'
18-
uses: docker/setup-qemu-action@v2
16+
- name: Set up CUDA for Windows
17+
if: runner.os == 'Windows'
18+
uses: nvidia-github-actions/setup-cuda@v2
1919
with:
20-
platforms: all
20+
cuda-version: '12.4.0'
2121

2222
- name: Build wheels
23-
uses: pypa/cibuildwheel@v2.12.0
23+
uses: pypa/cibuildwheel@v3.1.4
2424
env:
25-
CIBW_ARCHS_LINUX: "x86_64 aarch64"
26-
CIBW_ARCHS_MACOS: "x86_64 arm64"
27-
CIBW_BUILD: "py3*"
28-
CIBW_SKIP: "pp* *musllinux*"
29-
CIBW_MANYLINUX_X86_64_IMAGE: manylinux2014
30-
CIBW_MANYLINUX_AARCH64_IMAGE: manylinux2014
31-
CIBW_BUILD_VERBOSITY: 1
32-
33-
- uses: actions/upload-artifact@v3
25+
# For Linux, install CUDA in the container. Note that manylinux2014
26+
# is specified in pyproject.toml
27+
CIBW_BEFORE_ALL_LINUX: |
28+
yum-config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/cuda-rhel7.repo
29+
yum install -y cuda-nvcc-11-8 cuda-cudart-devel-11-8
30+
export PATH=$PATH:/usr/local/cuda-11.8/bin
31+
export CUDA_HOME=/usr/local/cuda-11.8
32+
export CUDA_ROOT=/usr/local/cuda-11.8
33+
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-11.8/lib64
34+
# For Windows, help CMake find the CUDA toolkit
35+
CUDAToolkit_ROOT: ${{ env.CUDA_PATH }}
36+
37+
- uses: actions/upload-artifact@v4
3438
with:
3539
path: ./wheelhouse/*.whl
3640

3741
build_sdist:
3842
name: Build source distribution
3943
runs-on: ubuntu-latest
4044
steps:
41-
- uses: actions/checkout@v3
45+
- uses: actions/checkout@v5
4246

4347
- name: Build sdist
4448
run: pipx run build --sdist
4549

46-
- uses: actions/upload-artifact@v3
50+
- uses: actions/upload-artifact@v4
4751
with:
4852
path: dist/*.tar.gz

CMakeLists.txt

Lines changed: 93 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
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.
33
if(DEFINED SKBUILD_PROJECT_NAME)
44
project(${SKBUILD_PROJECT_NAME} LANGUAGES C)
@@ -7,9 +7,9 @@ else()
77
endif()
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)
1313
else()
1414
message(WARNING "CUDA not found. Building without CUDA support.")
1515
endif()
@@ -19,10 +19,49 @@ if(NOT CMAKE_BUILD_TYPE)
1919
set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE)
2020
endif()
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
2665
include(CheckCSourceCompiles)
2766
set(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
3573
if(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")
3977
endif()
4078

4179
check_c_source_compiles("${AVX2_TEST_CODE}" HAVE_AVX2)
42-
43-
# Clear any test-only flags
4480
unset(CMAKE_REQUIRED_FLAGS)
4581

4682
if(HAVE_AVX2)
@@ -49,20 +85,24 @@ else()
4985
message(STATUS "AVX2 is not supported.")
5086
endif()
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+
53103
if(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()
67107
endif()
68108

@@ -72,39 +112,45 @@ set(SCALAR_ACCURACIES 2 4 6 8)
72112
set(ELASTIC_ACCURACIES 2 4)
73113
set(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
76120
foreach(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()
91132
endforeach()
92133

93-
# CPU object libraries (elastic)
134+
# elastic
94135
foreach(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()
104142
endforeach()
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()
139186
endif()
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 ---
142191
add_library(deepwave_C SHARED ${DEEPWAVE_OBJECTS})
143192
set_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)
154201
endif()
155202

156-
if(OpenMP_C_FOUND)
157-
target_link_libraries(deepwave_C PRIVATE OpenMP::OpenMP_C)
158-
endif()
159-
160203
if(HAVE_AVX2)
161204
target_compile_definitions(deepwave_C PRIVATE HAVE_AVX2)
162205
endif()
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

Comments
 (0)