OpenCLとは
OpenCLを利用する事で、ヘテロジニアス・プロセッサ上で各プロセッサ(マイクロプロセッサ)に効率よく処理を割り当てる事ができる。
※ヘテロジニアス・プロセッサとは、複数種類のマイクロプロセッサを積んだプロセッサの事。
一般的には、GPU(グラフィック処理専用プロセッサ)を利用することと認識されているが、実際には、GPUだけでなく、DSPなどを利用する事も視野に入っている。
各プロセッサの特長
OpenCLを利用する場合、結局利用するプロセッサを強く意識してコードを書く必要がある。
そんなわけで各プロセッサの特長をずらずらと列挙する。(むろん、OpenCLから見た特長である)
GPU:Graphics Processing Unit
- 数10個〜数100個のプロセッサ・コアを持つ。(2009年現在)
- 高速なオンボードメモリを持つ。(2009年現在、VRAM=140GB/secなど。GeForce9400Mで5.3GB/secだったけど。)
- ほとんどが演算器。(計算は激速)
- 分岐処理は弱い。
- スレッドの切替に対するコストが低い。(CPUのスレッド切替コストは物凄く高い)
DSP:Digital Signal Processor
不勉強につき、省略。
Mac OSX Snow Leopard
Xcodeでフレームワークを追加するだけ。
環境の整備
ツールキットをnVidiaのウェブページからダウンロードし、インストールする。
- http://www.nvidia.co.jp/object/cuda_opencl_jp.html
- http://www.nvidia.com/object/cuda_opencl_new.html
サンプルをビルドする。
サンプルは、以下の場所に配置される。
/Developer/GPU Computing/OpenCL/
SDK Ver.3.0のサンプルをビルドするには、あらかじめ以下の手順でユーティリティをビルドしておく必要がある。
#cp
#make
#rm
※サンプル全体のビルドは、/Developer/GPU Computing/OpenCL/でmakeを実行。
※どのようなビルドが行われているかを知りたいなら、「make -n」で。
ちなみに、oclVectorAddのmake時のコマンドは、以下のようになっている。
※長いので途中で改行しているが、実際には改行はない。
g++ -fPIC -m32 -arch i386 -o ../../..//OpenCL//bin//darwin/release/oclVectorAdd obj/release/oclVectorAdd.cpp.o -L../../..//OpenCL//common//lib -L../../..//shared/lib/ -L../../..//shared//lib/darwin -framework OpenCL -framework OpenGL -framework AppKit -L../../..//OpenCL//common//lib -L../../..//shared/lib/ -L../../..//shared//lib/darwin -loclUtil_i386 -lshrutil_i386
サンプルを実行する。
サンプルのビルドができたら、以下の場所にある実行ファイルを実行できる。
/Developer/GPU Computing/OpenCL/bin/darwin/release/
ひとまず、以下のサンプルを動かす事をお勧めする。
- oclDeviceQuery
- oclBandwidthTest
オンラインコンパイルとオフラインコンパイル
OpenCLでは、各プロセッサ用のコードを実行時にコンパイルすることができる(オンラインコンパイル)。
このことは、The OpenCL Specification Version: 1.0 Document Revision: 48にも記載されているが、ここではそれぞれの長所、短所を考える。
オンラインコンパイル(実行時コンパイル)
- 【長所】実行する処理を自動生成する事ができる。
- 【長所】ひょっとすると環境に応じた最適な処理コード生成が期待できる?? (未検証)
- 【短所】ソースコードを所持すると、実質オープンソースになってしまう。
- 【短所】ビルドに処理時間を食ってしまう。
オフラインコンパイル(ビルド時コンパイル)
- 【長所】ソースコードを隠蔽できる。
- 【短所】ひょっとすると実行時に実行できないコードを生成しているかもしれない??(未検証)
参考文献
- 秀和システム「OpenCL入門」(奥薗隆司)