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. Установите в 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()
Создаёт целевой объект для удаления всех сгенерированных файлов зависимостей. После выполнения этого целевого объекта следует выполнить очистку, чтобы убедиться в повторном сгенерировании файлов зависимостей.
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: Библиотека расширений инструментов NVIDA CUDA. Доступна для версии CUDA 5+.
-
CUDA_OpenCL_LIBRARY -
Добавлена в версии 3.16: Библиотека NVIDA CUDA OpenCL. Доступна для версии CUDA 5+.
© 2000–2021 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.22/module/FindCUDA.html