OpenCLと他の並列化技術との比較雑感

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

http://openmp.org/wp/

Intel Threading Building Block (TBB)

コンパイラではなく、クラスライブラリのレベルで並列化を行う。並列化したい処理をクラスにし、operator()をオーバーライドして記述する。個人的にはSTL (Standard Template Library) に慣れている開発者にはわかりやすいのではと思う。複数のプラットホームに対応している。製品版とオープンソース版が有る。
Intel Threading Building Blocks for Open Source

http://www.threadingbuildingblocks.org/

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の新しいテクノロジー

http://www.apple.com/jp/macosx/technology/#opencl

OpenCL

計算処理をGPUなどCPU以外でも利用できるようになる。どの程度並列化されるかはデバイスに依存する。デバイスからこれらの情報は取得でき、その取得した上限値までの範囲でプログラム側で制御できる。また、演算処理そのものも専用のAPIを使って記述することで、実行時にデバイス用にビルドしたときに最適化された専用命令が使用されるように期待できる(曖昧な書き方になっているのは、実行環境にインストールされているOpenCLのコンパイラやデバイスドライバに依存するため)
OpenCL (Khronos group)

http://www.khronos.org/opencl/

結局どれを採用するべきか?

個人的な考察であるが、並列化したい処理の規模がある程度大きく、ファイルアクセスやプログラム側で他のモジュールと通信するような物は TBB や GCD を使用するのが良いと思われる。Mac OS X 専用のプログラムや処理の場合にはOS側で効率的な処理が期待できるので、GCDを使用するべきだと思われる。
並列化したい処理が有る程度、まとまっており、小さな場合はOpenMPが良いと思われる。アルゴリズムなどで、既存のC/C++のコードが有る場合には、比較的作業量も少なく並列化できる。但し、既存のコードが並列化できるような形に実装されていない場合は大きくコードを書き直す必要が有る。
また、アルゴリズムなどでも計算量が多い場合にはOpenCLの方が良いと思われる。並列化での高速化の他に、デバイス専用命令によるハードウェアによる高速化が期待できる。但し、OpenCLのコードに書き直す必要が有るため、作業量は多い。

投稿者プロフィール

林 晃
林 晃macOS/iOSアプリ/SDK/ミドルウェア開発が専門の開発者
アールケー開発代表。macOS/iOSアプリ/SDK/ミドルウェア開発が専門の開発者。ObjC/Swift/C++使い。豊富な開発実務経験を基に、教育コンテンツ開発、技術書執筆、技術指導、技術セミナー講師、企業内研修講師、行政・自治体職員研修講師も行います。

基礎から学ぶMetal


「基礎から学ぶMetal」を執筆しました。本書はMetalを使ってGPUプログラミングを行うための最初のステップを解説するMetalの解説書です。

私が初めてGPUプログラミングを行ったとき、どこから手をつけて、学んでいけば良いのか分からず呆然としました。もし、あのとき、これを教えてくれればという部分を解説しました。本書で解説している部分はMetalの基礎となる部分で、Metalを使うときに必ず触れることになる部分です。

詳細

基礎から学ぶSwiftUI


「基礎から学ぶ SwiftUI」というタイトルの本を執筆しました。

SwiftUIの入門書です。

SwiftUIのコンセプトは「ユーザーインターフェイスを作るための最短パスを提供する」「一度学べば(Appleのプラットフォームの)どこにでも適用できる」です。

SwiftUIの概要から始まって、一つ一つのテクノロジートピックに注目しながらSwiftUIとは何か?どんなことができるのか?どのようなコードを書けば良いのかなどを丸々一冊使って解説しています。

詳細

関連記事

  1. RKDetailDesign Nightly Build 162.00…

  2. Arduinoとkonashiを接続する

  3. 文章の執筆にも課題管理をすると捗る

  4. セミナーのお知らせ

  5. MSM 2011でのセッション内容を決めました

  6. MSM2014でエクステンションについてセミナーを担当します

最近の著書

  1. 基礎から学ぶ SwiftUI

人気記事

最近の記事