将 CMakes CHECK_CXX_COMPILER_FLAG 与 nvcc/cuda 结合使用
Using CMakes CHECK_CXX_COMPILER_FLAG with nvcc/cuda
我正在尝试使用 CUDA 和 CMake 生成的 MakeFiles 编译一些尾声。
我想使用 CHECK_CXX_COMPILER_FLAG 或类似的东西来检查使用的 nvcc 版本是否支持给定的标志。在我的例子中是“--expt-relaxed-constexpr”(Cuda 7.5)和“--relaxed-constexpr”(Cuda 7?)
当然我可以比较 CUDA 版本,但我发现编译标志检查更安全。
是否有类似于 CHECK_CXX_COMPILER_FLAG 的任何 CMake 命令调用 nvcc 编译器而不是主机编译器?
我不知道检查特定 nvcc
标志的官方方法,但您可以自己编写一个宏,相当简单:
CheckNvccCompilerFlag.cmake
MACRO(CHECK_NVCC_COMPILER_FLAG _FLAG _RESULT)
EXECUTE_PROCESS(COMMAND ${CUDA_NVCC_EXECUTABLE} "${_FLAG}" ERROR_VARIABLE NVCC_OUT)
IF("${NVCC_OUT}" MATCHES "Unknown option")
SET(${_RESULT} 0)
ELSE()
SET(${_RESULT} 1)
ENDIF()
ENDMACRO()
演示使用:
CMakeList.txt
PROJECT(cuda_flag_test)
FIND_PACKAGE(CUDA)
INCLUDE(CheckNvccCompilerFlag.cmake)
CHECK_NVCC_COMPILER_FLAG("--asdf" HAS_NVCC_ASDF)
IF(HAS_NVCC_ASDF)
MESSAGE(STATUS "asdf is supported")
ENDIF()
CHECK_NVCC_COMPILER_FLAG("--relaxed-constexpr" HAS_NVCC_RELAXED_CONSTEXPR)
IF(HAS_NVCC_RELAXED_CONSTEXPR)
MESSAGE(STATUS "relaxed-constexpr is supported")
ENDIF()
输出
...
-- Found CUDA: /opt/cuda (found version "7.0")
-- relaxed-constexpr is supported
...
(就个人而言,我会依赖 CUDA_VERSION
。)
简答:是的,有。 NVCC 会定义一个宏:__CUDACC_RELAXED_CONSTEXPR__
.
#ifdef __CUDACC_RELAXED_CONSTEXPR__
do somthing
#endif
我正在尝试使用 CUDA 和 CMake 生成的 MakeFiles 编译一些尾声。
我想使用 CHECK_CXX_COMPILER_FLAG 或类似的东西来检查使用的 nvcc 版本是否支持给定的标志。在我的例子中是“--expt-relaxed-constexpr”(Cuda 7.5)和“--relaxed-constexpr”(Cuda 7?)
当然我可以比较 CUDA 版本,但我发现编译标志检查更安全。
是否有类似于 CHECK_CXX_COMPILER_FLAG 的任何 CMake 命令调用 nvcc 编译器而不是主机编译器?
我不知道检查特定 nvcc
标志的官方方法,但您可以自己编写一个宏,相当简单:
CheckNvccCompilerFlag.cmake
MACRO(CHECK_NVCC_COMPILER_FLAG _FLAG _RESULT)
EXECUTE_PROCESS(COMMAND ${CUDA_NVCC_EXECUTABLE} "${_FLAG}" ERROR_VARIABLE NVCC_OUT)
IF("${NVCC_OUT}" MATCHES "Unknown option")
SET(${_RESULT} 0)
ELSE()
SET(${_RESULT} 1)
ENDIF()
ENDMACRO()
演示使用:
CMakeList.txt
PROJECT(cuda_flag_test)
FIND_PACKAGE(CUDA)
INCLUDE(CheckNvccCompilerFlag.cmake)
CHECK_NVCC_COMPILER_FLAG("--asdf" HAS_NVCC_ASDF)
IF(HAS_NVCC_ASDF)
MESSAGE(STATUS "asdf is supported")
ENDIF()
CHECK_NVCC_COMPILER_FLAG("--relaxed-constexpr" HAS_NVCC_RELAXED_CONSTEXPR)
IF(HAS_NVCC_RELAXED_CONSTEXPR)
MESSAGE(STATUS "relaxed-constexpr is supported")
ENDIF()
输出
...
-- Found CUDA: /opt/cuda (found version "7.0")
-- relaxed-constexpr is supported
...
(就个人而言,我会依赖 CUDA_VERSION
。)
简答:是的,有。 NVCC 会定义一个宏:__CUDACC_RELAXED_CONSTEXPR__
.
#ifdef __CUDACC_RELAXED_CONSTEXPR__
do somthing
#endif