GPGPU (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи GPGPU. Дата последней синхронизации: 6 декабря 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

GPGPU (General-purpose computing on graphics processing units) — неспециализированные вычисления на графических процессорах. Другими словами, это означает выполнение на видеокарте вычислений, не относящихся непосредственно к графике.

OpenCL

OpenCL (Open Computing Language) — это открытая, не требующая лицензионных отчислений спецификация параллельного программирования, разработанная некоммерческим консорциумом Khronos Group.

Спецификация OpenCL описывает язык программирования, общую среду, которая должна присутствовать, и C API, позволяющий программистам обращаться к этой среде.

Совет: С помощью утилиты clinfo можно посмотреть список платформ OpenCL, присутствующих устройств и свойств загрузчика ICD.

Среда выполнения

Для выполнения программ, использующих OpenCL, необходимо установить совместимую аппаратную среду выполнения.

AMD/ATI

  • opencl-mesa[ссылка недействительна: package not found]: свободная среда выполнения для AMDGPU и ATI
  • opencl-amdAUR, opencl-amd-devAUR: ROCr OpenCL и legacy OpenCL (он же orca), перепакованные из релизов AMD для ubuntu (эквивалентно указанию opencl=rocr,legacy в ubuntu amdgpu-install)
  • opencl-legacy-amdgpu-proAUR: legacy OpenCL (также известное как orca), перепакованное из релизов AMD для ubuntu (эквивалентно указанию opencl=legacy в amdgpu-install для ubuntu).
  • rocm-opencl-runtime: Часть вычислительного стека AMD ROCm GPU, официально поддерживающая карты GFX8 и более поздние версии (Fiji, Polaris, Vega), с неофициальной и частичной поддержкой карт на базе Navi10 (похоже, но не эквивалентно указанию opencl=rocr в ubuntu amdgpu-install, потому что версия rocm этого пакета отличается от версии установщика ubuntu). Для поддержки карт старше Vega нужно установить переменную времени выполнения ROC_ENABLE_PRE_VEGA=1.
  • amdapp-sdkAUR: AMD CPU среда выполнения

NVIDIA

Intel

  • intel-compute-runtime: также известная как среда выполнения Neo OpenCL, реализация с открытым исходным кодом для графического процессора Intel HD Graphics на платформах Gen8 (Broadwell) и последующих.
  • beignetAUR: реализация с открытым исходным кодом для GPU Intel HD Graphics на Gen7 (Ivy Bridge) и последующих платформах, которая была отменена компанией Intel в пользу драйвера NEO OpenCL, остаётся рекомендуемым решением для устаревших аппаратных платформ (например, Ivy Bridge, Haswell).
  • intel-openclAUR: проприетарная реализация для графического процессора Intel HD Graphics на Gen7 (Ivy Bridge) и последующих платформах, отменённая Intel в пользу драйвера NEO OpenCL, остаётся рекомендуемым решением для устаревших аппаратных платформ (например, Ivy Bridge, Haswell).
  • intel-opencl-runtimeAUR: реализация для процессоров Intel Core и Xeon. Она также поддерживает процессоры других производителей.

Прочие

  • pocl: Реализация OpenCL на базе LLVM (аппаратно независимая)

Компилятор и транслятор позволяют запускать приложения OpenCL в среде Vulkan.

  • clspv-gitAUR: прототип компилятора подмножества OpenCL C для вычислительных шейдеров Vulkan.
  • clvk: прототип реализации OpenCL 3.0 поверх Vulkan с использованием clspv в качестве компилятора.
  • xrt-binAUR: Xilinx Run Time для FPGA xrt
  • fpga-runtime-for-opencl: FPGA Runtime

32-битная среда выполнения

Для выполнения 32-битных программ, использующих OpenCL, необходимо установить совместимую аппаратную 32-битную среду выполнения.

Совет: Утилита clinfo может использоваться только для получения списка 64-битных платформ OpenCL, присутствующих устройств и свойств загрузчика ICD. Для 32-битных платформ необходимо скомпилировать clinfo для 32-бит или использовать 32-битный clinfo[устаревшая ссылка 2023-06-17 ⓘ] из проекта archlinux32.

AMD/ATI

NVIDIA

Загрузчик ICD (libOpenCL.so)

ICD Loader должен быть библиотекой, не зависящей от платформы, которая предоставляет средства для загрузки драйверов конкретных устройств через OpenCL API. Большинство производителей OpenCL предоставляют свою собственную реализацию загрузчика OpenCL ICD, и все они должны работать с реализациями OpenCL других производителей. К сожалению, большинство производителей не предоставляют достаточно актуальные загрузчики ICD, поэтому Arch Linux решил использовать библиотеку из отдельного проекта (ocl-icd), который в настоящее время предоставляет функционирующую реализацию текущего OpenCL API.

Другие библиотеки загрузчика ICD устанавливаются как часть SDK каждого производителя. Если вы хотите, чтобы использовался загрузчик ICD из пакета ocl-icd, вы можете создать файл в /etc/ld.so.conf.d, который добавляет /usr/lib в каталоги поиска динамического загрузчика программ:

/etc/ld.so.conf.d/00-usrlib.conf
/usr/lib

Это необходимо, поскольку все SDK добавляют каталоги lib своей среды выполнения в путь поиска через файлы ld.so.conf.d.

Доступные пакеты с реализациями OpenCL ICD:

  • ocl-icd: рекомендуется, самый актуальный
  • intel-openclAUR от Intel. Обеспечивает OpenCL 2.0, объявлен устаревшим в пользу intel-compute-runtime.
Примечание: Поставщик загрузчика ICD упоминается только для идентификации каждого загрузчика, в остальном он совершенно не важен. Загрузчики ICD не зависят от производителя и могут использоваться как взаимозаменяемые (при условии, что они реализованы правильно).

Разработка

Для разработки на OpenCL минимально необходимыми дополнительными пакетами являются:

  • ocl-icd: Реализация загрузчика OpenCL ICD, соответствующая последней спецификации OpenCL.
  • opencl-headers: Заголовки API OpenCL C/C++.

SDK производителей предоставляют множество инструментов и вспомогательных библиотек:

  • intel-opencl-sdkAUR: Intel OpenCL SDK (старая версия, новые OpenCL SDK включены в INDE и Intel Media Server Studio)
  • amdapp-sdkAUR: Этот пакет устанавливается как /opt/AMDAPP и помимо файлов SDK содержит ряд примеров кода (/opt/AMDAPP/SDK/samples/). Он также предоставляет утилиту clinfo, которая отображает список платформ и устройств OpenCL, присутствующих в системе, и отображает подробную информацию о них. Поскольку SDK сам содержит драйвер CPU OpenCL, для выполнения OpenCL на устройствах CPU (независимо от их производителя) дополнительный драйвер не требуется.
  • cuda: SDK для GPU от Nvidia, который включает поддержку OpenCL 1.1.

Реализации

Чтобы узнать, какие реализации OpenCL в настоящее время активны в вашей системе, используйте следующую команду:

$ ls /etc/OpenCL/vendors

Чтобы узнать все возможные (известные) свойства платформы OpenCL и устройств, доступных в системе, установите clinfo.

Привязки для языков программирования

SYCL

SYCL — ещё один открытый и бесплатный стандарт от Khronos Group, который определяет гетерогенную модель программирования с одним источником для C++ поверх OpenCL 1.2.

SYCL состоит из среды выполнения и компилятора C++. Компилятор может быть нацелен на любое количество и любой вид ускорителей. Среда выполнения необходима для возврата к выполнению кода на процессоре в случае, если реализация OpenCL не найдена.

Реализации

  • computecppAUR: Проприетарная реализация SYCL 1.2.1 от Codeplay. В качестве целевых устройств могут использоваться SPIR, SPIR-V и экспериментально PTX (NVIDIA).
  • trisycl-gitAUR: Реализация с открытым исходным кодом, в основном под руководством компании Xilinx.
  • hipsycl-cuda-gitAUR и hipsycl-rocm-gitAUR: Бесплатная реализация, построенная на HIP от AMD вместо OpenCL. Может работать на графических процессорах AMD и NVIDIA.

Проверка наличия поддержки SPIR

Большинство реализаций SYCL способны компилировать код ускорителя в SPIR или SPIR-V. Оба эти языка являются промежуточными языками, разработанными компанией Khronos, которые могут быть использованы драйвером OpenCL. Чтобы проверить, поддерживаются ли SPIR или SPIR-V, можно использовать clinfo:

$ clinfo | grep -i spir
Platform Extensions                             cl_khr_icd cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_byte_addressable_store cl_khr_depth_images cl_khr_3d_image_writes cl_intel_exec_by_local_thread cl_khr_spir cl_khr_fp64 cl_khr_image2d_from_buffer cl_intel_vec_len_hint
  IL version                                    SPIR-V_1.0
  SPIR versions                                 1.2

ComputeCpp дополнительно поставляется с инструментом, который суммирует соответствующую системную информацию:

$ computecpp_info
Device 0:

  Device is supported                     : UNTESTED - Untested OS
  CL_DEVICE_NAME                          : Intel(R) Core(TM) i7-4770K CPU @ 3.50GHz
  CL_DEVICE_VENDOR                        : Intel(R) Corporation
  CL_DRIVER_VERSION                       : 18.1.0.0920
  CL_DEVICE_TYPE                          : CL_DEVICE_TYPE_CPU

Известно, что драйверы, по крайней мере, частично поддерживают SPIR или SPIR-V, в том числе intel-compute-runtime, intel-opencl-runtimeAUR, pocl и amdgpu-pro-openclAUR[ссылка недействительна: package not found].

Разработка

Для разработки с использованием SYCL требуется рабочее окружение C++11. Существует несколько библиотек с открытым исходным кодом:

  • ComputeCpp SDK: Коллекция примеров кода, интеграция cmake для ComputeCpp
  • SYCL-DNN: Примитивы производительности нейронной сети
  • SYCL-BLAS: Примитивы производительности линейной алгебры
  • VisionCpp: Библиотека компьютерного зрения
  • SYCL Parallel STL: GPU-реализация параллельных алгоритмов C++17

CUDA

CUDA (Compute Unified Device Architecture) — это проприетарная архитектура параллельных вычислений с закрытым исходным кодом и фреймворк от NVIDIA. CUDA требует наличия графического процессора NVIDIA и состоит из нескольких компонентов:

  • Обязательные:
    • Проприетарный модуль ядра NVIDIA
    • Библиотеки "драйвера" и "среды выполнения" CUDA
  • Опциональные:
    • Дополнительные библиотеки: CUBLAS, CUFFT, CUSPARSE и др.
    • Инструментарий CUDA, включая компилятор nvcc
    • CUDA SDK, который содержит множество примеров кода и примеров программ CUDA и OpenCL

Модуль ядра и библиотека "драйвера" CUDA поставляются в nvidia и opencl-nvidia. Библиотека "runtime" и остальной инструментарий CUDA доступны в cuda. cuda-gdb требует установки ncurses5-compat-libsAUR, см. FS#46598.

Разработка

Пакет cuda устанавливает все компоненты в каталог /opt/cuda. Для компиляции кода CUDA добавьте /opt/cuda/include в пути для включения в настройках компилятора. Например, это можно сделать, добавив -I/opt/cuda/include во флаги/опции компилятора. Чтобы использовать nvcc — обёртку над gcc, которую предоставляет NVIDIA, — добавьте /opt/cuda/bin в ваш PATH.

Чтобы проверить, была ли установка успешной и работает ли CUDA, можно скомпилировать примеры CUDA. Одним из способов проверки установки является запуск примера deviceQuery.

Привязки для языков программирования

ROCm

ROCm[устаревшая ссылка 2024-01-13 ⓘ] (Radeon Open Compute) — это архитектура и структура параллельных вычислений с открытым исходным кодом от AMD. Хотя она требует наличия графического процессора AMD, некоторые инструменты ROCm не привязаны к конкретному оборудованию. Смотрите Репозиторий ROCm для Arch Linux для получения дополнительной информации и инструкций по установке.

HIP

Heterogeneous Interface for Portability (HIP)[устаревшая ссылка 2023-05-20 ⓘ] — это специализированная среда программирования GPU от AMD для разработки высокопроизводительных ядер на GPU. HIP — это API среды выполнения и язык программирования C++, который позволяет разработчикам создавать переносимые приложения на различных платформах.

  • rocm-hip-runtime: Базовая среда выполнения, пакеты для запуска приложений HIP на платформе AMD.
  • hip-runtime-amd: Гетерогенный интерфейс для AMDGPU в ROCm. Поддерживает GPU от архитектуры Polaris (серия RX 500) до новейшей архитектуры AMD RDNA 2 (серия RX 6000).
  • hip-runtime-nvidiaAUR: Гетерогенный интерфейс для графических процессоров NVIDIA в ROCm.
Совет:

OpenMP

Пакет openmp-extrasAUR предоставляет AOMP — компилятор на базе Clang/LLVM с открытым исходным кодом и добавленной поддержкой API OpenMP на графических процессорах AMD.

OpenCL

Пакет rocm-opencl-runtime — это часть фреймворка ROCm, предоставляющий среду выполнения OpenCL.

Поддержка изображений OpenCL

Последние версии ROCm теперь включают поддержку изображений OpenCL, используемых программами с ускорением GPGPU, такими как Darktable. ROCm с графическим драйвером AMDGPU с открытым исходным кодом — это всё, что требуется. AMDGPU PRO не требуется.

$ /opt/rocm/bin/clinfo | grep -i "image support"
Image support                                   Yes

Список программ, использующих GPGPU

  • Bitcoin
  • Blender – Поддержка CUDA для графических процессоров Nvidia и поддержка HIP для графических процессоров AMD. Дополнительная информация здесь.
  • BOINC
  • FFmpeg – дополнительная информация здесь.
  • Folding@home
  • GIMP – экспериментальная поддержка, подробнее здесь.
  • HandBrake
  • Hashcat
  • LibreOffice Calc – подробнее здесь.
  • clinfo – Ищет все возможные (известные) свойства платформы OpenCL и устройства, доступные в системе.
  • cuda_memtestAUR – тестирование памяти видеокарты. Несмотря на своё название, он поддерживает как CUDA, так и OpenCL.
  • darktable – Для работы функции OpenCL требуется не менее 1 ГБ ОЗУ на GPU и #Поддержка изображений OpenCL.
  • DaVinci Resolve - нелинейный видеоредактор. Может использовать как OpenCL, так и CUDA.
  • imagemagick
  • lc0AUR - Используется для поиска нейронной сети (поддерживает tensorflow, OpenCL, CUDA и openblas).
  • opencv
  • pyritAUR
  • python-pytorch-cuda - PyTorch с бэкендом CUDA
  • tensorflow-cuda - Порт TensorFlow на CUDA
  • tensorflow-computecppAUR - Порт TensorFlow на SYCL
  • xmrig - Высокопроизводительный майнер CryptoNote на CPU и GPU (OpenCL, CUDA)

Смотрите также