GPGPU
GPGPU 代表 通用图形处理器计算。
OpenCL
OpenCL(开放计算语言)是由非营利性联盟 Khronos Group 开发的开放、免版税的并行编程规范。
OpenCL 规范描述了一种编程语言、一个需要存在的通用环境以及一个 C API,使程序员能够调用此环境。
运行时
要执行使用 OpenCL 的程序,需要安装兼容的硬件运行时。
AMD/ATI
- opencl-clover-mesa 或 opencl-rusticl-mesa:为 mesa 驱动程序提供带有 clover 和 rusticl 的 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
- opencl-clover-mesa 或 opencl-rusticl-mesa:为 mesa 驱动程序提供带有 clover 和 rusticl 的 OpenCL 支持
- opencl-nvidia:官方 NVIDIA 运行时
Intel
- intel-compute-runtime:又名 Neo OpenCL 运行时,是用于 Gen12 (Alder Lake) 及更高版本上的 Intel HD Graphics GPU 的开源实现。
- intel-compute-runtime-legacyAUR:与上面相同,但仅适用于 Gen11(Rocket Lake) 及更低版本
- opencl-clover-mesa 或 opencl-rusticl-mesa:为 mesa 驱动程序提供带有 clover 和 rusticl 的 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 位运行时。
AMD/ATI
- lib32-opencl-clover-mesa 或 lib32-opencl-rusticl-mesa:为 AMD/ATI Radeon mesa 驱动程序提供 OpenCL 支持(32 位)
NVIDIA
- lib32-opencl-nvidia:NVIDIA 的 OpenCL 实现(32 位)
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 的可用软件包有
- ocl-icd:推荐,最新
- intel-openclAUR 由 Intel 提供。提供 OpenCL 2.0,已被弃用,转而支持 intel-compute-runtime。
开发
对于 OpenCL开发,所需的最基本附加软件包是
- ocl-icd:OpenCL ICD 加载器实现,与最新的 OpenCL 规范保持同步。
- opencl-headers:OpenCL C/C++ API 头文件。
供应商的 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 驱动程序,因此无需额外的驱动程序即可在 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
Rusticl 是一个新的 OpenCL 实现,用 Rust 编写,由 opencl-rusticl-mesa 提供。可以通过使用环境变量 RUSTICL_ENABLE=driver
启用,其中 driver
是 Gallium 驱动程序,例如 radeonsi
或 iris
。
或者,如果 OpenCL 应用程序仍然无法检测到 Rusticl,请使用以下环境变量
OCL_ICD_VENDORS=/etc/OpenCL/vendors/rusticl.icd
语言绑定
- JavaScript/HTML5: WebCL
- Python:python-pyopencl
- D: cl4d 或 DCompute
- Java: Aparapi 或 JOCL(JogAmp 的一部分)
- Mono/.NET: Open Toolkit
- Go: Go 的 OpenCL 绑定
- Racket: Racket 有一个原生接口 on PLaneT,可以通过 raco 安装。
- Rust: ocl
- Julia: OpenCL.jl
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-gitAUR 和 hipsycl-rocm-gitAUR:AdaptiveCpp,SYCL 和 C++ 标准并行性的实现,适用于所有供应商的 CPU 和 GPU,从 AMD 的 hipSYCL 重命名而来。
- intel-oneapi-dpcpp-cpp:Intel 的 Data Parallel C++:SYCL 的 oneAPI 实现。
检查 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[链接已损坏:未找到软件包]。
开发
SYCL 需要设置一个可用的 C++11 环境。有一些可用的开源库
- ComputeCpp SDK:代码示例集合,ComputeCpp 的 cmake 集成
- SYCL-DNN:神经网络性能原语
- SYCL-BLAS:线性代数性能原语
- VisionCpp:计算机视觉库
- SYCL Parallel STL:C++17 并行算法的 GPU 实现
CUDA
CUDA(Compute Unified Device Architecture,计算统一设备架构)是 NVIDIA 的专有、闭源并行计算架构和框架。它需要 NVIDIA GPU,并由几个组件组成
- 必需
- 专有 NVIDIA 内核模块
- CUDA “驱动程序”和“运行时”库
- 可选
- 附加库:CUBLAS、CUFFT、CUSPARSE 等
- CUDA 工具包,包括
nvcc
编译器 - CUDA SDK,其中包含许多 CUDA 和 OpenCL 程序的代码示例和示例
内核模块和 CUDA “驱动程序”库在 nvidia 和 opencl-nvidia 中提供。“运行时”库和 CUDA 工具包的其余部分在 cuda 中可用。cuda-gdb
需要安装 ncurses5-compat-libsAUR,请参阅 FS#46598。
开发
cuda 软件包将所有组件安装在 /opt/cuda
目录中。/etc/profile.d/cuda.sh
中的脚本设置相关的环境变量,以便所有支持 CUDA 的构建系统都可以找到它。
要查找安装是否成功以及 CUDA 是否正在运行,您可以编译 CUDA 示例。检查安装的一种方法是运行 deviceQuery
示例。
语言绑定
- Fortran: PGI CUDA Fortran 编译器
- Haskell:accelerate 软件包列出了可用的 CUDA 后端
- Java: JCuda
- Mathematica: CUDAlink
- Mono/.NET: CUDAfy.NET, managedCuda
- Perl: KappaCUDA, CUDA-Minimal
- Python:python-pycuda
- Ruby: rbcuda
- Rust: Rust-CUDA。未维护:cuda-sys(绑定)、RustaCUDA(高级封装器)。
ROCm
ROCm(Radeon Open Compute,Radeon 开放计算)是 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 的异构接口。
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 加速软件列表
- 比特币
- Blender – 为 Nvidia GPU 提供 CUDA 支持,为 AMD GPU 提供 HIP 支持。更多信息请点击此处。
- BOINC
- FFmpeg – 更多信息请点击此处。
- Folding@home
- GIMP – 实验性功能 – 更多信息请点击此处。
- HandBrake
- Hashcat
- LibreOffice Calc – 更多信息请点击此处。
- mpv - 参见 mpv#硬件视频加速。
- clinfo – 查找系统上可用的 OpenCL 平台和设备的所有可能的(已知的)属性。
- cuda_memtestAUR – 一个 GPU 内存测试工具。尽管名称如此,但它同时支持 CUDA 和 OpenCL。
- darktable – OpenCL 功能需要 GPU 上至少 1 GB 的 RAM 和图像支持(检查 clinfo 命令的输出)。
- DaVinci Resolve - 一款非线性视频编辑器。可以使用 OpenCL 和 CUDA。
- imagemagick
- lc0AUR - 用于搜索神经网络(支持 tensorflow、OpenCL、CUDA 和 openblas)
- opencv
- pyritAUR
- python-pytorch-cuda - 带有 CUDA 后端的 PyTorch
- tensorflow-cuda - TensorFlow 的 CUDA 端口
- tensorflow-computecppAUR - TensorFlow 的 SYCL 端口
- xmrig - 高性能 CryptoNote CPU 和 GPU (OpenCL, CUDA) 矿工