Merge topic 'FindCUDA.cmake/StaticRuntime'
7fea2b77 FindCUDA: Use the static CUDA runtime library if available (#15482)
This commit is contained in:
commit
e46224a7cd
7
Help/release/dev/FindCUDA-StaticRuntime.rst
Normal file
7
Help/release/dev/FindCUDA-StaticRuntime.rst
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
FindCUDA-StaticRuntime
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
* The :module:`FindCUDA` module now defaults to using the static
|
||||||
|
CUDA runtime library if it is available. A new
|
||||||
|
``CUDA_USE_STATIC_CUDA_RUNTIME`` option is offered to control
|
||||||
|
this behavior.
|
@ -106,6 +106,11 @@
|
|||||||
# CUDA_COMPUTE_SEPARABLE_COMPILATION_OBJECT_FILE_NAME and
|
# CUDA_COMPUTE_SEPARABLE_COMPILATION_OBJECT_FILE_NAME and
|
||||||
# CUDA_LINK_SEPARABLE_COMPILATION_OBJECTS should be called.
|
# CUDA_LINK_SEPARABLE_COMPILATION_OBJECTS should be called.
|
||||||
#
|
#
|
||||||
|
# CUDA_USE_STATIC_CUDA_RUNTIME (Default ON)
|
||||||
|
# -- When enabled the static version of the CUDA runtime library will be used
|
||||||
|
# in CUDA_LIBRARIES. If the version of CUDA configured doesn't support
|
||||||
|
# this option, then it will be silently disabled.
|
||||||
|
#
|
||||||
# CUDA_VERBOSE_BUILD (Default OFF)
|
# CUDA_VERBOSE_BUILD (Default OFF)
|
||||||
# -- Set to ON to see all the commands used when building the CUDA file. When
|
# -- Set to ON to see all the commands used when building the CUDA file. When
|
||||||
# using a Makefile generator the value defaults to VERBOSE (run make
|
# using a Makefile generator the value defaults to VERBOSE (run make
|
||||||
@ -272,6 +277,8 @@
|
|||||||
# CUDA_CUBLAS_LIBRARIES -- Device or emulation library for the Cuda BLAS
|
# CUDA_CUBLAS_LIBRARIES -- Device or emulation library for the Cuda BLAS
|
||||||
# implementation (alterative to:
|
# implementation (alterative to:
|
||||||
# CUDA_ADD_CUBLAS_TO_TARGET macro).
|
# CUDA_ADD_CUBLAS_TO_TARGET macro).
|
||||||
|
# CUDA_cudart_static_LIBRARY -- Statically linkable cuda runtime library.
|
||||||
|
# Only available for CUDA version 5.5+
|
||||||
# CUDA_cupti_LIBRARY -- CUDA Profiling Tools Interface library.
|
# CUDA_cupti_LIBRARY -- CUDA Profiling Tools Interface library.
|
||||||
# Only available for CUDA version 4.0+.
|
# Only available for CUDA version 4.0+.
|
||||||
# CUDA_curand_LIBRARY -- CUDA Random Number Generation library.
|
# CUDA_curand_LIBRARY -- CUDA Random Number Generation library.
|
||||||
@ -518,11 +525,12 @@ macro(cuda_unset_include_and_libraries)
|
|||||||
# This only existed in the 3.0 version of the CUDA toolkit
|
# This only existed in the 3.0 version of the CUDA toolkit
|
||||||
unset(CUDA_CUDARTEMU_LIBRARY CACHE)
|
unset(CUDA_CUDARTEMU_LIBRARY CACHE)
|
||||||
endif()
|
endif()
|
||||||
unset(CUDA_cupti_LIBRARY CACHE)
|
unset(CUDA_cudart_static_LIBRARY CACHE)
|
||||||
unset(CUDA_cublas_LIBRARY CACHE)
|
unset(CUDA_cublas_LIBRARY CACHE)
|
||||||
unset(CUDA_cublasemu_LIBRARY CACHE)
|
unset(CUDA_cublasemu_LIBRARY CACHE)
|
||||||
unset(CUDA_cufft_LIBRARY CACHE)
|
unset(CUDA_cufft_LIBRARY CACHE)
|
||||||
unset(CUDA_cufftemu_LIBRARY CACHE)
|
unset(CUDA_cufftemu_LIBRARY CACHE)
|
||||||
|
unset(CUDA_cupti_LIBRARY CACHE)
|
||||||
unset(CUDA_curand_LIBRARY CACHE)
|
unset(CUDA_curand_LIBRARY CACHE)
|
||||||
unset(CUDA_cusolver_LIBRARY CACHE)
|
unset(CUDA_cusolver_LIBRARY CACHE)
|
||||||
unset(CUDA_cusparse_LIBRARY CACHE)
|
unset(CUDA_cusparse_LIBRARY CACHE)
|
||||||
@ -532,6 +540,8 @@ macro(cuda_unset_include_and_libraries)
|
|||||||
unset(CUDA_npps_LIBRARY CACHE)
|
unset(CUDA_npps_LIBRARY CACHE)
|
||||||
unset(CUDA_nvcuvenc_LIBRARY CACHE)
|
unset(CUDA_nvcuvenc_LIBRARY CACHE)
|
||||||
unset(CUDA_nvcuvid_LIBRARY CACHE)
|
unset(CUDA_nvcuvid_LIBRARY CACHE)
|
||||||
|
|
||||||
|
unset(CUDA_USE_STATIC_CUDA_RUNTIME CACHE)
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
# Check to see if the CUDA_TOOLKIT_ROOT_DIR and CUDA_SDK_ROOT_DIR have changed,
|
# Check to see if the CUDA_TOOLKIT_ROOT_DIR and CUDA_SDK_ROOT_DIR have changed,
|
||||||
@ -539,8 +549,8 @@ endmacro()
|
|||||||
if(NOT "${CUDA_TOOLKIT_ROOT_DIR}" STREQUAL "${CUDA_TOOLKIT_ROOT_DIR_INTERNAL}")
|
if(NOT "${CUDA_TOOLKIT_ROOT_DIR}" STREQUAL "${CUDA_TOOLKIT_ROOT_DIR_INTERNAL}")
|
||||||
unset(CUDA_TOOLKIT_TARGET_DIR CACHE)
|
unset(CUDA_TOOLKIT_TARGET_DIR CACHE)
|
||||||
unset(CUDA_NVCC_EXECUTABLE CACHE)
|
unset(CUDA_NVCC_EXECUTABLE CACHE)
|
||||||
unset(CUDA_VERSION CACHE)
|
|
||||||
cuda_unset_include_and_libraries()
|
cuda_unset_include_and_libraries()
|
||||||
|
unset(CUDA_VERSION CACHE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT "${CUDA_TOOLKIT_TARGET_DIR}" STREQUAL "${CUDA_TOOLKIT_TARGET_DIR_INTERNAL}")
|
if(NOT "${CUDA_TOOLKIT_TARGET_DIR}" STREQUAL "${CUDA_TOOLKIT_TARGET_DIR_INTERNAL}")
|
||||||
@ -696,6 +706,53 @@ if(CUDA_VERSION VERSION_EQUAL "3.0")
|
|||||||
CUDA_CUDARTEMU_LIBRARY
|
CUDA_CUDARTEMU_LIBRARY
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
if(NOT CUDA_VERSION VERSION_LESS "5.5")
|
||||||
|
cuda_find_library_local_first(CUDA_cudart_static_LIBRARY cudart_static "static CUDA runtime library")
|
||||||
|
mark_as_advanced(CUDA_cudart_static_LIBRARY)
|
||||||
|
endif()
|
||||||
|
if(CUDA_cudart_static_LIBRARY)
|
||||||
|
# Set whether to use the static cuda runtime.
|
||||||
|
option(CUDA_USE_STATIC_CUDA_RUNTIME "Use the static version of the CUDA runtime library if available" ON)
|
||||||
|
else()
|
||||||
|
option(CUDA_USE_STATIC_CUDA_RUNTIME "Use the static version of the CUDA runtime library if available" OFF)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CUDA_USE_STATIC_CUDA_RUNTIME)
|
||||||
|
if(UNIX)
|
||||||
|
# Check for the dependent libraries. Here we look for pthreads.
|
||||||
|
if (DEFINED CMAKE_THREAD_PREFER_PTHREAD)
|
||||||
|
set(_cuda_cmake_thread_prefer_pthread ${CMAKE_THREAD_PREFER_PTHREAD})
|
||||||
|
endif()
|
||||||
|
set(CMAKE_THREAD_PREFER_PTHREAD 1)
|
||||||
|
|
||||||
|
# Many of the FindXYZ CMake comes with makes use of try_compile with int main(){return 0;}
|
||||||
|
# as the source file. Unfortunately this causes a warning with -Wstrict-prototypes and
|
||||||
|
# -Werror causes the try_compile to fail. We will just temporarily disable other flags
|
||||||
|
# when doing the find_package command here.
|
||||||
|
set(_cuda_cmake_c_flags ${CMAKE_C_FLAGS})
|
||||||
|
set(CMAKE_C_FLAGS "-fPIC")
|
||||||
|
find_package(Threads REQUIRED)
|
||||||
|
set(CMAKE_C_FLAGS ${_cuda_cmake_c_flags})
|
||||||
|
|
||||||
|
if (DEFINED _cuda_cmake_thread_prefer_pthread)
|
||||||
|
set(CMAKE_THREAD_PREFER_PTHREAD ${_cuda_cmake_thread_prefer_pthread})
|
||||||
|
unset(_cuda_cmake_thread_prefer_pthread)
|
||||||
|
else()
|
||||||
|
unset(CMAKE_THREAD_PREFER_PTHREAD)
|
||||||
|
endif()
|
||||||
|
if (NOT APPLE)
|
||||||
|
# Here is librt that has things such as, clock_gettime, shm_open, and shm_unlink.
|
||||||
|
find_library(CUDA_rt_LIBRARY rt)
|
||||||
|
find_library(CUDA_dl_LIBRARY dl)
|
||||||
|
if (NOT CUDA_rt_LIBRARY)
|
||||||
|
message(WARNING "Expecting to find librt for libcudart_static, but didn't find it.")
|
||||||
|
endif()
|
||||||
|
if (NOT CUDA_dl_LIBRARY)
|
||||||
|
message(WARNING "Expecting to find libdl for libcudart_static, but didn't find it.")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
# CUPTI library showed up in cuda toolkit 4.0
|
# CUPTI library showed up in cuda toolkit 4.0
|
||||||
if(NOT CUDA_VERSION VERSION_LESS "4.0")
|
if(NOT CUDA_VERSION VERSION_LESS "4.0")
|
||||||
@ -703,12 +760,32 @@ if(NOT CUDA_VERSION VERSION_LESS "4.0")
|
|||||||
mark_as_advanced(CUDA_cupti_LIBRARY)
|
mark_as_advanced(CUDA_cupti_LIBRARY)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Set the CUDA_LIBRARIES variable. This is the set of stuff to link against if you are
|
||||||
|
# using the CUDA runtime. For the dynamic version of the runtime, most of the
|
||||||
|
# dependencies are brough in, but for the static version there are additional libraries
|
||||||
|
# and linker commands needed.
|
||||||
|
# Initialize to empty
|
||||||
|
set(CUDA_LIBRARIES)
|
||||||
|
|
||||||
# If we are using emulation mode and we found the cudartemu library then use
|
# If we are using emulation mode and we found the cudartemu library then use
|
||||||
# that one instead of cudart.
|
# that one instead of cudart.
|
||||||
if(CUDA_BUILD_EMULATION AND CUDA_CUDARTEMU_LIBRARY)
|
if(CUDA_BUILD_EMULATION AND CUDA_CUDARTEMU_LIBRARY)
|
||||||
set(CUDA_LIBRARIES ${CUDA_CUDARTEMU_LIBRARY})
|
list(APPEND CUDA_LIBRARIES ${CUDA_CUDARTEMU_LIBRARY})
|
||||||
|
elseif(CUDA_USE_STATIC_CUDA_RUNTIME AND CUDA_cudart_static_LIBRARY)
|
||||||
|
list(APPEND CUDA_LIBRARIES ${CUDA_cudart_static_LIBRARY} ${CMAKE_THREAD_LIBS_INIT})
|
||||||
|
if (CUDA_rt_LIBRARY)
|
||||||
|
list(APPEND CUDA_LIBRARIES ${CUDA_rt_LIBRARY})
|
||||||
|
endif()
|
||||||
|
if (CUDA_dl_LIBRARY)
|
||||||
|
list(APPEND CUDA_LIBRARIES ${CUDA_dl_LIBRARY})
|
||||||
|
endif()
|
||||||
|
if(APPLE)
|
||||||
|
# We need to add the default path to the driver (libcuda.dylib) as an rpath, so that
|
||||||
|
# the static cuda runtime can find it at runtime.
|
||||||
|
list(APPEND CUDA_LIBRARIES -Wl,-rpath,/usr/local/cuda/lib)
|
||||||
|
endif()
|
||||||
else()
|
else()
|
||||||
set(CUDA_LIBRARIES ${CUDA_CUDART_LIBRARY})
|
list(APPEND CUDA_LIBRARIES ${CUDA_CUDART_LIBRARY})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# 1.1 toolkit on linux doesn't appear to have a separate library on
|
# 1.1 toolkit on linux doesn't appear to have a separate library on
|
||||||
|
Loading…
x
Reference in New Issue
Block a user