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для компиляции кода хоста на С. -
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()
Создаёт целевой объект, удаляющий все сгенерированные файлы зависимостей. Вы должны выполнить «чистку» (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. Доступна только для 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: Библиотека расширений инструментов 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/latest/module/FindCUDA.html