GPGPU

来自 ArchWiki

GPGPU 代表 图形处理器上的通用计算

OpenCL

OpenCL (开放计算语言) 是由非营利性联盟 Khronos Group 开发的开放、免版税的并行编程规范。

OpenCL 规范描述了一种编程语言、一个需要存在的通用环境以及一个 C API,使程序员能够调用此环境。

提示: clinfo 实用程序可用于列出 OpenCL 平台、存在的设备和 ICD 加载器属性。

运行时

执行使用 OpenCL 的程序,需要安装兼容的硬件运行时。

AMD/ATI

  • opencl-clover-mesaopencl-rusticl-mesa:使用 clover 和 rusticl 为 mesa 驱动程序提供 OpenCL 支持
  • rocm-opencl-runtime:AMD 的 ROCm GPU 计算堆栈的一部分,官方支持 小范围的 GPU 型号(其他显卡可能在非官方或部分支持下工作)。为了支持 Vega 之前的显卡,您需要设置运行时变量 ROC_ENABLE_PRE_VEGA=1。这类似于但不完全等同于在 ubuntu 的 amdgpu-install 中指定 opencl=rocr,因为此软件包的 rocm 版本与 ubuntu 的安装程序版本不同。
  • opencl-legacy-amdgpu-proAUR:从 AMD 的 ubuntu 版本重新打包的旧版 Orca OpenCL。等同于在 ubuntu 的 amdgpu-install 中指定 opencl=legacy
  • opencl-amdAUR, opencl-amd-devAUR:从 AMD 的 Ubuntu 版本重新打包的 ROCm 组件。等同于在 ubuntu 的 amdgpu-install 中指定 opencl=rocr,legacy
  • amdapp-sdkAUR:AMD CPU 运行时

NVIDIA

Intel

  • intel-compute-runtime:又名 Neo OpenCL 运行时,适用于 Gen12 (Alder Lake) 及更高版本 Intel HD Graphics GPU 的开源实现。
  • intel-compute-runtime-legacyAUR:与上述相同,仅适用于 Gen11(Rocket Lake) 及更低版本
  • opencl-clover-mesaopencl-rusticl-mesa:使用 clover 和 rusticl 为 mesa 驱动程序提供 OpenCL 支持
  • beignetAUR:适用于 Gen7 (Ivy Bridge) 及更高版本 Intel HD Graphics GPU 的开源实现,已被 Intel 弃用,转而支持 NEO OpenCL 驱动程序,但仍然是旧硬件平台(例如 Ivy Bridge、Haswell)的推荐解决方案。
  • intel-openclAUR:适用于 Gen7 (Ivy Bridge) 及更高版本 Intel HD Graphics GPU 的专有实现,已被 Intel 弃用,转而支持 NEO OpenCL 驱动程序,但仍然是旧硬件平台(例如 Ivy Bridge、Haswell)的推荐解决方案。
  • intel-opencl-runtimeAUR:适用于 Intel Core 和 Xeon 处理器的实现。它也支持非 Intel CPU。

其他

  • pocl:基于 LLVM 的 OpenCL 实现(硬件无关)

有编译器和转换器可以使 OpenCL 应用程序在 Vulkan 运行时上运行。

  • clspv-gitAUR:Clspv 是 OpenCL C 子集到 Vulkan 计算着色器的原型编译器。
  • clvk-gitAUR:clvk 是基于 Vulkan 的 OpenCL 3.0 原型实现,使用 clspv 作为编译器。
  • xrt-binAUR:用于 FPGA 的 Xilinx 运行时 xrt
  • fpga-runtime-for-opencl:FPGA 运行时

32 位运行时

执行使用 OpenCL 的 32 位程序,需要安装兼容的硬件 32 位运行时。

提示: clinfo 实用程序只能用于列出 64 位 OpenCL 平台、存在的设备和 ICD 加载器属性。对于 32 位,您需要为 32 位编译 clinfo,或使用 archlinux32 项目中的 32 位 clinfo

AMD/ATI

NVIDIA

ICD 加载器 (libOpenCL.so)

OpenCL ICD 加载器应该是一个平台无关的库,它提供通过 OpenCL API 加载特定于设备的驱动程序的方法。大多数 OpenCL 供应商都提供他们自己的 OpenCL ICD 加载器实现,这些加载器都应该与其他供应商的 OpenCL 实现一起工作。不幸的是,大多数供应商没有提供完全最新的 ICD 加载器,因此 Arch Linux 已决定从一个单独的项目 (ocl-icd) 提供此库,该项目目前提供了当前 OpenCL API 的功能实现。

其他 ICD 加载器库作为每个供应商 SDK 的一部分安装。如果您想确保使用 ocl-icd 软件包中的 ICD 加载器,您可以在 /etc/ld.so.conf.d 中创建一个文件,将 /usr/lib 添加到动态程序加载器的搜索目录中

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

这是必要的,因为所有 SDK 都通过 ld.so.conf.d 文件将其运行时的 lib 目录添加到搜索路径中。

包含各种 OpenCL ICD 的可用软件包有

注意: ICD 加载器的供应商仅用于标识每个加载器,否则完全无关紧要。ICD 加载器是与供应商无关的,可以互换使用(只要它们实现正确)。

开发

对于 OpenCL 开发,所需的最基本附加软件包是

  • ocl-icd:OpenCL ICD 加载器实现,与最新的 OpenCL 规范同步。
  • opencl-headers:OpenCL C/C++ API 头文件。

供应商的 SDK 提供了大量的工具和支持库

  • intel-opencl-sdkAURIntel OpenCL SDK(旧版本,新的 OpenCL SDK 包含在 INDE 和 Intel Media Server Studio 中)
  • amdapp-sdkAUR:此软件包安装在 /opt/AMDAPP 中,除了 SDK 文件外,它还包含许多代码示例 (/opt/AMDAPP/SDK/samples/)。它还提供了 clinfo 实用程序,该实用程序列出系统中存在的 OpenCL 平台和设备,并显示有关它们的详细信息。由于 SDK 本身包含 CPU OpenCL 驱动程序,因此无需额外的驱动程序即可在 CPU 设备上执行 OpenCL(无论其供应商是谁)。
  • cuda:Nvidia 的 GPU SDK,其中包括对 OpenCL 3.0 的支持。

实现

要查看系统上当前处于活动状态的 OpenCL 实现,请使用以下命令

$ ls /etc/OpenCL/vendors

要找出系统上可用的 OpenCL 平台和设备的所有可能的(已知的)属性,安装 clinfo

您可以使用 ocl-icd-chooseAUR 指定您的应用程序应看到的实现。例如

$ ocl-icd-choose amdocl64.icd:mesa.icd davinci-resolve-checker

Rusticl

本文或本节的事实准确性存在争议。

原因: 似乎 OCL_ICD_VENDORS 无法处理单个 icd 文件,尽管有手册。参见 https://github.com/OCL-dev/ocl-icd/issues/7#issuecomment-1522941979(在 Talk:GPGPU 中讨论)

Rusticl 是由 opencl-rusticl-mesa 提供的用 Rust 编写的新 OpenCL 实现。可以通过使用环境变量 RUSTICL_ENABLE=driver 启用它,其中 driver 是 Gallium 驱动程序,例如 radeonsiiris

或者,如果 OpenCL 应用程序仍然无法检测到 Rusticl,请使用以下环境变量

OCL_ICD_VENDORS=/etc/OpenCL/vendors/rusticl.icd

语言绑定

SYCL

根据 Wikipedia:SYCL

SYCL 是一种更高层次的编程模型,旨在提高各种硬件加速器上的编程效率。它是一种基于纯 C++17 的单源嵌入式领域特定语言 (eDSL)。
SYCL 是一个免版税的跨平台抽象层,它建立在受 OpenCL 启发的底层概念、可移植性和效率之上,使异构处理器的代码能够使用完全标准的 C++ 以“单源”风格编写。SYCL 实现了单源开发,其中 C++ 模板函数可以同时包含主机代码和设备代码,以构建使用硬件加速器的复杂算法,然后在不同的数据类型上在其源代码中重用它们。
虽然 SYCL 标准最初是作为 OpenCL 工作组的更高层次编程模型子组开始的,并且最初是为与 OpenCL 和 SPIR 一起使用而开发的,但自 2019 年 9 月 20 日起,SYCL 已成为独立于 OpenCL 工作组的 Khronos Group 工作组,并且从 SYCL 2020 开始,SYCL 已被推广为更通用的异构框架,能够以其他系统为目标。现在,通过通用后端的概念,可以以任何加速 API 为目标,同时实现与目标 API 的完全互操作性,例如使用现有的本机库来达到最大性能,同时简化编程工作。例如,Open SYCL 实现通过 AMD 的跨供应商 HIP 以 ROCm 和 CUDA 为目标。

实现

  • computecppAUR Codeplay 的 SYCL 1.2.1 专有实现。可以将 SPIR、SPIR-V 和实验性的 PTX (NVIDIA) 作为设备目标(支持于 2023 年 9 月 1 日结束,将合并到 intel llvm 实现中 来源)。
  • trisycl-gitAUR:主要由 Xilinx 驱动的开源实现。
  • hipsycl-cuda-gitAURhipsycl-rocm-gitAURAdaptiveCpp,SYCL 和 C++ 标准并行性的实现,适用于所有供应商的 CPU 和 GPU,从 AMD 的 hipSYCL 重命名而来。
  • intel-oneapi-dpcpp-cpp:Intel 的 Data Parallel C++:SYCL 的 oneAPI 实现。

检查 SPIR 支持

大多数 SYCL 实现都能够将加速器代码编译为 SPIRSPIR-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 

本文或本节已过时。

原因: AMD 的驱动程序是 opencl-legacy-amdgpu-proAUR 还是 opencl-amdAUR?(在 Talk:GPGPU 中讨论)

已知至少部分支持 SPIR 或 SPIR-V 的驱动程序包括 intel-compute-runtimeintel-opencl-runtimeAURpoclamdgpu-pro-openclAUR[链接已损坏:未找到软件包]

开发

SYCL 需要设置一个可用的 C++11 环境。有一些可用的开源库

CUDA

CUDA (Compute Unified Device Architecture) 是 NVIDIA 的专有、闭源并行计算架构和框架。它需要 NVIDIA GPU,并由几个组件组成

  • 必需
    • 专有的 NVIDIA 内核模块
    • CUDA “驱动程序”和“运行时”库
  • 可选
    • 附加库:CUBLAS、CUFFT、CUSPARSE 等。
    • CUDA 工具包,包括 nvcc 编译器
    • CUDA SDK,其中包含许多 CUDA 和 OpenCL 程序的代码示例和示例

内核模块和 CUDA “驱动程序”库在 nvidiaopencl-nvidia 中发布。“运行时”库和 CUDA 工具包的其余部分在 cuda 中可用。cuda-gdb 需要安装 ncurses5-compat-libsAUR,请参阅 FS#46598

开发

cuda 软件包将所有组件安装在目录 /opt/cuda 中。/etc/profile.d/cuda.sh 中的脚本设置了相关的环境变量,以便所有支持 CUDA 的构建系统都可以找到它。

要查找安装是否成功以及 CUDA 是否正在运行,您可以编译 CUDA 示例。检查安装的一种方法是运行 deviceQuery 示例。

语言绑定

ROCm

ROCm (Radeon Open Compute) 是 AMD 的开源并行计算架构和框架。虽然它需要 AMD GPU,但某些 ROCm 工具是硬件无关的。有关更多信息,请参阅 ROCm for Arch Linux 存储库

  • rocm-hip-sdk:使用 HIP 和库为 AMD 平台开发应用程序。
  • rocm-opencl-sdk:为 AMD 平台开发基于 OpenCL 的应用程序。

HIP

Heterogeneous Interface for Portability (HIP) 是 AMD 专用的 GPU 编程环境,用于在 GPU 硬件上设计高性能内核。HIP 是一个 C++ 运行时 API 和编程语言,允许开发人员在不同平台上创建可移植的应用程序。

  • rocm-hip-runtime:基本运行时,用于在 AMD 平台上运行 HIP 应用程序的软件包。
  • hip-runtime-amd:ROCm 中用于 AMD GPU 的异构接口。支持从 polaris 架构(RX 500 系列)到 AMD 最新的 RDNA 2 架构(RX 6000 系列)的 GPU
  • miopen-hip:AMD 的开源深度学习库,带有 HIP 后端。
  • hip-runtime-nvidia:ROCm 中用于 NVIDIA GPU 的异构接口。
提示: 有关将 HIP 与 Blender 一起使用的更多信息,请参见此处。

OpenMP

openmp-extrasAUR 软件包提供了 AOMP - 一个基于 Clang/LLVM 的开源编译器,增加了对 AMD GPU 上 OpenMP API 的支持。

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

故障排除

首先检查您的 GPU 是否在 /opt/rocm/bin/rocminfo 中显示。如果未显示,则可能意味着 ROCm 不支持您的 GPU,或者它在构建时未包含对您的 GPU 的支持。

PyTorch

要将 PyTorch 与 ROCm 一起使用,请安装 python-pytorch-rocm

$ python -c 'import torch; print(torch.cuda.is_available())'
True

ROCm 伪装成 CUDA,所以这应该返回 True。如果不是,则可能是它没有使用您的 GPU 支持编译,或者您可能有冲突的依赖项。您可以通过查看 ldd /usr/lib/libtorch.so 来验证这些 - 不应有任何丢失的 .so 文件,也不应有相同 .so 的多个版本。

GPGPU 加速软件列表

此文章或章节需要扩充。

原因: 更多应用程序可能支持 GPGPU。(在 Talk:GPGPU 中讨论)

参见