diff --git a/CMakeLists.txt b/CMakeLists.txt index d5467f4..9902545 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -175,21 +175,12 @@ endif() # components under separate prefixes. find_package(CUDAToolkit REQUIRED) find_package(CUTENSOR REQUIRED) +find_package(CUFFT REQUIRED) set(CUDECOMP_CUDART_TARGET CUDA::cudart) set(CUDECOMP_CUTENSOR_TARGET CUTENSOR::CUTENSOR) -set(CUDECOMP_CUFFT_TARGET CUDA::cufft) -get_target_property(CUDECOMP_CUFFT_LIBRARY ${CUDECOMP_CUFFT_TARGET} IMPORTED_LOCATION) -get_filename_component(CUDECOMP_CUFFT_LIBRARY_DIR "${CUDECOMP_CUFFT_LIBRARY}" DIRECTORY) -get_filename_component(CUDECOMP_CUFFT_ROOT "${CUDECOMP_CUFFT_LIBRARY_DIR}" DIRECTORY) -find_path(CUDECOMP_CUFFT_INCLUDE_DIR - NAMES cufft.h - HINTS ${CUDAToolkit_INCLUDE_DIRS} "${CUDECOMP_CUFFT_ROOT}/include" - PATHS ENV CPATH - REQUIRED -) -unset(CUDECOMP_CUFFT_LIBRARY_DIR) -unset(CUDECOMP_CUFFT_ROOT) +set(CUDECOMP_CUFFT_TARGET CUFFT::CUFFT) +set(CUDECOMP_CUFFT_INCLUDE_DIR "${CUFFT_INCLUDE_DIR}") set(CUDECOMP_CUDA_VERSION "${CUDAToolkit_VERSION_MAJOR}.${CUDAToolkit_VERSION_MINOR}") set(CUDECOMP_CUDA_INCLUDE_DIR "${CUDAToolkit_INCLUDE_DIRS}") foreach(CUDECOMP_CUDA_INCLUDE_ROOT IN LISTS CUDAToolkit_INCLUDE_DIRS) @@ -315,6 +306,7 @@ endif() message(STATUS " CUDA Toolkit: ${CUDAToolkit_LIBRARY_ROOT} (${CUDAToolkit_VERSION})") message(STATUS " CUDA compute capabilities: ${CUDECOMP_CUDA_CC_LIST}") message(STATUS " CUTENSOR: ${CUTENSOR_LIBRARY} (${CUTENSOR_VERSION})") + message(STATUS " cuFFT: ${CUFFT_LIBRARY}") message(STATUS " NCCL: ${NCCL_LIBRARY} (${NCCL_VERSION})") if (CUDECOMP_ENABLE_NVSHMEM) message(STATUS " NVSHMEM host library: ${NVSHMEM_HOST_LIBRARY}") diff --git a/cmake/FindCUFFT.cmake b/cmake/FindCUFFT.cmake new file mode 100644 index 0000000..8ca1ba8 --- /dev/null +++ b/cmake/FindCUFFT.cmake @@ -0,0 +1,59 @@ +# Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +include(FindPackageHandleStandardArgs) + +# Older FindCUDAToolkit versions can find the CUDA runtime in NVHPC without +# finding cuFFT in the separate, versioned math_libs directory. +if (TARGET CUDA::cufft) + get_target_property(CUFFT_LIBRARY CUDA::cufft IMPORTED_LOCATION) + # Older FindCUDAToolkit versions use an interface target without a location. + if (NOT CUFFT_LIBRARY) + set(CUFFT_LIBRARY "${CUDA_cufft_LIBRARY}") + endif() +else() + set(_CUFFT_NVHPC_ROOT + "${CUDECOMP_NVHPC_SDK_ROOT}/math_libs/${CUDAToolkit_VERSION_MAJOR}.${CUDAToolkit_VERSION_MINOR}") + if (CUDECOMP_NVHPC_SDK_ROOT AND IS_DIRECTORY "${_CUFFT_NVHPC_ROOT}") + list(APPEND _CUFFT_PATHS "${_CUFFT_NVHPC_ROOT}") + endif() + find_library(CUFFT_LIBRARY + NAMES cufft + HINTS ${CUDAToolkit_LIBRARY_DIR} + PATHS ${_CUFFT_PATHS} ENV NVCOMPILER_MATH_LIBS_HOME ENV LIBRARY_PATH ENV LD_LIBRARY_PATH + PATH_SUFFIXES lib64 lib + ) +endif() + +if (CUFFT_LIBRARY) + get_filename_component(_CUFFT_LIBRARY_DIR "${CUFFT_LIBRARY}" DIRECTORY) + get_filename_component(_CUFFT_ROOT "${_CUFFT_LIBRARY_DIR}" DIRECTORY) +endif() +find_path(CUFFT_INCLUDE_DIR + NAMES cufft.h + HINTS "${_CUFFT_ROOT}/include" ${CUDAToolkit_INCLUDE_DIRS} + PATHS ${_CUFFT_PATHS} ENV NVCOMPILER_MATH_LIBS_HOME ENV CPATH + PATH_SUFFIXES include +) + +find_package_handle_standard_args(CUFFT REQUIRED_VARS CUFFT_LIBRARY CUFFT_INCLUDE_DIR) + +if (CUFFT_FOUND AND NOT TARGET CUFFT::CUFFT) + if (TARGET CUDA::cufft) + add_library(CUFFT::CUFFT INTERFACE IMPORTED) + set_target_properties(CUFFT::CUFFT PROPERTIES INTERFACE_LINK_LIBRARIES CUDA::cufft) + else() + add_library(CUFFT::CUFFT UNKNOWN IMPORTED) + set_target_properties(CUFFT::CUFFT PROPERTIES IMPORTED_LOCATION "${CUFFT_LIBRARY}") + endif() + set_target_properties(CUFFT::CUFFT PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${CUFFT_INCLUDE_DIR};${CUDAToolkit_INCLUDE_DIRS}" + ) +endif() + +mark_as_advanced(CUFFT_LIBRARY CUFFT_INCLUDE_DIR) +unset(_CUFFT_NVHPC_ROOT) +unset(_CUFFT_PATHS) +unset(_CUFFT_LIBRARY_DIR) +unset(_CUFFT_ROOT)