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