FindCUDA
Изменено в версии 3.27: Этот модуль доступен только если политика CMP0146 не установлена в NEW. Переместите проекты в CMake's первую поддержку языка 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 в системной переменной PATH, а 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: Библиотека устройства runtime. Требуется для независимой компиляции.
-
CUDA_cupti_LIBRARY -
Библиотека CUDA Profiling Tools Interface. Доступна только для 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 (ядро). Доступна только для 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 Tools NVIDIA. Доступна для CUDA версии 5+.
-
CUDA_OpenCL_LIBRARY -
Добавлена в версии 3.16: Библиотека NVIDIA CUDA OpenCL. Доступна для CUDA версии 5+.
© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.31/module/FindCUDA.html