OpenCLの他に、処理の並列化技術はいくつかある。どれを使うのが適切なのか比較してみて感じたことをいくつか挙げて見る。まず、比較したのは次の通り。
- OpenMP
- Intel Threading Building Block (TBB)
- Grand Central Dispatch (GCD)
- OpenCL
なお、GCDについては、執筆時点ではMac OS X 10.6が発売されていないので、Appleのサイトで一般公開されている情報のみで考える。
OpenMP
C/C++のコードでコンパイラレベルで並列処理を行う。並列化したい場所を#pragmaで指定する。#pragmaは専用のものを使って、共有する変数などを指定する。関数内の特定のforループのみ並列化するなどの指定が出来るので小回りが利く。また、既存のコードが並列化を行えるようなアルゴリズムで実装されていれば、#pragmaを追加するだけで並列化できるため、既存のコードの修正量は少ない。
Intel C++ CompilerやVisual C++, GCCなどで対応している(コンパイラのバージョンによっては対応していない)
OpenMP.org
Intel Threading Building Block (TBB)
コンパイラではなく、クラスライブラリのレベルで並列化を行う。並列化したい処理をクラスにし、operator()をオーバーライドして記述する。個人的にはSTL (Standard Template Library) に慣れている開発者にはわかりやすいのではと思う。複数のプラットホームに対応している。製品版とオープンソース版が有る。
Intel Threading Building Blocks for Open Source
Intel Threading Building Blocks (Intel Software Network)
http://software.intel.com/en-us/intel-tbb/Grand Central Dispatch (GCD)
並列化処理をOSレベルで行うことで、効率的に行える。OS内で発生したイベントなども並列化されるようである。スレッドの制御をOSにある程度任せられる印象が有る。Mac OS X 10.6 以降専用。
アップル – Mac OS X – Snow Leopardの新しいテクノロジー
OpenCL
計算処理をGPUなどCPU以外でも利用できるようになる。どの程度並列化されるかはデバイスに依存する。デバイスからこれらの情報は取得でき、その取得した上限値までの範囲でプログラム側で制御できる。また、演算処理そのものも専用のAPIを使って記述することで、実行時にデバイス用にビルドしたときに最適化された専用命令が使用されるように期待できる(曖昧な書き方になっているのは、実行環境にインストールされているOpenCLのコンパイラやデバイスドライバに依存するため)
OpenCL (Khronos group)
結局どれを採用するべきか?
個人的な考察であるが、並列化したい処理の規模がある程度大きく、ファイルアクセスやプログラム側で他のモジュールと通信するような物は TBB や GCD を使用するのが良いと思われる。Mac OS X 専用のプログラムや処理の場合にはOS側で効率的な処理が期待できるので、GCDを使用するべきだと思われる。
並列化したい処理が有る程度、まとまっており、小さな場合はOpenMPが良いと思われる。アルゴリズムなどで、既存のC/C++のコードが有る場合には、比較的作業量も少なく並列化できる。但し、既存のコードが並列化できるような形に実装されていない場合は大きくコードを書き直す必要が有る。
また、アルゴリズムなどでも計算量が多い場合にはOpenCLの方が良いと思われる。並列化での高速化の他に、デバイス専用命令によるハードウェアによる高速化が期待できる。但し、OpenCLのコードに書き直す必要が有るため、作業量は多い。