GPGPU

提供: ArchWiki
2015年12月6日 (日) 18:25時点におけるKusakata (トーク | 投稿記録)による版
ナビゲーションに移動 検索に移動

関連記事

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

OpenCL

概要

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

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

Arch Linux では複数のパッケージを用意しています。

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

  • opencl-nvidia: NVidia の GPU で実行 (NVidia の公式ランタイム)
  • opencl-mesa: AMD の GPU で mesa ドライバーを使って実行 (開発中、効果のほどは保証できません)
  • opencl-catalystAUR: AMD の GPU で実行 (AMD の公式ランタイム)
  • intel-opencl-runtimeAUR: CPU で実行 (Intel の公式ランタイム、ただし Intel の CPU である必要はありません)
  • poclAUR: CPU で実行 (LLVM ベースの 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: AMD の OpenCL SDK
  • cuda: NVidia の GPU SDK、OpenCL 1.1 のサポートを含んでいます。

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

実装

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

$ ls /etc/OpenCL/vendors

AMD

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

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

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

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

Mesa (Gallium)

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

Arch Linux では OpenCL のサポートは別のパッケージになっています: opencl-mesa。使い方は http://dri.freedesktop.org/wiki/GalliumCompute/ を見て下さい。

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

驚くべきことに、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-sdkAUR。ランタイムは別のパッケージとして AUR にあります: intel-opencl-runtimeAUR。Ivy Bridge 以降の新しいハードウェアに搭載されている統合グラフィックハードウェアのための OpenCL は AUR の beignetAUR から入手できます。

POCL

CPU で動作する LLVM ベースの実装です。poclAUR でインストールできます。

開発

OpenCL 開発に必要なパッケージは概要セクションに記載しています。完全な SDK のインストールは任意です (ランタイム実装によります、大抵はベンダーの SDK の一部として含まれています)。あなたのアプリケーションを libOpenCL.so にリンクしてください。

言語バインディング

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

開発

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

/opt/cuda/sample にインストールされたサンプルをコンパイルしてコンパイルされたサンプルを実行することで、インストールが成功したこと、CUDA が動作していることを確認できます (サンプルディレクトリで make を実行するだけでコンパイルできます、ただし、コンパイルする前に /opt/cuda/samples ディレクトリをホームディレクトリにコピーしておいた方が良いでしょう)。インストールが問題ないことを確認するときは deviceQuery と呼ばれるサンプルのどれかを実行するのがふさわしいと思われます。

言語バインディング

ドライバーの問題

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

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

参照