在nvcc/cuda中使用CMakes检查\u CXX\u编译器\u标志

在nvcc/cuda中使用CMakes检查\u CXX\u编译器\u标志,cuda,cmake,nvcc,compiler-flags,Cuda,Cmake,Nvcc,Compiler Flags,我正在尝试使用CUDA和CMake生成的MakeFiles编译一些coda 我想使用CHECK_CXX_COMPILER_标志或类似的东西来检查所使用的nvcc版本是否支持给定的标志。在我的例子中,它是“-expt relaxed constepr”(Cuda 7.5)和“-relaxed constepr”(Cuda 7?) 当然,我可以比较CUDA版本,但我发现编译标志检查更安全 是否有任何类似于CHECK_CXX_COMPILER_标志的CMake命令调用nvcc编译器而不是主机编译器?我

我正在尝试使用CUDA和CMake生成的MakeFiles编译一些coda

我想使用CHECK_CXX_COMPILER_标志或类似的东西来检查所使用的nvcc版本是否支持给定的标志。在我的例子中,它是“-expt relaxed constepr”(Cuda 7.5)和“-relaxed constepr”(Cuda 7?)

当然,我可以比较CUDA版本,但我发现编译标志检查更安全


是否有任何类似于CHECK_CXX_COMPILER_标志的CMake命令调用nvcc编译器而不是主机编译器?

我不知道有什么官方方法可以检查特定的
nvcc
标志,但您可以自己编写宏,而只需:

检查NVCCCompilerFlag.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

...
输出

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

...


(我个人相信。)

简短回答:是的,有。NVCC将定义一个宏:
\uuuuudacc\urelaxed\uconstexpr\uuuu

#ifdef __CUDACC_RELAXED_CONSTEXPR__

  do somthing

#endif

我想如果你小心选择的话,这会有用的。。。“没有”也是一个答案。@Flamefire为什么在使用
CHECK\u CXX\u COMPILER\u FLAG
时必须更加小心?
CHECK\u CXX\u COMPILER\u FLAG
实际上试图编译一些东西。像这样调用nvcc会发出错误(没有输入文件),我不确定
CHECK\u CXX\u COMPILER\u FLAG
是否专门处理参数。在这里,您可以很容易地将错误的内容作为“标志”传递,但我认为这是用户的错,所以这没关系;)