Spec-Zone.ru › CMake

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

Spec-Zone.ru

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