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.


person einpoklum    schedule 15.02.2018    source источник


Ответы (1)


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

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

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).

person einpoklum    schedule 15.02.2018