GPGPU
GPGPU は General-purpose computing on graphics processing units の略で GPU による汎目的計算を意味します。Linux では、現在2つの GPGPU フレームワークが存在します: OpenCL と CUDA。
目次
OpenCL
OpenCL (Open Computing Language) は非営利団体である Khronos グループによって開発されている、オープンでロイヤルティフリーの並列プログラミングフレームワークです。
OpenCL の仕様書には一般環境として必要なプログラミング言語と、プログラマーがこの環境で呼び出せる C API が書かれています。
OpenCL ランタイム
OpenCL を使用するプログラムを実行するには、ハードウェアに対応したランタイムをインストールする必要があります。
AMD/ATI
- opencl-mesa: AMDGPU と Radeon 用のフリーなランタイム。
- opencl-amdAUR: AMDGPU 用のプロプライエタリなスタンドアロンのランタイム。
- rocm-opencl-runtimeAUR: AMD の完全なオープンソースの ROCm GPU 計算スタックに含まれます。GFX8 以降のカードに対応 (Fiji, Polaris, Vega)。
- opencl-amdgpu-pro-orcaAUR: AMDGPU PRO 用のプロプライエタリなランタイム (Vega 10 よりも古い製品をサポート)。
- opencl-amdgpu-pro-palAUR: AMDGPU PRO 用のプロプライエタリなランタイム (Vega 10 以降の新しい製品をサポート)。
- opencl-catalystAUR: AMD のプロプライエタリなランタイム。AMDGPU に取って代わられる予定です。
- amdapp-sdkAUR: AMD CPU ランタイム。
NVIDIA
- opencl-nvidia: 公式 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 実装。
OpenCL 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 が含まれているパッケージ:
- ocl-icd: 推奨、基本的に最新です。
- AMD による libopenclAUR[リンク切れ: パッケージが存在しません]: OpenCL のバージョン 2.0 を提供します。目下 AMD によって制限的なライセンスで配布されているため、公式リポジトリに入れることはできません。
- Intel による intel-openclAUR: OpenCL 2.0 を提供します。intel-compute-runtime によって廃止予定。
OpenCL 開発
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
ユーティリティが含まれています。AMD APP SDK には CPU OpenCL ドライバーが含まれているため、CPU デバイスで OpenCL を実行するのに追加のドライバーは必要ありません (AMD 製じゃなくても動作します)。GPU の OpenCL ドライバーは catalystAUR パッケージに入っています。 - cuda: NVidia の GPU SDK、OpenCL 1.1 のサポートを含んでいます。
実装
あなたの環境で有効になっている OpenCL 実装を確認するには、次のコマンドを使います:
$ ls /etc/OpenCL/vendors
OpenCL プラットフォームとデバイスの利用可能な (既知の) プロパティを確認するには clinfo をインストールしてください。
言語バインディング
- C++: Khronos によるバインディングが公式の仕様書 (バージョン 1.2) に存在します。opencl-headers に含まれています。
- C++/Qt: Qt Labs に QtOpenCL という名前の実験的なバインディングがあります - 詳しくは ブログエントリ を参照
- JavaScript/HTML5: WebCL
- Python: PyOpenCL という同じ名前を持った2つのバインディングが存在します。片方は [extra] に入っています: python-pyopencl。もう片方については sourceforge を見て下さい。
- D: cl4d
- Java: JOCL (JogAmp の一部)
- Mono/.NET: Open Toolkit
- Go: OpenCL bindings for Go
- Racket: raco でインストールすることができるネイティブインターフェイスが PLaneT にあります。
- Rust: ocl
- Julia: OpenCL.jl
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-gitAUR と hipsycl-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 開発
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" ライブラリは nvidia と opencl-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
をパスに追加してください。
/opt/cuda/samples
にインストールされたサンプルをコンパイルしてコンパイルされたサンプルを実行することで、インストールが成功したこと、CUDA が動作していることを確認できます (サンプルディレクトリで make
を実行するだけでコンパイルできます、ただし、コンパイルする前に /opt/cuda/samples
ディレクトリをホームディレクトリにコピーしておいた方が良いでしょう)。インストールが問題ないことを確認するときは deviceQuery
と呼ばれるサンプルのどれかを実行するのがふさわしいと思われます。
言語バインディング
- Fortran: PGI CUDA Fortran Compiler
- Haskell: accelerate パッケージ に CUDA バックエンドがあります
- Java: JCuda
- Mathematica: CUDAlink
- Mono/.NET: CUDA.NET, CUDAfy.NET
- Perl: KappaCUDA, CUDA-Minimal
- Python: python-pycuda または Kappa
- Ruby, Lua: Kappa
GPGPU のアクセラレーションがあるソフトウェア
- Bitcoin
- Blender - Nvidia GPU 向けの CUDA のサポートと AMD GPU 向けの OpenCL のサポート。詳細はこちら。
- BOINC
- DaVinci Resolve - ノンリニア動画エディタ。OpenCL と CUDA の両方を使います。
- FFmpeg – 詳しくは こちら を参照。
- GIMP (実験段階 - [1] を参照)
- HandBrake
- Hashcat
- LibreOffice Calc – こちら を参照。
- clinfo – システムの OpenCL プラットフォーム・デバイスのプロパティを確認。
- cuda_memtestAUR - GPU memtest。名前とは裏腹に、CUDA と OpenCL の両方をサポートしています。
- darktable - OpenCL 機能を使うには GPU に最低でも 1GB のメモリが搭載されていて Image support が必要です (clinfo コマンドの出力で確認できます)。
- imagemagick
- lc0AUR - ニューラルネットワークの検索に使います (tensorflow, OpenCL, CUDA, openblas に対応)。
- opencv
- pyrit
- tensorflow-cuda および tensorflow-opt-cuda - TensorFlow の CUDA 移植
- tensorflow-computecppAUR - TensorFlow の SYCL 移植