GPGPU
GPGPU是General-purpose computing on graphics processing units(图形处理器通用计算)的缩写。
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计算平台的一部分,官方支持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[编辑 | 编辑源代码]
- opencl-nvidia包:官方NVIDIA运行库
Intel[编辑 | 编辑源代码]
- intel-compute-runtime包:也被称为Neo OpenCL运行库,开源实现,支持Intel HD Graphics GPU第八代(Broadwell)及更新的硬件。
- opencl-clover-mesa包或opencl-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位运行库。
AMD/ATI[编辑 | 编辑源代码]
- lib32-opencl-clover-mesa包 或 lib32-opencl-rusticl-mesa包:AMD/ATI Radeon mesa 32位驱动的OpenCL支持
NVIDIA[编辑 | 编辑源代码]
- lib32-opencl-nvidia包:NVIDIA(32位)的OpenCL实现
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的包有:
- ocl-icd包:推荐,几乎是最新的
- intel-openclAUR:由Intel提供的OpenCL 2.0,因被intel-compute-runtime包替代而废弃
开发[编辑 | 编辑源代码]
要开发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
,除了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[编辑 | 编辑源代码]
Rusticl是opencl-rusticl-mesa包提供的一个由Rust编写的新的OpenCL实现。可以通过设置环境变量RUSTICL_ENABLE=driver
启用该实现,命令中的driver
是Gallium驱动,如iris
或radeonsi
。
另外,如果OpenCL应用无法检测到Rusticl,使用以下的环境变量:
OCL_ICD_VENDORS=/etc/OpenCL/vendors/rusticl.icd
语言绑定[编辑 | 编辑源代码]
- JavaScript/HTML5: WebCL
- Python: python-pyopencl包
- D: cl4d or DCompute
- Java: Aparapi or JOCL (a part of JogAmp)
- Mono/.NET: Open Toolkit
- Go: OpenCL bindings for Go
- Racket: Racket has a native interface on PLaneT that can be installed via raco.
- Rust: ocl
- Julia: OpenCL.jl
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-gitAUR和hipsycl-rocm-gitAUR:基于AMD HIP而不是OpenCL构建的开放实现,能够在AMD和NVIDIA GPU上运行。
- intel-oneapi-dpcpp-cpp包: Intel的数据并行C++:oneAPI的SYCL实现。
检查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[损坏的链接:package not found].
开发[编辑 | 编辑源代码]
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是否安装成功,可以编译CUDA示例代码。一种检查安装的方法是运行deviceQuery
示例。 One way to check the installation is to run the deviceQuery
sample.
语言绑定[编辑 | 编辑源代码]
- Fortran: PGI CUDA Fortran Compiler
- Haskell: accelerate package列出了可用的CUDA后端
- Java: JCuda
- Mathematica: CUDAlink
- Mono/.NET: CUDAfy.NET, managedCuda
- Perl: KappaCUDA, CUDA-Minimal
- Python: python-pycuda包
- Ruby: rbcuda
- Rust: cuda-sys (绑定) 或 RustaCUDA (高级封装)
ROCm[编辑 | 编辑源代码]
ROCm (Radeon开发计算平台)是AMD的开源并行计算架构。尽管其需要AMD GPU,一些ROCm工具却是硬件无关的。参见ROCm for Arch Linux repository。
- rocm-hip-sdk包:为AMD平台开发使用HIP的应用和库
- 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中用于AMDGPU的异构接口,支持polaris架构(RX 500系列)到RDNA 2架构(RX 6000系列)
- miopen-hip包: AMD开源深度学习库,使用HIP后端
- hip-runtime-nvidiaAUR:ROCm中用于NVIDIA GPU的异构接口
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加速的软件[编辑 | 编辑源代码]
- Bitcoin
- 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