CMake + CUDA + отделимая компиляция -> "nvcc не знает, что делать с ' ' "

Я использую CMake для моего проекта с участием CUDA. Недавно мне пришлось включить "раздельную компиляцию" некоторых из моих кодов CUDA:

set(CUDA_SEPARABLE_COMPILATION ON)

но потом строительство начало рушиться. В качестве примера может произойти следующее:

/usr/local/cuda/bin/nvcc -gencode arch=compute_30,code=compute_30 --std=c++11 \
   -Xcompiler -Wall -O3 -DNDEBUG "" "" "" "" -m64 -ccbin /usr/bin/cc \
   -dlink /some/where/generated_foo.cu.o -o /some/where/foo_intermediate_link.o
nvcc fatal   : Don't know what to do with ''

(ломаные линии и сокращенные имена для удобства чтения)

Итак, проблема в том, что что-то запускает CMake для добавления некоторых пустых (заключенных в кавычки) строк в командную строку, что не нравится nvcc. В остальном команда выглядит нормально.

Сейчас, -O3 -DNDEBUG мои флаги компиляции nvcc для сборок релиза. Но я, конечно, нигде не добавил никаких флагов с пустыми строками Я попытался выяснить, как FindCUDA конструирует вызов nvcc, но не мог понять, куда поступают эти пустые строки.

Не вдаваясь в специфику моего CMakeLists.txtМожет ли это быть известной проблемой с модулем CMake FindaCUDA, который имеет обходной путь?

Примечание: я использую GNU/Linux Mint 18.3, CMake 3.5 и CUDA 9.1.

1 ответ

Решение

Оказывается, это известная проблема CMake.

Обходной путь должен только установить специфичные для build-config флаги компиляции для активной конфигурации сборки, например, вместо:

set(CUDA_NVCC_FLAGS_RELEASE ${CUDA_NVCC_FLAGS_RELEASE} -O3)
set(CUDA_NVCC_FLAGS_DEBUG ${CUDA_NVCC_FLAGS_DEBUG} -g --generate-line-info)

в вашем CMakeLists.txt, используйте:

if (CMAKE_BUILD_TYPE_UPPER STREQUAL "RELEASE")
    set(CUDA_NVCC_FLAGS_RELEASE ${CUDA_NVCC_FLAGS_RELEASE} -O3)
elseif (CMAKE_BUILD_TYPE_UPPER STREQUAL "DEBUG")
    set(CUDA_NVCC_FLAGS_DEBUG ${CUDA_NVCC_FLAGS_DEBUG} -g --generate-line-info)
endif (CMAKE_BUILD_TYPE_UPPER STREQUAL "RELEASE")

вместо этого (или больше случаев, если у вас есть несколько типов сборки).

Другая возможная альтернатива - вообще не использовать FindCUDA, так как CMake добавил поддержку CUDA как "первоклассного" языка, начиная с версии 3.X (не уверен, что такое X).

Другие вопросы по тегам