Spec-Zone.ru › CMake 3.31

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) на компилятор хоста через флаг -Xcompiler nvcc. Это помогает сделать сгенерированный код хоста более соответствующим остальной системе. Иногда определенные флаги создают проблемы для 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API