«Розетта» для перехода на родную поддержку CMake CUDA - PullRequest
0 голосов
/ 29 мая 2018

Я хочу переключить мой проект на базе CMake на использование CMake 3.8 и встроенную поддержку CUDA для up.Я знаю, что, в основном, я enable_language(CUDA), затем использую обычные add_target и add_library вместо вариантов cuda_xxx того же самого.

Однако я не уверен, как точно переписать мой код.Как я ...:

  • Набор глобальных переменных CMake, связанных с CUDA, например, раздельная компиляция, распространение флагов хоста?
  • Вызов CUDA-эквивалента CMAKE_CXX_STANDARD и друзей?
  • Добавить зависимости от библиотек CUDA, которые не требуются по умолчанию (например, NVTX)
  • ... и все остальное?

Существует ли какой-либо унифицированный метод длявсе это, или мне просто нужно запомнить кучу новых команд?

1 Ответ

0 голосов
/ 29 мая 2018

Встроенная в 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 является библиотекой, а не исполняемым файлом, что может или не может быть желательным в зависимости от структуры вашего проекта.

...