GPGPU

来自 Arch Linux 中文维基

这篇文章或章节的翻译不反映原文。

原因:可能是机器翻译,谬误颇多(在 Talk:GPGPU# 中讨论)

GPGPU是General-purpose computing on graphics processing units(图形处理器通用计算)的缩写。

OpenCL[编辑 | 编辑源代码]

OpenCL (开放运算语言)是由非盈利组织Khronos Group开发的一种开放,免费的并行编程标准。

OpenCL标准描述了一种编程语言,一个需要实现的通用环境和一个能让程序员调用该环境的C语言API。

提示:clinfo工具可以列出OpenCL平台,设备和ICD加载器属性。

运行库[编辑 | 编辑源代码]

运行使用OpenCL的程序,需要安装一个兼容硬件的运行库。

AMD/ATI[编辑 | 编辑源代码]

  • opencl-clover-mesaopencl-rusticl-mesa:mesa驱动通过clover/rusticl提供的OpenCL支持
  • rocm-opencl-runtime:AMD ROCm GPU计算平台的一部分,官方支持GFX8及更新的显卡(Fiji, Polaris, Vega),非官方且部分支持基于Navi10的显卡。要支持比Vega旧的硬件,需要设置环境变量 ROC_ENABLE_PRE_VEGA=1。这类似但不完全等同于官方安装脚本文档中,Ubuntu的amdgpu-install安装脚本使用的opencl=rocr选项,因为本软件包的rocm版本不同于AMD的ubuntu发布版本
  • opencl-legacy-amdgpu-proAUR:由ubuntu发布版本再打包的传统Orca OpenCL驱动。等同于给ubuntu的amdgpu-install安装脚本指定 opencl=legacy选项
  • opencl-amdAUR, opencl-amd-devAUR:由ubuntu发布版本再打包的ROCm 组件。等同于给ubuntu的amdgpu-install安装脚本指定 opencl=rocr,legacy选项
  • amdapp-sdkAUR: AMD CPU 运行库

NVIDIA[编辑 | 编辑源代码]

Intel[编辑 | 编辑源代码]

  • intel-compute-runtime:也被称为Neo OpenCL运行库,开源实现,支持Intel HD Graphics GPU第八代(Broadwell)及更新的硬件。
  • opencl-clover-mesaopencl-rusticl-mesa:mesa驱动通过clover/rusticl提供的OpenCL支持
  • beignetAUR:Intel HD Graphics GPU第七代(Ivy Bridge)及更新硬件的开源支持,因被NEO OpenCL替代而被弃用,依然是传统硬件平台的推荐解决方案(如Ivy Bridge,Haswell)
  • intel-openclAUR:Intel HD Graphics GPU第七代(Ivy Bridge)及更新硬件的闭源支持,因被NEO OpenCL替代而被弃用,依然是传统硬件平台的推荐解决方案(如Ivy Bridge,Haswell)
  • intel-opencl-runtimeAUR:Intel酷睿及志强处理器的实现,同样支持非Intel CPU

Others[编辑 | 编辑源代码]

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

还有一些编译器和翻译器能够让OpenCL应用在Vulkan上运行。

  • clspv-gitAUR:Clspv是一个OpenCL子集到Vulkan计算着色器的原型编译器
  • clvk-gitAUR:clvk是一个在Vulkan上的OpenCL 3.0原型实现,使用clspy作为编译器
  • xrt-binAUR:Xilinx FPGA xrt运行库
  • fpga-runtime-for-opencl:FPGA运行库

32位运行库[编辑 | 编辑源代码]

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

提示:clinfo工具只能显示64位OpenCL平台,设备和ICD加载器属性。要用于32位,你需要编译32位clinfo或使用archlinux32项目中的 clinfo

AMD/ATI[编辑 | 编辑源代码]

NVIDIA[编辑 | 编辑源代码]

ICD加载器 (libOpenCL.so)[编辑 | 编辑源代码]

OpenCL ICD加载器应该是一个平台无关的库,提供了通过OpenCL API加载设备相关驱动的方法。 大多数OpenCL供应商提供了自己的OpenCL ICD加载器实现,这些加载器也应该全部与其它供应商的实现兼容。但不幸的是,大多供应商没有提供完全最新的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

因为所有SKD通过ld.so.conf.d添加自己的运行库库目录到搜索路径。

包含各种OpenCL ICD的包有:

注意: 上文提及的ICD加载器的供应商仅用于区分各个供应商提供的加载器,除此之外没有任何关联。ICD加载器是与供应商无关的,也应该是可以相互替换的(只要这些加载器的实现是正确的)。

开发[编辑 | 编辑源代码]

开发OpenCL,需要最小的额外包:

  • ocl-icd:OpenCL ICD加载器实现,符合最新OpenCL标准
  • opencl-headers:OpenCL C/C++ API头文件

供应商提供了大量工具和支持库文件:

  • intel-opencl-sdkAURIntel OpenCL SDK(旧版,新版OpenCL SDK包含在INDE 和Intel Media Server Studio中)
  • amdapp-sdkAUR:安装在/opt/AMDAPP,除了SKD文件,还包含一一些代码示例(/opt/AMDAPP/SDK/samples/)。还提供了clinfo工具,用于显示系统中的OpenCL平台和设备及其详细信息。SDK还附带了OpenCL CPU驱动,无需其它驱动即可在CPU设备执行OpenCL(不论CPU的供应商)
  • 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 中讨论)


Rusticlopencl-rusticl-mesa提供的一个由Rust编写的新的OpenCL实现。可以通过设置环境变量RUSTICL_ENABLE=driver启用该实现,命令中的driver是Gallium驱动,如irisradeonsi

另外,如果OpenCL应用无法检测到Rusticl,使用以下的环境变量:

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

语言绑定[编辑 | 编辑源代码]

SYCL[编辑 | 编辑源代码]

根据Wikipedia:SYCL

SYCL 是一种用于在各种硬件加速器上提高编程生产力的高级编程语言模型。这是一种单源特定于域的嵌入式语言,基于C++17。
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 Source)。
  • trisycl-gitAUR:Xilinx的开源实现。
  • hipsycl-cuda-gitAURhipsycl-rocm-gitAUR:基于AMD HIP而不是OpenCL构建的开放实现,能够在AMD和NVIDIA GPU上运行。
  • intel-oneapi-dpcpp-cpp: Intel的数据并行C++:oneAPI的SYCL实现。

检查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 

本文内容或本节内容已经过期。

原因: Is the driver for AMD opencl-legacy-amdgpu-proAUR or opencl-amdAUR? (在Talk:GPGPU讨论)

已知至少部分支持SPIR或SPIR-V的驱动包括intel-compute-runtimeintel-opencl-runtimeAURpoclamdgpu-pro-openclAUR[损坏的链接:package not found].

开发[编辑 | 编辑源代码]

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是否安装成功,可以编译CUDA示例代码。一种检查安装的方法是运行deviceQuery示例。 One way to check the installation is to run the deviceQuery sample.

语言绑定[编辑 | 编辑源代码]

ROCm[编辑 | 编辑源代码]

ROCm (Radeon开发计算平台)是AMD的开源并行计算架构。尽管其需要AMD GPU,一些ROCm工具却是硬件无关的。参见ROCm for Arch Linux repository

HIP[编辑 | 编辑源代码]

异构计算可移植接口(Heterogeneous Interface for Portability,HIP)是AMD的专用GPU编程环境,用于设计GPU硬件的高性能内核。HIP作为C++运行库API和编程语言,允许开发者为不同平台创建可移植应用。

  • rocm-hip-runtime:基本运行库,用于在AMD平台运行HIP应用
  • hip-runtime-amd:ROCm中用于AMDGPU的异构接口,支持polaris架构(RX 500系列)到RDNA 2架构(RX 6000系列)
  • miopen-hip: AMD开源深度学习库,使用HIP后端
  • hip-runtime-nvidiaAUR:ROCm中用于NVIDIA GPU的异构接口
提示:关于Blender使用HIP的更多信息,参见这里

OpenMP[编辑 | 编辑源代码]

openmp-extrasAUR提供了AOMP - 一个开源基于Clang/LLVM的编译器,提供OpenMP API在AMD GPU的支持。

OpenCL[编辑 | 编辑源代码]

rocm-opencl-runtime是ROCm框架的一部分,提供了OpenCL运行库。

OpenCL图像支持[编辑 | 编辑源代码]

ROCm最新版本提供了OpenCL 图像支持,可用于GPGPU加速软件如Darktable。仅需AMDGPU开源驱动和ROCm,不需要AMDGPU PRO。

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

疑难解答[编辑 | 编辑源代码]

首先确认你的GPU出现在/opt/rocm/bin/rocminfo的输出里。如果没有,这可能意味着ROCm不支持你的GPU或者ROCm软件在编译时未做相关配置。

PyTorch[编辑 | 编辑源代码]

要让PyTorch支持ROCm,安装python-pytorch-rocm

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

上面的命令如果没有返回True,那么python-pytorch-rocm可能在编译时没有支持你的GPU或者你的依赖存在冲突,你可以使用ldd /usr/lib/libtorch.so进行检查,输出结果应该不会有任何.so文件的丢失或多个不同版本的相同.so文件。

支持GPGPU加速的软件[编辑 | 编辑源代码]

这篇文章的某些内容需要扩充。

原因: More application may support GPGPU. (在 Talk:GPGPU 中讨论)

另见[编辑 | 编辑源代码]