Parallel Composer 2011の新機能
Parallel Composer 2011は、高性能なコードを出力するインテルC++コンパイラーとデバッガ、並列化のための各種ライブラリを含み、並列化アプリケーション実装の中心となる製品です。
今回のバージョンでは、以下のような新機能が追加されています。
- インテルC++コンパイラーがC++の次期標準であるC++0xのサポートを拡大
- 並列化のためのC/C++言語拡張であるインテルCilk Plus(シルクプラス)
- 並列化ライブラリであるArray Building Blocks(ベータ版)
本記事では、注目株のインテルCilk Plus(以下、Cilk Plus)を解説します。
Cilk Plus
Cilk Plusは並列化処理のためのC/C++言語拡張です(綴りはClickやClikではなくCilkなのでタイプミスに注意)。
シンプルな記法で、ループや特定の関数呼び出しなどを並列化処理することができます。Cilk Plusで定義されているキーワードは以下の3つです。
キーワード | 機能 | 別名 |
_Cilk_for | 並列でfor文を処理する | cilk_for |
_Cilk_spawn | 並列で関数を呼び出す | cilk_spawn |
_Cilk_sync | _Cilk_spawnの結果を待つ | cilk_sync |
なお、各キーワードは<cilk/cilk.h>で別名でも定義されています。
このようにCilk Plusのキーワードはわずか3つで、使い方も実にシンプルです。
例えば、これまで逐次処理していたfor文を並列処理する際は、以下のようにコードを書き換えます。
for(int i = 0 ; i < LOOP_MAX ; i++){ //処理内容 }
↓
cilk_for(int i = 0 ; i < LOOP_MAX ; i++){ //並列処理内容 }
同様に、逐次的に関数呼び出しを行っていた部分を並列処理する際は、以下のようにコードを置き換えます。
someMethod1(); //1番目のメソッド呼び出し someMethod2(); //1番目のメソッド終了後、2番目のメソッド呼び出し someMethod3(); //同上
↓
cilk_spawn someMethod1(); //メソッドを並列に呼び出し cilk_spawn someMethod2(); //someMethod1の終了を待たず、メソッドを並列に呼び出し cilk_spawn someMethod3(); //同上 cilk_sync; //すべてのメソッド終了まで待つ
Parallel Composer 2011には、よく知られたアルゴリズムであるクイックソートをcilk_spawnを使って並列化したサンプルが含まれています({Parallel Studio 2011をインストールしたフォルダ}\Composer\Samples\en_US\C++\Cilk\qsort)。
クイックソートはソート対象を小さな問題に分割しながら処理を行う分割統治法を用いていますが、このサンプルでは、分割した前半部分を並列に再帰呼び出ししています。
//クイックソートを行う再帰関数 void sample_qsort(int * begin, int * end) { if (begin != end) { --end; int * middle = std::partition(begin, end, std::bind2nd(std::less<int>(), *end)); using std::swap; swap(*end, *middle); //前半部分をcilk_spawnで並列処理 cilk_spawn sample_qsort(begin, middle); //後半部分は逐次処理(直後にcilk_syncがあるため、並列処理する意味がない) sample_qsort(++middle, ++end); //並列処理結果を待つ cilk_sync; } }
この並列処理クイックソートと、cilk_spawn,cilk_syncを除いた逐次処理クイックソートで、100,000,000個の数字を処理したところ、以下のように17%ほどの高速化が確認できました(筆者の環境はIntel Core 2 Duo T9300 2.5GHz デュアルコア)。
逐次処理 | 13375ms |
並列処理 | 11140ms |
また、Parallel Composer同梱のQuickDemoサンプル({Parallel Studio 2011をインストールしたフォルダ}\Composer\Samples\en_US\C++\Cilk\QuickDemo)では、並列処理と逐次処理の処理速度を並列度を変えながら視覚的に比較することができます。