Современный CMake (3.8+) - FindCUDA устарела, а как насчет файлов .cu? - PullRequest
0 голосов
/ 30 октября 2018

У меня есть проект C ++ / CUDA, основанный на CMake. В настоящее время я использую CMake 3.11 и CUDA 9.0 и читаю, что теперь CUDA является первоклассным языком в CMake, поэтому я могу просто добавить .cu файлы, и он автоматически вызовет компилятор NVCC, чтобы позаботиться о них. До этого нам приходилось использовать find_package(CUDA) и так далее, но теперь это устаревшая функция .

Теперь вопрос: как нам скомпилировать обычные .cpp файлы, которые все еще используют библиотеки хостов CUDA? cudaMalloc, cudaFree и т. Д. Мое решение до сих пор - set_source_files_properties(file.cpp PROPERTIES LANGUAGE CUDA), но я не чувствую, что это правильно. Поскольку этот файл не содержит код устройства, он должен быть скомпилирован с помощью компилятора GCC, включая ссылки на библиотеки CUDA.

Еще одна проблема этого подхода заключается в том, что он очень быстро распространяется на остальную часть проекта. Скажем, файл заголовка, который определяет структуру, содержащую переменную dims3, затем каждый файл .cpp, который #include s этого заголовка, необходимо будет рассматривать как файл CUDA.

1 Ответ

0 голосов
/ 31 октября 2018

как нам скомпилировать обычные файлы .cpp, которые все еще используют библиотеки хостов CUDA?

С вашим обычным компилятором C ++. Нет необходимости рассматривать их как LANGUAGE CUDA.

Недавно я переключился на собственную поддержку CUDA в CMake в этом репозитории . Теперь у меня есть:

add_executable(device_management 
    EXCLUDE_FROM_ALL examples/by_runtime_api_module/device_management.cpp)
add_executable(execution_control 
    EXCLUDE_FROM_ALL examples/by_runtime_api_module/execution_control.cu)

Оба из них используют API времени выполнения (на самом деле, они используют встроенные оболочки C ++, которые используют API времени выполнения, но большинство оболочек только для заголовков), но у второго есть ядро, поэтому я сделал его .cu, и он компилируется CUDA. .cpp прекрасно работает и работает на старом GCC.

...