User:PovShell/Sandbox
通用图形处理单元计算(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,使程序能够调用环境。
OpenCL 环境至少包含以下一种:
- libOpenCL.so 的副本,ICD加载器呈现完整的OpenCL API接口。
- 由ICD加载器加载的平台相关驱动程序。
系统通常拥有多个支持 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 的可用软件包有:
- ocl-icd包:推荐,最新
- intel-compute-runtime包:Intel提供的OpenCL实现。
要查看当前系统中哪些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 加载的运行时。
对于Mesa支持的任何显卡,你可以通过安装opencl-mesa包来使用rusticl。可以通过使用环境变量 RUSTICL_ENABLE=driver 来启用,其中 driver 是 Gallium 驱动程序,如 radeonsi 或 iris。它能在最广泛的硬件上运行,但不一定能提供最佳性能。如果你在设置其他驱动时遇到困难,可以试试用它:启用只需要非常少的配置。
- 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-amdAUR、opencl-amd-devAUR:ROCm组件从AMD的Ubuntu版本重新打包而来。相当于在 Ubuntu 的 amdgpu-install 中指定
opencl=rocr,legacy。
最新的ROCm版本现已包含用于GPGPU加速软件如Darktable的OpenCL图像支持。配备AMDGPU开源图形驱动的ROCm仅需完成。AMDGPU PRO不是必需的。
/opt/rocm/bin/clinfo | grep -i "image support"
Image support Yes
opencl-nvidia包:官方NVIDIA运行时。
- 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)推荐的解决方案。
以下条件允许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 运行时,已废弃。
以下功能允许OpenCL在Vulkan运行时之上运行:
- clspv-gitAUR:Clspv 是一个原型编译器,适用于 OpenCL C 转 Vulkan 计算着色器的子集。
- clvk-gitAUR:clvk 是基于 Vulkan 的 OpenCL 3.0 原型实现,使用 clspv 作为编译器。
- pocl 用于 OpenASIP,见上文。
- xrt-binAUR:Xilinx FPGA xrt 运行时
- fpga-runtime-for-opencl:Intel FPGA 运行时
要执行使用 OpenCL 的 32 位程序,需要安装兼容的硬件 32 位运行时。
- lib32-opencl-mesa包:对 Mesa 驱动(32位)的 OpenCL 支持。
- lib32-opencl-nvidia包:NVIDIA(32位)的OpenCL实现。
对于 OpenCL开发,至少需要以下包:
- ocl-icd包:OpenCL ICD加载器实现,符合最新OpenCL规范。
- opencl-headers包:OpenCL C/C++ API头文件
供应商提供了大量工具和支持库文件:
- 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还附带了OpenCL CPU驱动,无需其它驱动即可在CPU设备执行OpenCL(不论CPU的供应商) - rocm-opencl-sdk包:基于ROCm的OpenCL SDK。
- cuda包:NVIDIA的GPU SDK,包含了OpenCL 3.0的支持
- JavaScript/HTML5: WebCL
- Python: python-pyopencl包
- D: cl4d or DCompute
- Java: Aparapi or JOCL ( JogAmp的一部分)
- Mono/.NET: Open Toolkit
- Go: OpenCL bindings for Go
- Racket: Racket在 PLaneT 上有原生接口,可以通过Raco安装。
- Rust: ocl
- Julia: OpenCL.jl
根据维基百科: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
- Blender – Nvidia GPU支持CUDA,AMD GPU支持HIP。详情参见这里
- BOINC
- FFmpeg – 详情参见这里
- Folding@home
- GIMP – 实验性支持 – 更多信息参见这里
- HandBrake
- Hashcat
- LibreOffice Calc – 更多信息参见这里.
- mpv - 参见 mpv#Hardware video acceleration.
- clinfo包 – 确认系统可用的OpenCL平台和设备上所有可能(已知)的特性
- cuda_memtestAUR – 一个GPU内存测试。尽管名字有cuda,它也支持OpenCL
- darktable包 – OpenCL特性需要至少1 GB现存和图形支持(使用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版本
- whisper.cpp-clblasAUR 和 whisper.cpp-cublasAUR - OpenAI Whisper 模型 的 C/C++ 移植(使用 OpenCL 和 CUDA 优化)
- xmrig包 - High Perf CryptoNote CPU and GPU (OpenCL, CUDA) miner