Использование CMakes CHECK_CXX_COMPILER_FLAG с nvcc / cuda

Я пытаюсь скомпилировать код, используя CUDA с MakeFiles, созданными CMake.

Я хотел бы использовать CHECK_CXX_COMPILER_FLAG или что-то подобное, чтобы проверить, поддерживает ли используемая версия nvcc данный флаг. В моем случае это «--expt-relaxed-constexpr» (Cuda 7.5) и «--relaxed-constexpr» (Cuda 7?)

Конечно, я мог бы сравнить версию CUDA, но я считаю, что проверка флага компиляции более надежна.

Есть ли какая-либо команда CMake, похожая на CHECK_CXX_COMPILER_FLAG, которая вызывает компилятор nvcc, а не компилятор хоста?


person Flamefire    schedule 21.09.2015    source источник


Ответы (2)


Я не знаю официального способа проверки конкретного флага 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.)

person m.s.    schedule 21.09.2015
comment
Полагаю, это сработает, если вы будете осторожны с опциями ... Что ж, их нет - тоже ответ. - person Flamefire; 21.09.2015
comment
@Flamefire, почему вам нужно быть более осторожным, как при использовании CHECK_CXX_COMPILER_FLAG? - person m.s.; 21.09.2015
comment
CHECK_CXX_COMPILER_FLAG на самом деле пытается что-то скомпилировать. Invokin nvcc, как это, выдает ошибку (нет входных файлов), и я не уверен, что CHECK_CXX_COMPILER_FLAG обрабатывает параметр специально. Здесь вы можете легко передать неправильные вещи в качестве флага, но я думаю, что тогда виноваты пользователи, так что это нормально;) - person Flamefire; 21.09.2015

Краткий ответ: да, есть. NVCC определит макрос: __CUDACC_RELAXED_CONSTEXPR__.

#ifdef __CUDACC_RELAXED_CONSTEXPR__

  do somthing

#endif
person Mohsen    schedule 21.02.2019