GPGPU

提供: ArchWiki
OpenCLから転送)
ナビゲーションに移動 検索に移動

関連記事

GPGPU は General-purpose computing on graphics processing units; GPUによる汎用計算 の略です。

OpenCL

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

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

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

ランタイム

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

AMD/ATI

  • opencl-clover-mesa または opencl-rusticl-mesa: clover と rusticl による mesa ドライバ用の OpenCL サポート
  • rocm-opencl-runtime: AMD の ROCm GPU コンピュートスタックの一部。GFX8 およびそれ以降のカード (Fiji, Polaris, Vega) を公式にサポートしており、Navi10 ベースのカードは非公式で部分的なサポートがあります。Vega より古いカードをサポートするには、ラインタイム変数 ROC_ENABLE_PRE_VEGA=1 を設定する必要があります。これは、ubuntu の amdgpu-install に opencl=rocr指定したものに似てはいますが、全く異なるものです。このパッケージの rocm バージョンは ubuntu のインストーラバージョンとは異なるからです。
  • opencl-legacy-amdgpu-proAUR: AMD の ubuntu リリースから再パッケージングされたレガシーな Orca OpenCL。ubuntu の amdgpu-install に opencl=legacy指定することと等価です。
  • opencl-amdAURopencl-amd-devAUR: AMD の Ubuntu リリースから再パッケージングされた ROCm コンポーネント群。Ubuntu の amdgpu-install で opencl=rocr,legacy指定することと等価です。
  • amdapp-sdkAUR: AMD CPU ランタイム

NVIDIA

Intel

  • intel-compute-runtime: またの名を Neo OpenCL ランタイム。第8世代 (Broadwell) 以降の Intel HD Graphics GPU 用のオープンソース実装です。
  • opencl-clover-mesa または opencl-rusticl-mesa: clover と rusticl による mesa ドライバ用の OpenCL サポート
  • beignetAUR: 第7世代 (Ivy Bridge) 以降の Intel HD Graphics GPU 用のオープンソース実装。これは Intel によって非推奨となっており、NEO OpenCL ドライバが後継です。ただし、古いハードウェアプラットフォーム (例: Ivy Bridge、Haswell) においては推奨されるソリューションです。
  • intel-openclAUR: 第7世代 (Ivy Bridge) 以降の Intel HD Graphics GPU のプロプライエタリな実装。これは Intel によって非推奨となっており、NEO OpenCL ドライバが後継です。ただし、古いハードウェアプラットフォーム (例: Ivy Bridge、Haswell) においては推奨されるソリューションです。
  • intel-opencl-runtimeAUR: Intel Core 及び Xeon プロセッサ用の実装。非 Intel な CPU もサポートしています。

その他

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

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

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

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 ドライバが含まれているため、OpenCL を CPU デバイス上で実行するための追加のドライバは必要ありません (CPU のベンダを問わず)。
  • cuda: OpenCL 3.0 のサポートを含む Nvidia の GPU SDK。

実装

あなたのシステムで現在アクティブになっている 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 を参照してください。 (議論: トーク:GPGPU#)

Rusticl は、Rust で記述された新しい OpenCL 実装で、opencl-rusticl-mesa によって提供されています。環境変数 RUSTICL_ENABLE=driver (driver は Gallium ドライバ。radeonsiiris など) を設定することで有効化できます。

任意で、OpenCL アプリケーションが Rusticl を検出しない場合、以下の環境変数を使用してください:

OCL_ICD_VENDORS=/etc/OpenCL/vendors/rusticl.icd

言語バインディング

SYCL

Wikipedia:SYCL によると:

SYCL は、様々なハードウェアアクセラレータにおいてプログラミングの生産性を向上させるための高レベルなプログラミングモデルです。純粋な C++17 をベースにした、単一ソースな組み込みドメイン固有言語 (eDSL) です。
SYCL は、ロイヤリティフリーでクロスプラットフォームな抽象レイヤーです。完全に標準の C++ を使って様々な種類のプロセッサ向けに "単一ソース" なスタイルでコードを記述することのできる OpenCL からインスパイアされたコンセプト、移植性、そして効率性をベースに構築されています。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 実装にマージされる予定です 情報)。
  • trisycl-gitAUR: 主に Xilinx によって開発されているオープンソースの実装。
  • hipsycl-cuda-gitAURhipsycl-rocm-gitAUR: OpenCL の代わりに AMD の HIP を使用するフリー実装。AMD と NVIDIA の GPU で動作可能。
  • intel-oneapi-dpcpp-cpp: Intel の Data Parallel C++: SYCL の oneAPI 実装。

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 

この記事またはセクションは情報が古くなっています。
理由: このドライバは AMD opencl-legacy-amdgpu-proAURopencl-amdAUR 用か? (Discuss)

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 "ドライバ" と "ランタイム" ライブラリ
  • 任意:
    • 追加のライブラリ: 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 samples をコンパイルすることで可能です。インストールをチェックする方法の一つとして、deviceQuery サンプルを実行するというものがあります。

言語バインディング

ROCm

ROCm (Radeon Open Compute) は、AMD のオープンソースな並列計算アーキテクチャ及びフレームワークです。これは AMD GPU を必要としますが、一部の ROCm ツールはハードウェアに依存しません。詳細は Arch Linux リポジトリ用の ROCm を見てください。

  • rocm-hip-sdk: HIP と AMD プラットフォーム用のライブラリを使用するアプリケーションの開発。
  • rocm-opencl-sdk: AMD プラットフォーム用の OpenCL ベースアプリケーションの開発。

HIP

Heterogeneous Interface for Portability (HIP) は、GPU ハードウェア上で高パフォーマンスなカーネルを設計するための、AMD の専用 GPU プログラミング環境です。HIP は、異なるプラットフォーム上でポータブルなアプリケーションを作成できるようにする C++ ランタイム API 及びプログラミング言語です。

  • rocm-hip-runtime: ベースランタイム。AMD プラットフォーム上で HIP アプリケーションを実行するためのパッケージ群。
  • hip-runtime-amd: ROCm における AMDGPU 用の Heterogeneous Interface。Polaris アーキテクチャ (RX 500 シリーズ) から AMD の最新 RDNA 2 アーキテクチャ (RX 6000 シリーズ) までの GPU をサポートします。
  • miopen-hip: HIP バックエンドを用いる、AMD のオープンソースのディープラーニングライブラリ。
  • hip-runtime-nvidiaAUR: ROCm における NVIDIA GPU 用 Heterogeneous Interface。
ヒント: HIP の Blender における使用に関するより多くの情報が利用可能です。

OpenMP

openmp-extrasAUR パッケージは AOMP (AMD GPU における OpenMP API のサポートを追加した、オープンソースの Clang/LLVM ベースコンパイラ) を提供します。

OpenCL

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

OpenCL image support

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

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

トラブルシューティング

まず、GPU が /opt/rocm/bin/rocminfo ディレクトリに現れるか確認してください。現れない場合、ROCm はあなたの GPU をサポートしていないか、あなたの GPU のサポート無しでビルドされた可能性があります。

PyTorch

ROCm で PyTorch を使うには、python-pytorch-rocm をインストールしてください。

$ python -c 'import torch; print(torch.cuda.is_available())'
True

ROCm はまるで CUDA であるかのように振る舞うので、上記のコマンドは True を返すはずです。True を返さない場合、あなたの GPU のサポート無しで PyTorch がコンパイルされているか、依存関係の衝突が発生している可能性があります。ldd /usr/lib/libtorch.so を実行してみることで、どちらの問題が発生しているか確認することができます - 欠落している .so ファイルが無く、かつ同じ .so ファイルに複数のバージョンが存在しない必要があります。

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

参照

翻訳ステータス: このページは en:GPGPU の翻訳バージョンです。最後の翻訳日は 2024-05-13 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。