GPGPU
通用圖形處理單元計算(GPGPU)API定義包括廠商無關的OpenCL、SYCL、HIP、OpenMP和Vulkan計算著色器;以及Nvidia的CUDA。每個API可以有多種硬體或軟體的實現:GPU、CPU、NPU、FPGA,或者僅僅是不同的GPGPU API(shim/transpiler)。
OpenCL
OpenCL(開放計算語言)是由非營利聯盟Khronos Group開發的一種開放、免版稅的並行編程規範。
OpenCL 規範描述了一種基於 C 的程式語言、一個必須存在的通用環境,以及一個 C API,使程式設計師能夠調用該環境。還有綁定允許其他語言調用該環境,以及編寫 OpenCL 計算內核的替代語言。
OpenCL 環境至少包含以下一種:
- libOpenCL.so 的副本,ICD加載器呈現完整的OpenCL API接口。
- 由ICD加載器加載的平台相關驅動程序。
ICD加載器(libOpenCL.so)
系統通常擁有多個支持 OpenCL 的硬體,因此存在多個 OpenCL 運行時實現。一個名為「OpenCL ICD loader」的組件應是一個平台無關的庫,通過 OpenCL API 提供加載設備特定驅動程序的手段。 大多數 OpenCL 廠商都提供自己的 OpenCL ICD 加載器實現,這些都能與其他廠商的 OpenCL 實現兼容。遺憾的是,大多數廠商並未提供完全最新的ICD加載器,因此Arch Linux決定從一個獨立項目ocl-icd包中提供該庫,該項目提供了當前OpenCL API的可運行實現。截至2025年,當前的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 加載的運行時。
通用GPU上的OpenCL
對於Mesa支持的任何顯卡,你可以通過安裝opencl-mesa包來使用rusticl。可以通過使用環境變量 RUSTICL_ENABLE=driver 來啟用,其中 driver 是 Gallium 驅動程序,如 radeonsi 或 iris。它能在最廣泛的硬體上運行,但不一定能提供最佳性能。如果你在設置其他驅動時遇到困難,可以試試用它:啟用只需要非常少的配置。
OpenCL 在 AMD/ATI GPU 上
-
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。
OpenCL 圖像支持
最新的ROCm版本現已包含用於GPGPU加速軟體如Darktable的OpenCL圖像支持。配備AMDGPU開源圖形驅動的ROCm僅需完成。AMDGPU PRO不是必需的。
/opt/rocm/bin/clinfo | grep -i "image support"
Image support Yes
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