跳至內容

GPGPU

出自 Arch Linux 中文维基

這篇文章或章節的翻譯質量不佳。

原因:文章正在進行大規模更新,需要分階段對其進行調整。(在 Talk: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 計算內核的替代語言。

提示:clinfo 工具可用於列出 OpenCL 平台、設備及 ICD 加載器屬性。

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 的可用軟體包有:

注意: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。它能在最廣泛的硬體上運行,但不一定能提供最佳性能。如果你在設置其他驅動時遇到困難,可以試試用它:啟用只需要非常少的配置。

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

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 中討論)

另見