GPGPU

出自 Arch Linux 中文维基

這篇文章或章節的翻譯不反映原文。

原因:可能是機器翻譯,謬誤頗多(在 Talk:GPGPU# 中討論)

GPGPU是General-purpose computing on graphics processing units(圖形處理器通用計算)的縮寫。

OpenCL[編輯 | 編輯原始碼]

OpenCL (開放運算語言)是由非盈利組織Khronos Group開發的一種開放,免費的並行編程標準。

OpenCL標準描述了一種編程語言,一個需要實現的通用環境和一個能讓程式設計師調用該環境的C語言API。

提示:clinfo工具可以列出OpenCL平台,設備和ICD加載器屬性。

運行庫[編輯 | 編輯原始碼]

運行使用OpenCL的程序,需要安裝一個兼容硬件的運行庫。

AMD/ATI[編輯 | 編輯原始碼]

  • opencl-clover-mesaopencl-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發佈版本再打包的ROCr和Orca OpenCL驅動。等同於給ubuntu的amdgpu-install安裝腳本指定 opencl=rocr,legacy選項
  • amdapp-sdkAUR: AMD CPU 運行庫

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

另見[編輯 | 編輯原始碼]