GPGPU

提供: ArchWiki
2022年7月19日 (火) 17:05時点におけるAshMyzk (トーク | 投稿記録)による版 (→‎その他: 同期)
ナビゲーションに移動 検索に移動

関連記事

GPGPU は General-purpose computing on graphics processing units の略です。

OpenCL

OpenCL (Open Computing Language) は非営利団体である Khronos グループによって開発されている、オープンでロイヤルティフリーの並列プログラミングフレームワークです。

OpenCL の仕様書には一般環境として必要なプログラミング言語と、プログラマーがこの環境で呼び出せる C API が書かれています。

ヒント: clinfo ユーティリティを使うことで OpenCL プラットフォームと存在するデバイス、ICD ローダーのプロパティを確認できます。

ランタイム

OpenCL を使用するプログラムを実行するには、ハードウェアに対応したランタイムをインストールする必要があります。

AMD/ATI

  • opencl-mesa: AMDGPURadeon 用のフリーなランタイム。
  • opencl-amdAUR: AMD の ubuntu リリースから再パッケージングされた ROCr OpenCL と legacy OpenCL (別名:orca) (ubuntu の amdgpu-install で opencl=rocr,legacy指定したものと等価です)。
  • opencl-legacy-amdgpu-proAUR: AMD の ubuntu リリースから最パッケージングされた ROCr OpenCL と legacy OpenCL (別名:orca) (ubuntu の amdgpu-install で opencl=legacy指定したものと等価です)。
  • rocm-opencl-runtimeAUR: AMD の ROCm GPU コンピュートスタックの一部。GFX8 およびそれ以降のカード(Fiji, Polaris, Vega)を公式にサポートします。Navi10 ベースのカードは非公式・部分的なサポートがあります(似てはいますが、ubuntu の amdgpu-install で opencl=rocr指定したものと等価ではありません。このパッケージの rocm バージョンは ubuntu のインストーラのバージョンと異なるからです)。
  • amdapp-sdkAUR: AMD CPU ランタイム。

NVIDIA

Intel

  • intel-compute-runtime: 別名 Neo OpenCL ランタイム。Gen8 (Broadwell) 以降の Intel HD Graphics GPU 用のオープンソース実装。
  • beignetAUR: Intel IvyBridge 以上の iGPU 用のオープンソース実装。古いプラットフォーム向け (例: Ivy Bridge, Sandy Bridge, Haswell)。
  • intel-openclAUR: Intel IvyBridge 以上の iGPU 用のプロプライエタリ実装。古いプラットフォーム向け (例: Ivy Bridge, Sandy Bridge, Haswell)。
  • intel-opencl-runtimeAUR: Intel Core と Xeon プロセッサ向けの実装。Intel 製以外の CPU もサポート。

その他

  • pocl: LLVM ベースの OpenCL 実装(ハードウェアとは独立)。

Vulkan ランタイム上で OpenCL アプリケーションを実行可能にするコンパイラとトランスレータがあります。

  • clspv-gitAUR: Clspv は OpenCL C のサブセットを Vulkan コンピュートシェーダに変換するプロトタイプコンパイラです。
  • clvk: clvk は、clspv をコンパイラとして使用し、Vulkan 上の OpenCL 3.0 プロトタイプ実装です。
  • xrt-binAUR: FPGA xrt のための Xilinx ランタイム
  • fpga-runtime-for-opencl: FPGA ランタイム

32ビットランタイム

OpenCL を使う32ビットプログラムを実行するには、互換性のあるハードウェア32ビットランタイムをインストールする必要があります。

ヒント: clinfo ユーティリティは64ビットの OpenCL プラットフォームや存在するデバイス、ICD ローダプロパティをリストアップするためだけに使用できます。32ビットにおいては、clinfo を 32ビット向けにコンパイルするか、archlinux32 プロジェクトの32ビット版 clinfo を使う必要があります。

AMD/ATI

NVIDIA

ICD ローダー (libOpenCL.so)

OpenCL ICD ローダーはプラットフォームに依存しないライブラリで、OpenCL API 経由で特定のデバイスのドライバーをロードするのに使われます。ほとんどの OpenCL ベンダーはそれぞれ独自の OpenCL ICD ローダーを提供しており、他のベンダーの OpenCL 実装でも問題なく動作するはずです。残念ながら、大抵のベンダーは最新の 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

全ての SDK は ld.so.conf.d ファイルでランタイムのライブラリディレクトリを検索パスに追加するため上記の設定をする必要があります。

様々な OpenCL ICD が含まれているパッケージ:

ノート: ICD ローダーのベンダーの名前が出るのはローダーを識別する必要があるときだけです。他の場合、ベンダーの名前は関係ありません。ICD ローダーはベンダーに依存しないため (正しく実装されてさえいれば) 相互に交換して使うことができます。

開発

OpenCL を使用して開発をしたい場合、最低でも以下のパッケージが必要になります:

  • ocl-icd: OpenCL ICD ローダーの実装、最新の OpenCL の仕様に沿っています。
  • opencl-headers: OpenCL C/C++ API ヘッダー。

ベンダーの SDK には様々なツールやサポートライブラリが含まれています:

  • intel-opencl-sdkAUR: Intel の OpenCL SDK (旧バージョン、最新の OpenCL SDK は INDE や Intel Media Server Studio に含まれています)
  • amdapp-sdkAUR: このパッケージでは /opt/AMDAPP にファイルがインストールされ、SDK ファイルの他にコードサンプルが大量に同梱されています (/opt/AMDAPP/SDK/samples/)。システム内の OpenCL プラットフォームやデバイスを確認したり詳細情報を表示できる clinfo ユーティリティが含まれています。SDK には CPU OpenCL ドライバーが含まれているため、CPU デバイスで OpenCL を実行するのに追加のドライバーは必要ありません (AMD 製じゃなくても動作します)。
  • cuda: NVidia の GPU SDK、OpenCL 1.1 のサポートを含んでいます。

実装

あなたの環境で有効になっている OpenCL 実装を確認するには、次のコマンドを使います:

$ ls /etc/OpenCL/vendors

OpenCL プラットフォームとデバイスの利用可能な (既知の) プロパティを確認するには clinfoインストールしてください。

言語バインディング

SYCL

SYCL は Khronos Group によって作られたオープン・ロイヤルティフリーな標準で、OpenCL 1.2 に基づく C++ によるシングルソースのヘテロジニアスプログラミングモデルを定義しています。

SYCL はランタイム部分と C++ デバイスコンパイラから構成されます。デバイスコンパイラはあらゆる種類のアクセラレータを対象とします。ランタイムは OpenCL 実装が存在しない場合に CPU コードパスにフォールバックするために必要となります。

実装

  • computecppAUR: Codeplay による SYCL 1.2.1 のプロプライエタリ実装。SPIR, SPIR-V を対象とし、実験的なデバイスターゲットとして PTX (NVIDIA) にも対応。
  • trisycl-gitAUR: Xilinx によって開発されているオープンソースの実装。
  • hipsycl-cuda-gitAURhipsycl-rocm-gitAUR: OpenCL の代わりに AMD の HIP を使用するフリー実装。AMD と NVIDIA の GPU で動作可能。

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[リンク切れ: パッケージが存在しません] などが存在します。

開発

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 を必要とします。CUDA は複数のコンポーネントから構成されます:

  • 必須:
    • プロプライエタリの NVIDIA カーネルモジュール
    • CUDA "driver" と "runtime" ライブラリ
  • 任意:
    • 追加ライブラリ: CUBLAS, CUFFT, CUSPARSE など。
    • CUDA ツールキット。nvcc コンパイラが含まれています。
    • CUDA SDK。CUDA と OpenCL のプログラムの多数のサンプルやコードが含まれています。

カーネルモジュールと CUDA の "driver" ライブラリは nvidiaopencl-nvidia に入っています。"runtime" ライブラリと CUDA ツールキットは cuda パッケージでインストール可能です。cuda-gdb を使うには ncurses5-compat-libsAUR のインストールが必要です。FS#46598 を参照。

開発

cuda パッケージは全てのコンポーネントを /opt/cuda ディレクトリにインストールします。CUDA のコードをコンパイルするときはコンパイラのインクルードパスに /opt/cuda/include を追加してください。例えばコンパイラのフラグやオプションに -I/opt/cuda/include を加えることで追加できます。NVIDIA による gcc ラッパーである nvcc を使うには、/opt/cuda/bin をパスに追加してください。

インストールが成功したかどうかや、CUDA が動いているかどうかを確かめるには、CUDA samples をコンパイルすることで可能です。インストールをチェックする方法の一つとして、deviceQuery サンプル実行するというものがあります。

言語バインディング

ROCm

ROCm (Radeon Open Compute) は AMD のオープンソース並列計算アーキテクチャでありフレームワークです。これは AMD GPU を要求しますが、一部の ROCm ツールはハードウェアに依りません。さらなる情報やインストール手順については Arch Linux 向けの ROCm リポジトリを見てください。

HIP

Heterogeneous Interface for Portability (HIP) は、GPU ハードウェア上で高パフォーマンスなカーネルを設計するための AMD の専用 GPU プログラミング環境です。HIP は C++ ランタイム API であり、異なるプラットフォームで移植性の高いアプリケーションを開発することができるプログラミング言語です。

  • rocm-hip-runtimeAUR: ベースのランタイム。AMD プラットフォーム上で HIP アプリケーションを実行するためのパッケージ群。
  • hip-runtime-amdAUR: ROCm の AMDGPU 向け Heterogeneous Interface。polaris アーキテクチャ(RX 500 シリーズ)から AMD の最新 RDNA 2 アーキテクチャ(RX 6000 シリーズ)までの GPU をサポートします。
  • hip-runtime-nvidiaAUR: ROCm の NVIDIA GPU 向け Heterogeneous Interface。

OpenMP

openmp-extrasAUR パッケージは AOMP という、AMD GPU 上の OpenMP API のサポートが追加されたオープンソースの Clang/LLVM ベースのコンパイラを提供します。

OpenCL

rocm-opencl-runtimeAUR パッケージは ROCm フレームワークの一部で、OpenCL ランタイムを提供します。

OpenCL Image Support

現在、最新の ROCm バージョンには、Darktable などの GPGPU により支援されたソフトウェアにより使用される OpenCL Image Support が含まれています。必要なものは AMDGPU オープンソースグラフィックドライバと ROCm です。AMDGPU PRO は必要ありません。

$ /opt/rocm/bin/clinfo | grep -i "image support"
Image support                                   Yes

GPGPU のアクセラレーションがあるソフトウェア

この記事またはセクションは加筆を必要としています。
理由: More application may support GPGPU. (議論: トーク:GPGPU#)
  • Bitcoin
  • Blender – Nvidia GPU 向けの CUDA のサポートと AMD GPU 向けの OpenCL のサポート。詳細はこちら
  • BOINC
  • FFmpeg – 詳細はこちら
  • Folding@home
  • GIMP – 実験段階 - 詳細はこちら
  • HandBrake
  • Hashcat
  • LibreOffice Calc – 詳細はこちら
  • clinfo – システムの OpenCL プラットフォーム・デバイスのプロパティを確認。
  • cuda_memtestAUR – GPU memtest。名前とは裏腹に、CUDA と OpenCL の両方をサポートしています。
  • darktable – OpenCL 機能を使うには GPU に最低でも 1GB のメモリが搭載されていて Image support が必要です (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 への移植
  • xmrig - High Perf CryptoNote CPU と GPU(OpenCL, CUDA) miner

参照