OpenCL

Last-modified: 2010-05-17 (月) 23:07:17

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のウェブページからダウンロードし、インストールする。

サンプルをビルドする。

サンプルは、以下の場所に配置される。

/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入門」(奥薗隆司)