FindCUDA
Устарело начиная с версии 3.10.
Больше не требуется использовать этот модуль или вызывать find_package(CUDA) для компиляции кода CUDA. Вместо этого, укажите CUDA среди языков, указанных в вызове команды верхнего уровня project(), или вызовите команду enable_language() с CUDA. Затем можно добавить источники CUDA (.cu) в программы непосредственно в вызовах add_library() и add_executable().
Добавлен в версии 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, не установленную по умолчанию. В более новых версиях инструментария библиотека CUDA включена с графическим драйвером — убедитесь, что версия драйвера соответствует версии среды выполнения CUDA.
Переменные ввода
Следующие переменные влияют на поведение макросов в скрипте (в алфавитном порядке). Обратите внимание, что любой из этих флагов может быть изменён несколько раз в одном каталоге перед вызовом 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) в компилятор хоста через флаг nvcc-Xcompiler. Это помогает сделать сгенерированный код хоста более соответствующим остальной части системы. Иногда определённые флаги вызывают проблемы с nvcc, и это поможет вам отключить передачу флагов. Это не влияет на флаги, заданные непосредственно в nvcc черезCUDA_NVCC_FLAGSили через флагиOPTION, заданные черезcuda_add_library(),cuda_add_executable()илиcuda_wrap_srcs(). Флаги, используемые для компиляции динамических библиотек, не затрагиваются этим флагом. -
CUDA_SEPARABLE_COMPILATION (Default: OFF) -
Если установлено, это включит раздельную компиляцию для всех файлов объектов среды выполнения CUDA. Если используется вне
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 в
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 runtime. Доступна только для 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 Direct Solver. Доступна только для 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: Библиотека расширений инструментов NVIDIA CUDA. Доступна для CUDA версии 5+.
-
CUDA_OpenCL_LIBRARY -
Новая в версии 3.16: Библиотека NVIDIA CUDA OpenCL. Доступна для CUDA версии 5+.
© 2000–2021 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.20/module/FindCUDA.html