FindCUDA
Предупреждение
Устарело начиная с версии 3.10.
Больше нет необходимости использовать этот модуль или вызывать find_package(CUDA) для компиляции кода CUDA. Вместо этого, укажите CUDA среди языков, указанных в вызове команды верхнего уровня project(), или вызовите команду enable_language() с CUDA. Тогда можно добавить исходные файлы CUDA (.cu) непосредственно в целевые файлы, как и для других языков.
Новое в версии 3.17: Для поиска и использования библиотек CUDA Toolkit вручную, используйте модуль FindCUDAToolkit вместо него. Он работает независимо от того, какой CUDA язык включен.
Документация по устаревшему использованию
Инструменты для построения файлов CUDA C: библиотеки и зависимости сборки.
Этот скрипт находит инструменты NVIDIA CUDA C. Он должен работать в Linux, Windows и macOS и должен быть достаточно обновлённым по отношению к выпуску CUDA C.
Новое в версии 3.19: Поддержка QNX.
Этот скрипт использует стандартные аргументы find_package() для <VERSION>, REQUIRED и QUIET. CUDA_FOUND сообщит, если была найдена приемлемая версия CUDA.
Скрипт попросит пользователя указать CUDA_TOOLKIT_ROOT_DIR, если префикс не может быть определён по расположению nvcc в пути системы и REQUIRED указано для find_package(). Чтобы использовать другую установленную версию инструментария, установите переменную среды CUDA_BIN_PATH перед запуском cmake (например, CUDA_BIN_PATH=/usr/local/cuda1.0 вместо значения по умолчанию /usr/local/cuda) или установите CUDA_TOOLKIT_ROOT_DIR после настройки. Если вы измените значение CUDA_TOOLKIT_ROOT_DIR, различные компоненты, зависящие от пути, будут перемещены.
Возможно, необходимо вручную установить CUDA_TOOLKIT_ROOT_DIR на определённых платформах или использовать CUDA runtime, не установленный по умолчанию. В новых версиях инструментария библиотека CUDA включена с графическим драйвером — убедитесь, что версия драйвера соответствует необходимой версии CUDA runtime.
Переменные ввода
Следующие переменные влияют на поведение макросов в скрипте (в алфавитном порядке). Обратите внимание, что любой из этих флагов можно изменить несколько раз в одном каталоге перед вызовом cuda_add_executable(), cuda_add_library(), cuda_compile(), cuda_compile_ptx(), cuda_compile_fatbin(), cuda_compile_cubin() или cuda_wrap_srcs():
-
CUDA_64_BIT_DEVICE_CODE (Default: host bit size) -
Установите в
ONдля компиляции 64-битного кода устройства, ВЫКЛ. для 32-битного кода устройства. Обратите внимание, что сделать это отличным от кода хоста при генерации объекта или C-файлов из кода CUDA просто не сработает, потому что size_t определяется nvcc в сгенерированном исходном коде. Если вы скомпилируете в PTX и затем сами загрузите файл, вы можете смешивать разрядности устройства и хоста. -
CUDA_ATTACH_VS_BUILD_RULE_TO_CUDA_FILE (Default: ON) -
Установите в
ON, если вы хотите, чтобы пользовательское правило сборки было прикреплено к исходному файлу в Visual Studio. Выключите, если вы добавляете один и тот же файл cuda в несколько целей.Это позволяет пользователю собрать цель из файла CUDA; однако, могут произойти нежелательные последствия, если исходный файл CUDA добавлен в несколько целей. При параллельной сборке возможно, что пользовательская команда сборки будет запущена более одного раза и параллельно, что приведёт к туманным ошибкам сборки. VS выполняет правила для каждого исходного файла в цели, и исходный файл может иметь только одно правило, независимо от того, в скольких проектах он добавлен. При запуске правила из нескольких целей могут возникнуть условия гонки для сгенерированного файла. В конечном итоге всё будет построено, но если пользователь не осведомлён об этом поведении, может возникнуть путаница. Было бы неплохо, если бы этот скрипт мог обнаружить повторное использование исходных файлов в нескольких целях и отключить этот параметр для пользователя, но не удалось найти хорошего решения.
-
CUDA_BUILD_CUBIN (Default: OFF) -
Установите в
ONдля включения дополнительного этапа компиляции с параметром-cubinв режиме устройства. Выходной код анализируется, и потребление регистров, общей памяти, отображается во время сборки. -
CUDA_BUILD_EMULATION (Default: OFF for device mode) -
Установите в
ONдля режима эмуляции.-D_DEVICEEMUопределён для файлов CUDA C, когдаCUDA_BUILD_EMULATIONравноTRUE. -
CUDA_LINK_LIBRARIES_KEYWORD (Default: "") -
Новое в версии 3.9.
Ключевое слово
<PRIVATE|PUBLIC|INTERFACE>для внутренних вызововtarget_link_libraries(). По умолчанию используется ключевое слово без ключей, которое использует старый "прямой" видtarget_link_libraries(). Обратите внимание, что это имеет значение, потому что то, что используется внутри модуляFindCUDA, также должно использоваться снаружи — два вариантаtarget_link_libraries()не могут быть смешаны. -
CUDA_GENERATED_OUTPUT_DIR (Default: CMAKE_CURRENT_BINARY_DIR) -
Установите путь, куда нужно поместить сгенерированные файлы. Если он пустой, выходные файлы будут помещены в
CMAKE_CURRENT_BINARY_DIR. Промежуточные файлы всегда будут помещены вCMAKE_CURRENT_BINARY_DIR/CMakeFiles. -
CUDA_HOST_COMPILATION_CPP (Default: ON) -
Установите в
OFFдля компиляции кода хоста на C. -
CUDA_HOST_COMPILER (Default: CMAKE_C_COMPILER) -
Установите компилятор хоста, который будет использоваться nvcc. Игнорируется, если
-ccbinили--compiler-bindirуже присутствуют в переменныхCUDA_NVCC_FLAGSилиCUDA_NVCC_FLAGS_<CONFIG>. Для целей Visual Studio компилятор хоста создаётся с одним или несколькими макросами Visual Studio, такими как$(VCInstallDir), которые расширяются до пути при запуске команды из VS.Новое в версии 3.13: Если переменная окружения
CUDAHOSTCXXустановлена, она будет использоваться по умолчанию. -
CUDA_NVCC_FLAGS, CUDA_NVCC_FLAGS_<CONFIG> -
Дополнительные аргументы командной строки NVCC. ПРИМЕЧАНИЕ: несколько аргументов должны быть разделены точкой с запятой (например,
--compiler-options;-Wall).Новое в версии 3.6: Содержание этих переменных может использовать
generator expressions. -
CUDA_PROPAGATE_HOST_FLAGS (Default: ON) -
Установите в
ONдля автоматической передачиCMAKE_{C,CXX}_FLAGSи их конфигурационно-зависимых аналогов (например,CMAKE_C_FLAGS_DEBUG) в компилятор хоста через флаг nvcc-Xcompiler. Это помогает сделать сгенерированный код хоста более согласованным с остальной системой. Иногда определённые флаги вызывают проблемы с nvcc, и это поможет вам отключить распространение флага. Это не влияет на флаги, заданные непосредственно для nvcc черезCUDA_NVCC_FLAGSили через флагиOPTION, заданные черезcuda_add_library(),cuda_add_executable(), илиcuda_wrap_srcs(). Флаги, используемые для компиляции динамических библиотек, на этот флаг не влияют. -
CUDA_SEPARABLE_COMPILATION (Default: OFF) -
Если установлено, это включит раздельно-компиляцию для всех объектов CUDA runtime. Если используется вне
cuda_add_executable()иcuda_add_library()(например, вызовcuda_wrap_srcs()напрямую), необходимо вызватьcuda_compute_separable_compilation_object_file_name()иcuda_link_separable_compilation_objects(). -
CUDA_SOURCE_PROPERTY_FORMAT -
Новое в версии 3.3.
Если свойство этого исходного файла установлено, оно может переопределить формат, указанный для
cuda_wrap_srcs()(OBJ,PTX,CUBIN, илиFATBIN). Если входной исходный файл не является файлом.cu, установка этого файла приведёт к его обработке как файла.cu. Смотрите документацию по set_source_files_properties, как установить это свойство. -
CUDA_USE_STATIC_CUDA_RUNTIME (Default: ON) -
Новое в версии 3.3.
При включении будет использоваться статическая версия библиотеки CUDA runtime в
CUDA_LIBRARIES. Если настроенная версия CUDA не поддерживает этот параметр, он будет отключён без сообщений. -
CUDA_VERBOSE_BUILD (Default: OFF) -
Установите в
ONдля отображения всех команд, используемых при построении файла CUDA. При использовании генератора Makefile значение по умолчанию равноVERBOSE(запуститеmake VERBOSE=1для просмотра вывода), хотя установкаCUDA_VERBOSE_BUILDвONвсегда будет отображать вывод.
Команды
Скрипт создаёт следующие функции и макросы (в алфавитном порядке):
cuda_add_cufft_to_target(<cuda_target>)
Добавляет библиотеку cufft в целевой файл (любой). Обрабатывает, находитесь ли вы в режиме эмуляции или нет.
cuda_add_cublas_to_target(<cuda_target>)
Добавляет библиотеку cublas в целевой файл (любой). Обрабатывает, находитесь ли вы в режиме эмуляции или нет.
cuda_add_executable(<cuda_target> <file>...
[WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] [OPTIONS ...])
Создаёт исполняемый <cuda_target>, состоящий из указанных файлов. Все файлы, не относящиеся к CUDA C, компилируются с использованием стандартных правил сборки, определённых CMake, а файлы CUDA компилируются в объектные файлы с помощью nvcc и хост-компилятора. Кроме того, CUDA_INCLUDE_DIRS автоматически добавляется в include_directories(). Некоторые стандартные вызовы CMake для целевого объекта могут быть использованы после вызова этой макрокоманды (например, set_target_properties() и target_link_libraries()), но установка свойств, изменяющих флаги компиляции, не повлияет на код, скомпилированный с помощью nvcc. Такие флаги следует изменить до вызова cuda_add_executable(), cuda_add_library() или cuda_wrap_srcs().
cuda_add_library(<cuda_target> <file>...
[STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] [OPTIONS ...])
То же, что и cuda_add_executable(), за исключением того, что создаётся библиотека.
cuda_build_clean_target()
Создаёт целевой объект для удаления всех сгенерированных файлов зависимостей. Необходимо выполнить команду clean после запуска этого целевого объекта, чтобы убедиться, что файлы зависимостей были перегенерированы.
cuda_compile(<generated_files> <file>... [STATIC | SHARED | MODULE]
[OPTIONS ...])
Возвращает список сгенерированных файлов из входных исходных файлов для использования с add_library() или add_executable().
cuda_compile_ptx(<generated_files> <file>... [OPTIONS ...])
Возвращает список PTX файлов, сгенерированных из входных исходных файлов.
cuda_compile_fatbin(<generated_files> <file>... [OPTIONS ...])
Новая версия 3.1.
Возвращает список FATBIN файлов, сгенерированных из входных исходных файлов.
cuda_compile_cubin(<generated_files> <file>... [OPTIONS ...])
Новая версия 3.1.
Возвращает список CUBIN файлов, сгенерированных из входных исходных файлов.
cuda_compute_separable_compilation_object_file_name(<output_file_var>
<cuda_target>
<object_files>)
Вычисляет имя промежуточного файла связи, используемого для разделения компиляции. Это имя файла обычно передаётся в CUDA_LINK_SEPARABLE_COMPILATION_OBJECTS. Переменная output_file_var генерируется на основе cuda_target, списка объектных файлов, требующих разделения компиляции, как указано в <object_files>. Если список <object_files> пуст, то <output_file_var> будет пустым. Эта функция вызывается автоматически для cuda_add_library() и cuda_add_executable(). Обратите внимание, что это функция, а не макрос.
cuda_include_directories(path0 path1 ...)
Устанавливает каталоги, которые должны быть переданы в nvcc (например, nvcc -Ipath0 -Ipath1 ...). Эти пути обычно содержат другие файлы .cu.
cuda_link_separable_compilation_objects(<output_file_var> <cuda_target>
<nvcc_flags> <object_files>)
Генерирует объектный файл связи, необходимый для разделения компиляции, из заданных объектных файлов. Это вызывается автоматически для cuda_add_executable() и cuda_add_library(), но может вызываться вручную при прямом использовании cuda_wrap_srcs(). При вызове из cuda_add_library() или cuda_add_executable() передаваемые <nvcc_flags> соответствуют флагам, переданным через аргумент OPTIONS. Единственный флаг nvcc, который добавляется автоматически, — это флаг разрядности, как указано в CUDA_64_BIT_DEVICE_CODE. Обратите внимание, что это функция, а не макрос.
cuda_select_nvcc_arch_flags(<out_variable> [<target_CUDA_architecture> ...])
Выбирает флаги архитектуры GPU для nvcc на основе target_CUDA_architecture.
Значения для target_CUDA_architecture:
-
Auto: определяет локальную архитектуру вычислений GPU на машине во время выполнения. -
CommonиAll: охватывают общие и полные подмножества архитектур. -
<name>: один изFermi,Kepler,Maxwell,Kepler+Tegra,Kepler+Tesla,Maxwell+Tegra,Pascal. -
<ver>,<ver>(<ver>),<ver>+PTX, где<ver>— один из2.0,2.1,3.0,3.2,3.5,3.7,5.0,5.2,5.3,6.0,6.2.
Возвращает список флагов, которые нужно добавить к CUDA_NVCC_FLAGS в <out_variable>. Кроме того, устанавливает <out_variable>_readable в полученный числовой список.
Пример:
cuda_select_nvcc_arch_flags(ARCH_FLAGS 3.0 3.5+PTX 5.2(5.0) Maxwell)
list(APPEND CUDA_NVCC_FLAGS ${ARCH_FLAGS})
Дополнительная информация об архитектурах CUDA: https://en.wikipedia.org/wiki/CUDA. Обратите внимание, что это функция, а не макрос.
cuda_wrap_srcs(<cuda_target> <format> <generated_files> <file>...
[STATIC | SHARED | MODULE] [OPTIONS ...])
Здесь происходит вся магия. cuda_add_executable(), cuda_add_library(), cuda_compile() и cuda_compile_ptx() все обращаются к этой функции.
На основе списка файлов <file>... эта макрокоманда генерирует пользовательские команды, которые генерируют либо PTX, либо подключаемые объекты (для переключения используйте PTX или OBJ для аргумента <format>). Файлы, которые не оканчиваются на .cu или не имеют свойства HEADER_FILE_ONLY, игнорируются.
Аргументы, переданные после OPTIONS, — это дополнительные параметры командной строки для nvcc. Вы также можете указать параметры для каждой конфигурации, указав имя конфигурации и параметры. Общие параметры должны предшествовать параметрам, специфичным для конфигурации. Необходимо указывать не все конфигурации, а только те, которые указаны. Например:
cuda_add_executable(... OPTIONS -DFLAG=2 "-DFLAG_OTHER=space in flag" DEBUG -g RELEASE --use_fast_math RELWITHDEBINFO --use_fast_math;-g MINSIZEREL --use_fast_math)
Для некоторых конфигураций (в частности, для VS, генерирующей объектные файлы с CUDA_ATTACH_VS_BUILD_RULE_TO_CUDA_FILE установленным в ON ), для данного файла CUDA не будет создан ни один сгенерированный файл. Это происходит потому, что при добавлении файла CUDA в Visual Studio Visual Studio знает, что этот файл генерирует объектный файл, и автоматически подключит полученный объектный файл.
Этот скрипт также сгенерирует отдельный скрипт cmake, который используется во время сборки для вызова nvcc. Это сделано по нескольким причинам:
- nvcc может возвращать отрицательные числа в качестве возвращаемых значений, что вводит Visual Studio в заблуждение, заставляя её думать, что команда выполнена успешно. Скрипт теперь проверяет коды ошибок и генерирует ошибки, когда возникла проблема.
- Было известно, что nvcc не удаляет неполные результаты при возникновении проблем. Это вводит в заблуждение системы сборки, заставляя их думать, что целевой объект был сгенерирован, в то время как на самом деле существует неиспользуемый файл. Скрипт теперь удаляет выходные файлы, если произошла ошибка.
- Путем размещения всех параметров, влияющих на сборку, в файле и затем установкой правила сборки в зависимость от файла выходные файлы будут перегенерированы при изменении параметров.
Этот скрипт также анализирует необязательные аргументы STATIC, SHARED или MODULE, чтобы определить, когда следует нацеливаться на компиляцию объектов для общей библиотеки. BUILD_SHARED_LIBS игнорируется в cuda_wrap_srcs(), но учитывается в cuda_add_library(). В некоторых системах добавляются специальные флаги для построения объектов, предназначенных для общих библиотек. Макрос препроцессора <target_name>_EXPORTS определён при обнаружении компиляции общей библиотеки.
Флаги, переданные в add_definitions с -D или /D передаются nvcc.
Переменные результатов
Скрипт определяет следующие переменные:
-
CUDA_VERSION_MAJOR -
Основная версия cuda, как сообщается nvcc.
-
CUDA_VERSION_MINOR -
Дополнительная версия.
-
CUDA_VERSION, CUDA_VERSION_STRING -
Полная версия в формате
X.Y. -
CUDA_HAS_FP16 -
Новое в версии 3.6: Поддерживается ли короткий тип float (
float16,fp16). -
CUDA_TOOLKIT_ROOT_DIR -
Путь к CUDA Toolkit (определяется, если не задан).
-
CUDA_SDK_ROOT_DIR -
Путь к CUDA SDK. Используйте его для поиска файлов в SDK. Этот скрипт не будет напрямую поддерживать поиск определённых библиотек или заголовков, так как это не поддерживается NVIDIA. Если вы хотите изменить библиотеки при изменении пути, см. скрипт
FindCUDA.cmake, чтобы узнать, как очистить эти переменные. Есть также примеры того, как использоватьCUDA_SDK_ROOT_DIR, чтобы найти заголовки или библиотеки, если вы этого захотите (на свой страх и риск). -
CUDA_INCLUDE_DIRS -
Директория включения заголовков cuda. Добавляется автоматически для
cuda_add_executable()иcuda_add_library(). -
CUDA_LIBRARIES -
Библиотека CUDA RT.
-
CUDA_CUFFT_LIBRARIES -
Библиотека устройства или эмуляции для реализации CUDA FFT (альтернатива макросу
cuda_add_cufft_to_target()). -
CUDA_CUBLAS_LIBRARIES -
Библиотека устройства или эмуляции для реализации CUDA BLAS (альтернатива макросу
cuda_add_cublas_to_target()). -
CUDA_cudart_static_LIBRARY -
Статически подключаемая библиотека CUDA runtime. Доступна только для CUDA версии 5.5+.
-
CUDA_cudadevrt_LIBRARY -
Новое в версии 3.7: Библиотека времени выполнения устройства. Требуется для раздельной компиляции.
-
CUDA_cupti_LIBRARY -
Библиотека интерфейса CUDA Profiling Tools. Доступна только для CUDA версии 4.0+.
-
CUDA_curand_LIBRARY -
Библиотека генерации случайных чисел CUDA. Доступна только для CUDA версии 3.2+.
-
CUDA_cusolver_LIBRARY -
Новое в версии 3.2: Библиотека CUDA Direct Solver. Доступна только для CUDA версии 7.0+.
-
CUDA_cusparse_LIBRARY -
Библиотека CUDA Sparse Matrix. Доступна только для CUDA версии 3.2+.
-
CUDA_npp_LIBRARY -
Библиотека NVIDIA Performance Primitives. Доступна только для CUDA версии 4.0+.
-
CUDA_nppc_LIBRARY -
Библиотека NVIDIA Performance Primitives (core). Доступна только для CUDA версии 5.5+.
-
CUDA_nppi_LIBRARY -
Библиотека NVIDIA Performance Primitives (обработка изображений). Доступна только для CUDA версии 5.5 - 8.0.
-
CUDA_nppial_LIBRARY -
Библиотека NVIDIA Performance Primitives (обработка изображений). Доступна только для CUDA версии 9.0.
-
CUDA_nppicc_LIBRARY -
Библиотека NVIDIA Performance Primitives (обработка изображений). Доступна только для CUDA версии 9.0.
-
CUDA_nppicom_LIBRARY -
Библиотека NVIDIA Performance Primitives (обработка изображений). Доступна только для CUDA версии 9.0 - 10.2. Заменена на nvjpeg.
-
CUDA_nppidei_LIBRARY -
Библиотека NVIDIA Performance Primitives (обработка изображений). Доступна только для CUDA версии 9.0.
-
CUDA_nppif_LIBRARY -
Библиотека NVIDIA Performance Primitives (обработка изображений). Доступна только для CUDA версии 9.0.
-
CUDA_nppig_LIBRARY -
Библиотека NVIDIA Performance Primitives (обработка изображений). Доступна только для CUDA версии 9.0.
-
CUDA_nppim_LIBRARY -
Библиотека NVIDIA Performance Primitives (обработка изображений). Доступна только для CUDA версии 9.0.
-
CUDA_nppist_LIBRARY -
Библиотека NVIDIA Performance Primitives (обработка изображений). Доступна только для CUDA версии 9.0.
-
CUDA_nppisu_LIBRARY -
Библиотека NVIDIA Performance Primitives (обработка изображений). Доступна только для CUDA версии 9.0.
-
CUDA_nppitc_LIBRARY -
Библиотека NVIDIA Performance Primitives (обработка изображений). Доступна только для CUDA версии 9.0.
-
CUDA_npps_LIBRARY -
Библиотека NVIDIA Performance Primitives (обработка сигналов). Доступна только для CUDA версии 5.5+.
-
CUDA_nvcuvenc_LIBRARY -
Библиотека кодирования видео CUDA. Доступна только для CUDA версии 3.2+. Только Windows.
-
CUDA_nvcuvid_LIBRARY -
Библиотека декодирования видео CUDA. Доступна только для CUDA версии 3.2+. Только Windows.
-
CUDA_nvToolsExt_LIBRARY -
Новое в версии 3.16: Библиотека расширений NVIDIA CUDA Tools. Доступна для CUDA версии 5+.
-
CUDA_OpenCL_LIBRARY -
Новое в версии 3.16: Библиотека NVIDIA CUDA OpenCL. Доступна для CUDA версии 5+.
© 2000–2022 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.25/module/FindCUDA.html