Cuda CMake 3.10 CMakeLists.txt

У меня есть проект Visual C ++, который создает dll. Для этого проекта у меня есть рабочий файл CMakeLists.txt.

Теперь я создал два исходных файла cuda, которые завершают проект, и с Visual Studio сборка работает нормально. Я хочу добавить соответствующие команды в свой файл cmake. Может ли кто-нибудь сказать мне, какие основные команды мне нужно добавить?

Я пытаюсь создать библиотеку dll, в которой я использую файлы .cu и .cpp .... Важная часть моего файла cmake выглядит так:

# ----------------------------------------------------------------------------
# Set Cuda properties
# ----------------------------------------------------------------------------
enable_language(CUDA)
set(CUDA_SEPARABLE_COMPILATION ON)
set(CUDA_PROPAGATE_HOST_FLAGS OFF)
if (CMAKE_SIZEOF_VOID_P MATCHES 8)
  set(CUDA_64_BIT_DEVICE_CODE_DEFAULT ON)
endif()
set(CUDA_NVCC_FLAGS "-gencode arch=compute_50,code=sm_50;-rdc=true;-use_fast_math")

message(STATUS "CUDA_PROPAGATE_HOST_FLAGS: ${CUDA_PROPAGATE_HOST_FLAGS}")
message(STATUS "CUDA_HOST_COMPILER: ${CUDA_HOST_COMPILER}")
message(STATUS "CUDA_NVCC_FLAGS: ${CUDA_NVCC_FLAGS}")

# ----------------------------------------------------------------------------
# Create shared library project
# ----------------------------------------------------------------------------
add_library(${LIB_NAME} SHARED ${HEADERS} ${SOURCES} ${CUDA_SOURCES})
set(CUDA_LIBRARIES "cudadevrt.lib;cudart.lib")
target_link_libraries(${LIB_NAME} ${CUDA_LIBRARIES})

Но он не компилирует файлы cuda с правильными флагами. Также в Visual Studio определения препроцессора также находятся в части свойств cuda .... какие-либо предложения?


person Dominik    schedule 11.04.2018    source источник
comment
Возможный дубликат CMake: как добавить cuda в существующий проект   -  person halfelf    schedule 11.04.2018
comment
@halfelf: только ответ на упомянутый вопрос описывает использование find_package(CUDA). Теперь CUDA поддерживается CMake как язык (такой же, как C, CXX или Fortran), поэтому квитанция изменена. Пока на указанный вопрос не будет получен ответ в новом CMake, я бы предпочел не дублировать его. К сожалению, я не очень хорошо знаю CUDA, поэтому не могу подготовить такой ответ.   -  person Tsyvarev    schedule 11.04.2018
comment
@Tsyvarev Спасибо за подсказку. Я пробовал enable_language(CUDA) в своем проекте. Тем не менее, я по-прежнему предлагаю использовать функции / переменные серии find_package(CUDA), поскольку мне сложно найти какой-либо документ о том, как связать / включить другие библиотеки / заголовки cuda, такие как npp, curand и т. Д.   -  person halfelf    schedule 11.04.2018
comment
В блоге разработчиков Nvidia есть хорошее объяснение того, как это можно сделать с помощью CMake 3.8+: devblogs.nvidia. ru / building-cuda-applications-cmake   -  person gflegar    schedule 11.04.2018
comment
@halfelf, что вы имеете в виду под библиотеками / заголовком cuda, большинство библиотек, которые производит Nvidia, на самом деле являются библиотеками C или C ++, которые вызывают ядра CUDA, поэтому вы просто связываете / включаете их, как любую другую библиотеку. Вот как мы это делаем для cuBLAS и cuSPARSE в разрабатываемой мной библиотеке: github.com/ginkgo-project/ginkgo/blob/develop/gpu/   -  person gflegar    schedule 11.04.2018
comment
Конкретно, для NPP, о которой вы упомянули, я не вижу в процессе связывания ничего, что не было бы обработано CMake автоматически: docs.nvidia.com/cuda/npp/index.html   -  person gflegar    schedule 11.04.2018
comment
@GoranFlegar Спасибо за пример и блог разработчиков. Я имею в виду, что при использовании find_package(CUDA) сначала мне не нужно CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES для заголовков, и мне также не нужно find_library() для каждой cuda lib, поскольку они были установлены как CUDA_xxx_LIBRARY переменные. Новая функция кажется мне немного более сложной, чем старая find_package(cuda), или, может быть, я скучаю по чему-то?   -  person halfelf    schedule 11.04.2018
comment
@halfelf Вам не нужен CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES, если вы создаете файл .cu, только если вы вызываете API времени выполнения CUDA из файла _2 _ / _ 3_. Что касается библиотек, это правда, они не предопределены, но вы всегда можете сделать для них небольшой сценарий-оболочку и включить его во все свои проекты.   -  person gflegar    schedule 12.04.2018
comment
Есть и обратная сторона использования FindCUDA: в предыдущих версиях CMake для построения кода CUDA требовались команды, такие как cuda_add_library. К сожалению, эти команды не могут участвовать в требованиях к использованию и, следовательно, не смогут использовать распространенные флаги или определения компилятора. (из блога разработчиков, на который я ссылался выше).   -  person gflegar    schedule 12.04.2018
comment
Неправильно ли я установил флаги nvcc .... попытка настройки проекта всегда компилировать с compute_20, sm_20?   -  person Dominik    schedule 12.04.2018
comment
@Dominik вы использовали устаревший findCUDA пакет или встроенную поддержку? CUDA_NVCC_FLAGS - это переменная, используемая findCUDA, встроенная поддержка CUDA вместо этого использует CMAKE_CUDA_FLAGS. Да, наличие двух вариантов очень сбивает с толку, поэтому вы должны быть осторожны в своих действиях.   -  person gflegar    schedule 14.04.2018


Ответы (1)


Я постараюсь ответить на этот вопрос, используя обсуждение из комментариев, и добавлю дополнительную информацию.

Прежде всего, есть два способа включить поддержку CUDA в CMake. Один - это старый FindCUDA модуль, а другой - новый встроенный в CUDA поддержка языка добавлена ​​в CMake 3.8 и объясняется здесь. Вы можете выбрать один или другой (но вы, вероятно, захотите использовать встроенную поддержку для новых проектов), но тогда вам придется придерживаться своего выбора.

Чтобы использовать встроенную поддержку, вы должны либо добавить ее в оператор project(...), либо использовать:

enable_language(CUDA);

Чтобы использовать старый пакет FindCUDA, вы должны использовать:

find_package(CUDA);

Обратите внимание, что в этих двух параметрах для настройки используются совершенно разные переменные. Чтобы узнать, какие переменные поддерживаются FindCUDA, см. эту страницу, а также для встроенных -в поддержке CUDA см. это (не забывайте, что заполнитель <LANG> может быть заменен любым языком, что означает, что CUDA также является одной из доступных замен).

Например. с FindCUDA вы использовали бы CUDA_NVCC_FLAGS для установки флагов компилятора вручную, а со встроенной поддержкой языка вы использовали бы CMAKE_CUDA_FLAGS для той же цели. Практическое правило: если переменная начинается с CUDA_, это часть пакета FindCUDA, а если начинается с CMAKE_, то это часть встроенной поддержки.

person gflegar    schedule 14.04.2018
comment
Каким-то образом для моего проекта, в котором используются cuda_gl_interop.h и cuda_runtime_api, простое добавление project(... CUDA) приводит к ошибке компоновщика, жалобе на «undefined ссылку на cudaSetDevice' и т. Д.». Поэтому я прибегаю к find_paclage(CUDA) и cuda_add_executable, и они отлично связываются. - person yuqli; 31.07.2020