GPGPU (日本語) - ArchWiki

# GPGPU (日本語)

関連記事

- AMD Catalyst
- NVIDIA

GPGPU は General-purpose computing on graphics processing units の略で GPU による汎目的計算を意味します。Linux では、現在2つの GPGPU フレームワークが存在します: OpenCL と CUDA。

## OpenCL

### 概要

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

一般的に OpenCL フレームワークは以下から構成されます:

- OpenCL API を提供するライブラリ。libCL や libOpenCL とも (Linux においては `libOpenCL.so`)
- OpenCL の実装、以下を含む:
  - デバイスドライバー
  - OpenCL/C コードコンパイラ
  - SDK *
- ヘッダーファイル *

* が付いているものは開発のために必要

### OpenCL ライブラリ

libCL には複数の選択肢が存在します。一般的には、公式リポジトリから libcl をインストールします。

しかしながら、他の libCL が適切な場合も考えられます。これについては以下のパラグラフで詳しく説明しています。

### OpenCL の ICD モデル

OpenCL ではベンダー固有の実装を同じマシンに同時に複数インストールすることが可能になっています。実際には、Installable Client Driver (ICD) モデルを使って実装されています。このモデルの中心になっているのは ICD ローダーを実装する libCL ライブラリです。ICD ローダーを通して、OpenCL アプリケーションはシステム上に存在する全てのプラットフォーム・全てのデバイスにアクセスすることができます。

ベンダーに依存されないと言えど、ICD ローダーを提供するライブラリが必要なのは変わりません。Arch Linux では、今のところ2つの選択肢が用意されています:

- NVIDIA の libcl。OpenCL バージョン 1.0 を提供し、やや旧式です (最新版でも変わりません)。これまでのところ OpenCL 1.1 のコードにおける挙動はテストされていません。
- AMD の libopencl。OpenCL のバージョン 1.1 までを提供します。目下 AMD によって制限的なライセンスで配布されているため、公式リポジトリに入れることはできません。

(Intel の libCL も存在しますが、これは別の一つのパッケージになっていません。)

Note: ICD Loader's vendor is mentioned only to identify each loader, it is otherwise completely irrelevant. ICD Loaders are vendor-agnostic and may be used interchangeably (as long as they are implemented correctly).

基本的な使用においては、インストールとアップデートが簡単なことから libcl を推奨します。高度な使用をする場合は、libopencl が推奨されます。多少の違いがあっても libcl と libopencl はどちらも全ての実装で動作するはずです。

### 実装

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

    $ ls /etc/OpenCL/vendors

#### AMD

AMD の OpenCL 実装は AMD APP SDK として知られています。以前は AMD Stream SDK または ATi Stream とも呼ばれていました。

Arch Linux では、現在 AMD APP SDK は AUR の amdapp-sdk としてインストールすることができます。このパッケージは `/opt/AMDAPP` にインストールされ、SDK ファイルとは別に、多数のサンプルコードも含まれています (`/opt/AMDAPP/SDK/samples/`)。システム上の OpenCL プラットフォームやデバイスをリストアップして、それぞれの詳しい情報を表示する `clinfo` ユーティリティも入っています。

AMD APP SDK 自体にも CPU の OpenCL ドライバーが含まれているため、(ベンダーの如何を問わず) CPU デバイスで OpenCL を実行するのに追加のドライバーは必要ありません。GPU の OpenCL ドライバーは (任意の依存パッケージである) catalyst パッケージに入っています。オープンソースドライバー (xf86-video-ati) は OpenCL をサポートしていません。

コードは (依存パッケージになっている) llvm を使ってコンパイルされます。

#### Mesa (Gallium)

Mesa の OpenCL サポートは開発中です (http://www.x.org/wiki/GalliumStatus/ を参照)。AMD Radeon カードは r600g ドライバーによってサポートされています。

Arch Linux は現在 (2014年4月; Mesa 10.1.0; LLVM 3.4)、OpenCL サポートを有効にして Mesa をビルドしていません。http://dri.freedesktop.org/wiki/GalliumCompute/ のインストール手順を見て下さい (最良の結果を得るには LLVM と Mesa の開発ブランチを使います)。

lordheavy のリポジトリ を使うこともできます。以下のパッケージをインストールしてください:

- mesa-dri-git[broken link: package not found]
- opencl-mesa-git
- libclc-git

驚くべきことに、radeon+r600g を使った場合 Catalyst 13.11 Beta1 と比べて 20% 高速に pyrit が動作します (他の7つの CPU コアでもテスト):

    catalyst     #1: 'OpenCL-Device 'Barts'': 21840.7 PMKs/s (RTT 2.8)
    radeon+r600g #1: 'OpenCL-Device 'AMD BARTS'': 26608.1 PMKs/s (RTT 3.0)

執筆時点では (2013年10月30日)、このパフォーマンスを得るためには [1] と [2] のパッチを Mesa のコミット ac81b6f2be8779022e8641984b09118b57263128 上にあてる必要があります。パッチがあたってない最新の LLVM トランクを使用しました (SVN rev 193660)。

#### NVIDIA

NVIDIA の実装は公式リポジトリの opencl-nvidia からインストールできます。nvidia カーネルモジュールが動作する NVIDIA GPU のみをサポートしています (nouveau はまだ OpenCL をサポートしていません)。

#### Intel

Intel の実装は、シンプルに Intel OpenCL SDK という名前が付けられており、Intel の CPU (主に Core と Xeon) と GPU だけに最適化された OpenCL パフォーマンスを発揮します。パッケージは AUR からインストールできます: intel-opencl-sdk。ランタイムは別のパッケージとして AUR にあります: intel-opencl-runtime。Ivy Bridge 以降の新しいハードウェアに搭載されている統合グラフィックハードウェアのための OpenCL は AUR の beignet から入手できます。

### 開発

OpenCL を利用するアプリケーションを開発するには、実装とドライバー、コンパイラを含む OpenCL フレームワークに加えて opencl-headers パッケージをインストールする必要があります。あなたのコードを `libOpenCL` にリンクしてください。

#### 言語バインディング

- C++: Khronos によるバインディングが公式の仕様書に存在します。opencl-headers に含まれています。
- C++/Qt: Qt Labs に QtOpenCL という名前の実験的なバインディングがあります - 詳しくは ブログエントリ を参照
- JavaScript/HTML5: WebCL
- Python: PyOpenCL という同じ名前を持った2つのバインディングが存在します。片方は [extra] に入っています: python2-pyopencl。もう片方については sourceforge を見て下さい。
- D: cl4d
- Haskell: OpenCLRaw パッケージを AUR からインストールできます: haskell-openclraw-git
- Java: JOCL (JogAmp の一部)
- Mono/.NET: Open Toolkit
- Go: OpenCL bindings for Go

## 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 パッケージでインストール可能です。このライブラリは64ビット版だけが存在します。

### 開発

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

### 言語バインディング

- Fortran: FORTRAN CUDA, PGI CUDA Fortran Compiler
- Haskell: accelerate パッケージ に CUDA バックエンドがあります
- Java: jCUDA, JCuda
- Mathematica: CUDAlink
- Mono/.NET: CUDA.NET, CUDAfy.NET
- Perl: Kappa, CUDA-Minimal
- Python: AUR の: pycuda-git, また Kappa
- Ruby, Lua: Kappa

### ドライバーの問題

複数の GPU が載っている環境で CUDA プログラムを実行する場合、パーミッション問題を解決するためにレガシーなドライバー nvidia-304xx または nvidia-304xx-lts を使う必要があるかもしれません。

## OpenCL と CUDA のアクセラレーションがあるソフトウェア

- Bitcoin
- GIMP (実験段階 - [3] を参照)
- pyrit
- aircrack-ng
- john-opencl
- cuda_memtest - GPU memtest。名前とは裏腹に、CUDA と OpenCL の両方をサポートしています。

## 参照

- OpenCL 公式ホームページ
- CUDA 公式ホームページ
- The ICD extension specification
- AMD APP SDK ホームページ
- CUDA Toolkit ホームページ
- Intel OpenCL SDK ホームページ

Categories:

- Development (日本語)
- Graphics (日本語)