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-битного кода устройства, OFF для 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) в компилятор хоста через флаг-Xcompilernvcc. Это помогает лучше согласовать сгенерированный код хоста с остальной системой. Иногда определенные флаги создают проблемы для 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()
Создаёт целевой объект для удаления всех сгенерированных файлов зависимостей. Необходимо выполнить операцию «очистка» после запуска этой цели, чтобы гарантировать, что файлы зависимостей будут перегенерированы.
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 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.23/module/FindCUDA.html