Встроенная в CMake поддержка CUDA работает почти так же, как и для проектов на C и C ++.Использование CUDA вместо C ++ аналогично использованию C вместо C ++.
Прежде всего, вы должны включить поддержку CUDA в своем проекте, добавив:
project(myproject LANGUAGES CUDA)
Таким образом, выне нужно запускать enable_language
, и ваш кэш CMake не будет загроможден конфигурацией компилятора C и C ++, созданной по умолчанию, подразумеваемой project(myproject LANGUAGES C CXX)
, которую вы получаете, когда пишете просто project(myproject)
.
.эквивалент CMAKE_CXX_STANDARD
для CUDA равен CMAKE_CUDA_STANDARD
, очень похоже на то, как существует CMAKE_C_STANDARD
.Кроме того, существует CMAKE_CUDA_EXTENSIONS
, который можно настроить для включения / отключения определенных расширений компилятора (т. Е. Выбрать -std=c++14
или -std=gnu++14
).Как правило, если вы видите переменные CMake вида CMAKE_CXX_.....
или CMAKE_C_.....
, то есть эквивалент CMAKE_CUDA_.....
.И вообще, когда вы видите CXX
или C
в переменных и свойствах, может быть CUDA
эквивалент.
set(CMAKE_CUDA_STANDARD 11)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
set(CMAKE_CUDA_EXTENSIONS OFF)
Однако следует отметить, что эти конкретные переменные имеют цель-специфичные эквиваленты в форме целевых свойств (как для C ++, так и для CUDA):
set_target_properties(
myprojectlibrary PROPERTIES
CUDA_STANDARD 11
CUDA_STANDARD_REQUIRED ON
CUDA_EXTENSIONS OFF)
Что касается специфичных для CUDA функций, как в старых FindCUDA
, вы должны найти их как дополнительные целевые свойства, такие же какте, что в предыдущем примере:
set_target_properties(
myprojectlibrary PROPERTIES
CUDA_SEPARABLE_COMPILATION ON
CUDA_RESOLVE_DEVICE_SYMBOLS ON)
Информацию об этих целевых свойствах можно найти здесь , ища на странице «CUDA».
Что касается ссылок насторонние библиотеки, это можно сделать так же, как и для обычных проектов C ++:
target_link_libraries(myprojectlib nvtx)
или если ваша библиотека не определена как первоклассная цель CMake:
target_link_libraries(myprojectlib ${NVTX_LIBRARY})
target_include_directories(myprojectlib PRIVATE ${NVTX_INCLUDE_DIR})
target_compile_definitions(myprojectlib PRIVATE ${NVTX_DEFINES})
Наконец, если для создания проекта требуются какие-либо конкретные nvcc
флаги, их можно установить следующим образом:
target_compile_options(myprojectlib PRIVATE --default-stream=per-thread)
Обратите внимание, что глобальные настраиваемые флаги nvcc
настраиваются пользователем.также доступно какпеременная CMAKE_CUDA_FLAGS
.
Также обратите внимание, что вам, возможно, придется изменить PRIVATE
на PUBLIC
в тех местах, где вы хотите, чтобы определенные флаги / включали определения каталогов / компиляции также распространялись на цели, ссылающиеся на вашу библиотеку,в случае, если myprojectlib
является библиотекой, а не исполняемым файлом, что может или не может быть желательным в зависимости от структуры вашего проекта.