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. Выключите, если вы добавляете один и тот же файл 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()
Создаёт целевой объект, удаляющий все сгенерированные файлы зависимостей. Следует выполнить операцию «очистка» (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 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–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.27/module/FindCUDA.html