代码之家  ›  专栏  ›  技术社区  ›  Flamefire

将CMakes CHECK_CXX_COMPILER_FLAG与nvcc/cuda一起使用

  •  2
  • Flamefire  · 技术社区  · 10 年前

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

    我想使用CHECK_CXX_COMPILER_FLAG或类似的方法来检查所使用的nvcc版本是否支持给定的标志。在我的例子中,它是“--expt-related constexpr”(Cuda 7.5)和“--related constexpr”(Cuda7?)

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

    是否有类似于CHECK_CXX_COMPILER_FLAG的CMake命令调用nvcc编译器而不是主机编译器?

    2 回复  |  直到 10 年前
        1
  •  1
  •   m.s.    10 年前

    我不知道官方的方式来检查 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
    
    ...
    

    (我个人认为 CUDA_VERSION .)

        2
  •  0
  •   Mohsen talonmies    7 年前

    简短回答:是的,有。NVCC将定义一个宏: __CUDACC_RELAXED_CONSTEXPR__ .

    #ifdef __CUDACC_RELAXED_CONSTEXPR__
    
      do somthing
    
    #endif