FindCUDA
Изменено в версии 3.27: Этот модуль доступен только если политика CMP0146 не установлена в значение NEW. Переносите проекты в CMake с первой поддержкой языка CUDA.
Устаревшее с версии 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-битного кода устройства, OFF для 32-битного кода устройства. Обратите внимание, что различие от кода хоста при генерации объекта или файлов C из кода CUDA не сработает, так как size_t определен nvcc в сгенерированном исходном коде. Если вы компилируете в PTX и затем загружаете файл сами, вы можете смешивать разрядности устройства и хоста. -
CUDA_ATTACH_VS_BUILD_RULE_TO_CUDA_FILE (Default: ON) -
Установите в
ON, если вы хотите, чтобы пользовательское правило сборки было прикреплено к файлу исходного кода в Visual Studio. Установите значение OFF, если вы добавляете один и тот же файл 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 он знает, что этот файл создаёт объектный файл, и будет автоматически подключать результирующий объектный файл.
Этот скрипт также сгенерирует отдельный скрипт 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. Доступна только для версии CUDA 5.5 и выше.
-
CUDA_cudadevrt_LIBRARY -
Новая в версии 3.7: Библиотека времени выполнения устройства. Требуется для раздельной компиляции.
-
CUDA_cupti_LIBRARY -
Библиотека интерфейса инструментов профилирования CUDA. Доступна только для версии CUDA 4.0 и выше.
-
CUDA_curand_LIBRARY -
Библиотека генерации случайных чисел CUDA. Доступна только для версии CUDA 3.2 и выше.
-
CUDA_cusolver_LIBRARY -
Новая в версии 3.2: Библиотека прямого решения CUDA. Доступна только для версии CUDA 7.0 и выше.
-
CUDA_cusparse_LIBRARY -
Библиотека разреженных матриц CUDA. Доступна только для версии CUDA 3.2 и выше.
-
CUDA_npp_LIBRARY -
Библиотека NVIDIA Performance Primitives. Доступна только для версии CUDA 4.0 и выше.
-
CUDA_nppc_LIBRARY -
Библиотека NVIDIA Performance Primitives (ядро). Доступна только для версии 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: Библиотека расширений инструментов CUDA NVIDA. Доступна для версии CUDA 5+.
-
CUDA_OpenCL_LIBRARY -
Новая в версии 3.16: Библиотека CUDA OpenCL NVIDA. Доступна для версии CUDA 5+.
© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.29/module/FindCUDA.html