跳转到内容

为应对本站因各种原因无法访问,建议用户安装 arch-wiki-docs-zh-cnCNRepo 或者 arch-wiki-docs-zh-twCNRepo 离线文档包备用,也可尝试使用经由Cloudflare CDN的替代版本aw.lilydjwg.me

User:PovShell/Sandbox

来自 Arch Linux 中文维基

通用图形处理单元计算(GPGPU)API定义包括厂商无关的OpenCL、SYCL、HIP、OpenMP和Vulkan计算着色器;以及NVIDIA的CUDA。每个API可以有多种硬件或软件的实现:GPU、CPU、NPU、FPGA,或者仅仅是不同的GPGPU API(shim/transpiler)。

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

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

提示:clinfo 工具可用于列出 OpenCL 平台、设备及 ICD 加载器属性。

OpenCL 环境至少包含以下一种:

  • libOpenCL.so 的副本,ICD加载器呈现完整的OpenCL API接口。
  • 由ICD加载器加载的平台相关驱动程序。

ICD加载器(libOpenCL.so)

[编辑 | 编辑源代码]

系统通常拥有多个支持 OpenCL 的硬件,因此存在多个 OpenCL 运行时实现。OpenCL ICD 加载器 应与平台无关,通过 OpenCL API 提供加载设备特定驱动程序的方式。 大多数 OpenCL 厂商都提供自己的 OpenCL ICD 加载器实现,这些都能与其他厂商的 OpenCL 实现兼容。遗憾的是,大多数厂商并未提供完全最新的ICD加载器,因此Arch Linux决定从一个独立项目ocl-icd中提供该库,该项目提供了当前OpenCL API的可运行实现。截至2026年,当前的OpenCL版本为3.0。

其他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文件的搜索路径中。

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

注意:ICD 加载器的供应商在功能上无关紧要:它们应当与厂商无关,只要实现正确,就可以互换使用。供应商的作用仅用于区分它们之间的区别。

管理实现

[编辑 | 编辑源代码]

要查看当前系统中哪些OpenCL实现正在运行,请使用以下命令:

ls /etc/OpenCL/vendors

要了解 OpenCL 平台及系统上可用设备的所有可能(已知)属性,请安装 clinfo

你可以用ocl-icd-choose指定应用应接收哪些实现。例如:

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

ocl-icd-choose 是一个简单的包装脚本,用于设置OCL_ICD_FILENAMES环境变量。如果OCL_ICD_VENDORS能像说明书建议的那样处理单个ICD文件,那就不需要它了;这是一个已知的bug,被追踪为OCL-dev/ocl-icd#7

运行时

[编辑 | 编辑源代码]

执行使用 OpenCL 的程序,需要安装一个可由 libOpenCL.so 加载的运行时。

GPU上的通用OpenCL实现

[编辑 | 编辑源代码]

对于Mesa支持的任何显卡,你可以通过安装opencl-mesa来使用rusticl。可以通过使用环境变量 RUSTICL_ENABLE=driver 来启用,其中 driver 是 Gallium 驱动程序,如 radeonsiiris。它能在最广泛的硬件上运行,但不一定能提供最佳性能。如果你在设置其他驱动时遇到困难,可以试试用它:启用只需要非常少的配置。

AMD/ATI GPU 上的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版本重新打包的Legacy Orca OpenCL。相当于在 Ubuntu 的 amdgpu-install 中指定 opencl=legacy
  • opencl-amdAURopencl-amd-devAUR:ROCm组件从AMD的Ubuntu版本重新打包而来。相当于在 Ubuntu 的 amdgpu-install 中指定 opencl=rocr,legacy
OpenCL 图像支持
[编辑 | 编辑源代码]

最新的ROCm版本现已包含用于GPGPU加速软件如Darktable的OpenCL图像支持。配备AMDGPU开源图形驱动的ROCm仅需完成。AMDGPU PRO不是必需的。

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

NVIDIA GPU 上的 OpenCL

[编辑 | 编辑源代码]

opencl-nvidia:官方NVIDIA运行时。

Intel GPU 上的 OpenCL

[编辑 | 编辑源代码]
  • intel-compute-runtime:又称“NEO”运行时,是面向英特尔第十二代(Rocket/Tiger Lake)集成显卡及以上版本(包括所有独立英特尔显卡)的开源OpenCL(及oneAPI Level Zero)实现。
  • intel-compute-runtime-legacyAUR:与上述相同(部分支持oneAPI Level Zero),仅适用于Intel Gen8(Broadwell)、Gen9(Skylake及其变体)和Gen11(Ice/Elkhart Lake)显卡。为遗留平台提供的OpenCL ICD带有“legacy1”后缀。
  • beignetAUR:面向英特尔第七代(Ivy Bridge)图形及以上版本的开源OpenCL实现,已被英特尔弃用,转而支持NEO OpenCL运行时,仍是传统硬件平台(如Ivy Bridge、Haswell)推荐的解决方案。
  • intel-openclAUR:针对英特尔第七代(Ivy Bridge)图形及以上版本的专有OpenCL实现,已被英特尔弃用,转而支持NEO OpenCL运行时,仍是传统硬件平台(如Ivy Bridge、Haswell)推荐的解决方案。

CPU 上的OpenCL

[编辑 | 编辑源代码]

以下条件允许OpenCL在CPU上运行:

  • intel-opencl-runtimeAUR:英特尔基于LLVM和oneAPI的x86_64处理器实现。官方设计为Intel Core和Xeon处理器设计,实际上支持所有x86_64处理器,支持SSE4.1。即使在AMD Zen处理器上,它的性能也优于POCL。
  • pocl:基于LLVM的OpenCL实现,适用于LLVM支持的所有CPU架构及部分GPU(通过libCUDA的Nvidia,Intel通过Level Zero)以及OpenASIP。尽管覆盖范围广泛,但其表现仍有许多不足之处。
  • amdapp-sdkAUR:AMD CPU 运行时,已废弃。

Vulkan 上的 OpenCL

[编辑 | 编辑源代码]

以下功能允许OpenCL在Vulkan运行时之上运行:

  • clspv-gitAUR:Clspv 是一个原型编译器,适用于 OpenCL C 转 Vulkan 计算着色器的子集。
  • clvk-gitAUR:clvk 是基于 Vulkan 的 OpenCL 3.0 原型实现,使用 clspv 作为编译器。

FPGA 上的 OpenCL

[编辑 | 编辑源代码]

32位运行时

[编辑 | 编辑源代码]

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

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

通用GPU(32位)上的OpenCL

[编辑 | 编辑源代码]

NVIDIA GPU上的OpenCL

[编辑 | 编辑源代码]

对于 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,除了SDK文件,还包含一些代码示例(/opt/AMDAPP/SDK/samples/)。提供了clinfo工具,用于显示系统中的OpenCL平台和设备及其详细信息。SDK还附带了OpenCL CPU驱动,无需其它驱动即可在CPU设备执行OpenCL(不论CPU的供应商)
  • rocm-opencl-sdk:基于ROCm的OpenCL SDK。
  • cuda:NVIDIA的GPU SDK,包含了OpenCL 3.0的支持

语言绑定

[编辑 | 编辑源代码]

根据维基百科:SYCL

SYCL 是一种更高级的编程模型,旨在提升各种硬件加速器的编程效率。它是一种基于纯 C++17 的单源嵌入式领域专用语言(eDSL)。

SYCL [...] 受到 OpenCL 的启发,OpenCL 使异构处理器代码能够以“单一源代码”风格编写,使用完全标准的 C++。SYCL 支持单源开发,C++ 模板函数可以包含主机和设备代码,构建使用硬件加速器的复杂算法,并在不同类型的数据中多次重复使用。

虽然SYCL标准最初是OpenCL工作组的高级编程模型子组,最初是为OpenCL和SPIR开发的,但SYCL是独立于OpenCL工作组的Khronos Group工作组[...],自SYCL 2020起,SYCL被推广为一个更通用的异构框架,能够针对其他系统。现在,借助通用后端的概念,可以针对任何加速 API,同时实现与目标 API 的完全互操作性,比如利用现有的原生库来达到最大性能,同时简化编程工作。例如,OpenSYCL 的实现通过 AMD 的跨厂商 HIP 面向 ROCm 和 CUDA。


换句话说,SYCL 定义了一个基于 C++17 的编程环境。该环境旨在与同时生成CPU和GPGPU代码的编译器结合使用。原本为GPGPU端设计的语言是SPIR,但也存在针对其他中间表示的编译器。b v

支持GPGPU加速的软件

[编辑 | 编辑源代码]

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

原因:More application may support GPGPU. (在 User talk:PovShell/Sandbox 中讨论)