Skip to content

Commit fe65a73

Browse files
authored
Merge pull request #77 from hjmjohnson/enh/vkfft-modernize-cuda-autodetect
ENH: Modernize CUDA wiring and auto-detect default VKFFT backend
2 parents 70f692d + d9a6036 commit fe65a73

3 files changed

Lines changed: 40 additions & 5 deletions

File tree

CMakeLists.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,11 @@ if(BUILD_VKFFT)
137137
GIT_REPOSITORY ${VkFFT_GIT_REPOSITORY}
138138
GIT_TAG ${VkFFT_GIT_TAG}
139139
)
140-
FetchContent_MakeAvailable(vkfft_lib)
140+
FetchContent_GetProperties(vkfft_lib)
141+
if(NOT vkfft_lib_POPULATED)
142+
FetchContent_Populate(vkfft_lib)
143+
add_subdirectory(${vkfft_lib_SOURCE_DIR} ${vkfft_lib_BINARY_DIR} EXCLUDE_FROM_ALL)
144+
endif()
141145

142146
set(vkfft_INCLUDE_DIR "${vkfft_lib_SOURCE_DIR}/vkFFT")
143147
else()

itk-module-init.cmake

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,34 @@
11
#
22
# Find the packages required by this module
33
#
4-
set(VKFFT_BACKEND 3 CACHE STRING "1 - CUDA, 3 - OpenCL, 4 - Level Zero, 5 - Metal")
4+
if(NOT DEFINED VKFFT_BACKEND)
5+
include(CheckLanguage)
6+
check_language(CUDA)
7+
set(_vkfft_have_metal FALSE)
8+
if(APPLE)
9+
find_library(_vkfft_metal_probe Metal)
10+
find_library(_vkfft_foundation_probe Foundation)
11+
find_library(_vkfft_quartzcore_probe QuartzCore)
12+
if(_vkfft_metal_probe AND _vkfft_foundation_probe AND _vkfft_quartzcore_probe)
13+
set(_vkfft_have_metal TRUE)
14+
endif()
15+
endif()
16+
if(CMAKE_CUDA_COMPILER)
17+
set(_vkfft_backend_default 1)
18+
elseif(_vkfft_have_metal)
19+
set(_vkfft_backend_default 5)
20+
else()
21+
set(_vkfft_backend_default 3)
22+
endif()
23+
else()
24+
set(_vkfft_backend_default ${VKFFT_BACKEND})
25+
endif()
26+
set(VKFFT_BACKEND ${_vkfft_backend_default} CACHE STRING "1 - CUDA, 3 - OpenCL, 4 - Level Zero, 5 - Metal")
527
if(${VKFFT_BACKEND} EQUAL 1)
6-
find_package(CUDA 9.0 REQUIRED)
7-
find_library(CUDA_NVRTC_LIB libnvrtc nvrtc HINTS "${CUDA_TOOLKIT_ROOT_DIR}/lib64" "${CUDA_TOOLKIT_ROOT_DIR}/lib/x64" "/usr/lib64" "/usr/local/cuda/lib64")
28+
enable_language(CUDA)
29+
find_package(CUDAToolkit REQUIRED)
30+
set(CUDA_LIBRARIES CUDA::cudart)
31+
find_library(CUDA_NVRTC_LIB libnvrtc nvrtc HINTS "${CUDAToolkit_LIBRARY_DIR}" "/usr/lib64" "/usr/local/cuda/lib64")
832
elseif(${VKFFT_BACKEND} EQUAL 3)
933
find_package(OpenCL REQUIRED)
1034
elseif(${VKFFT_BACKEND} EQUAL 4)
@@ -19,4 +43,11 @@ elseif(${VKFFT_BACKEND} EQUAL 4)
1943
if(NOT LevelZero_INCLUDE_DIR OR NOT LevelZero_LIBRARY)
2044
message(FATAL_ERROR "VKFFT_BACKEND=4 (Level Zero) requires the oneAPI Level Zero loader (ze_loader) and headers (level_zero/ze_api.h).")
2145
endif()
46+
elseif(${VKFFT_BACKEND} EQUAL 5)
47+
if(NOT APPLE)
48+
message(FATAL_ERROR "VKFFT_BACKEND=5 (Metal) requires Apple platforms (macOS/iOS, including Apple Silicon).")
49+
endif()
50+
find_library(METAL_FRAMEWORK Metal REQUIRED)
51+
find_library(FOUNDATION_FRAMEWORK Foundation REQUIRED)
52+
find_library(QUARTZCORE_FRAMEWORK QuartzCore REQUIRED)
2253
endif()

src/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ set(VkFFTBackend_SRCS
77
itk_module_add_library(VkFFTBackend ${VkFFTBackend_SRCS})
88

99
if(${VKFFT_BACKEND} EQUAL 1)
10-
target_link_libraries(VkFFTBackend PUBLIC ${CUDA_LIBRARIES} cuda ${CUDA_NVRTC_LIB} VkFFT half)
10+
target_link_libraries(VkFFTBackend PUBLIC ${CUDA_LIBRARIES} CUDA::cuda_driver ${CUDA_NVRTC_LIB} VkFFT half)
1111
if(MSVC)
1212
else()
1313
set_source_files_properties(itkVkCommon.cpp PROPERTIES LANGUAGE CUDA)

0 commit comments

Comments
 (0)