HPC/並列プログラミングポータル

 HPC/並列プログラミングポータルでは、HPC(High Performance Computing)プログラミングや並列プログラミングに関する情報を集積・発信しています。

新着トピックス

コンパイラもアップデート、並列プログラミング技術「Cilk」対応やガイド付き自動並列化など多くの新機能が搭載

 Parallel Studio 2011でもう1つ注目したいのが、Parallel Composerの改良だ。Parallel Composerはコンパイラやデバッガ、そして並列プログラミング向けのライブラリが含まれるコンポーネントである。Parallel Composerの改良点としては次が挙げられる。

  • 並列プログラミングを容易にするC/C++の言語拡張「Cilk Plus」のサポート
  • ガイド付きの自動並列化
  • C++の新規格「C++0x」に含まれる新言語仕様の一部をサポート
  • 数学ライブラリに対して精度が指定できるようになった。用途に応じて「若干精度は低いが高速に計算」という選択が可能
  • 異なるCPUでも常に同じ結果となるように、数学ライブラリ関数に対して計算結果の一貫性を指定できるようになった

並列プログラミングを容易にするC/C++の言語拡張「Cilk Plus」

 Parallel Composerに含まれるインテル コンパイラー 12.0では、「Cilk Plus」というC/C++の言語拡張に対応している。Cilk Plusには並列処理で必要とされるスレッドの生成や排他処理などを容易に実装できるマクロやテンプレートライブラリ、関数、そしてキーワードが含まれている。

 たとえばCilk Plusでは、forループを次のような「_Cilk_for」ループに置き換えるだけで、for内の処理を複数のスレッドで並列実行できるようになる。

_Cilk_for (int i = start; i  end; i++) {
    /* 並列実行する処理を記述 */
}

 また、複数の関数を同時に並列で実行する、といった処理も、次のように「_Cilk_spawn」キーワード付きで関数を呼び出すだけで実現できる。

_Cilk_spawn func1();   /* func1()を別スレッドで実行 */
_Cilk_spawn func2();   /* func2()を別スレッドで実行 */
_Cilk_sync;            /* func1()とfunc2()の実行終了まで待機 */

 また、ループ内で特定の条件に合致した場合にのみ実行される処理を並列化するには、次のように_Cilk_spawnを用いれば良い。

for (int i = start; i  end; i++) {
    if (a[i]  0) {
        _Cilk_spawn func1(i);    /* func1は複数のスレッドで同時に実行される */
}
_Cilk_sync;    /* _Cilk_spawnで生成した全スレッドの実行終了まで待機 */

 そのほか、排他処理を実現するためのテンプレートクラスやマクロも用意されている。たとえばある変数に対し複数のスレッドから同時にアクセスする場合、次のように「CILK_C_REDUCER_OPADD」マクロを使って変数を宣言し、アクセス時に「REDUCER_VIEW」マクロを利用することで、安全な変数アクセスが簡単に行える。

CILK_C_REDUCER_OPADD(count, int, 0);    /* int型の値を格納する変数countを宣言 */
void IncrementCount() {
    REDUCER_VIEW(count)++;    /* CILK_C_REDUCER_OPADDで宣言した変数にアクセスする */
}

 C++なら、テンプレートクラスを用いてより直感的なアクセスが可能だ。

cilk::reducer_opaddint count;    // int型の値を格納する変数countを宣言
void IncrementCount() {
    count++;    // 変数への安全なアクセスが保証される
}

並列化のための診断機能やC++0xの新機能もサポート

 インテル コンパイラー 12.0では、「ガイド付き自動並列化(Guided Auto-Parallelization)」という機能も新たに追加された。これは、並列化していないコードを「/Qguide」オプション付きでコンパイルすることでコードが分析され、効率的な並列化を行うにはどうすれば良いかを診断したメッセージを表示する、というものだ。

 また、C++の新規格「C++0x」に含まれる機能の一部についてもサポートが追加された。C++0xの規格はまだ完全には確定してはいないものの、そのドラフトをベースにして右辺値参照やラムダ関数、「auto」型などの機能が利用可能になっている。

 なお、Cilk PlusなどParallel Composerに含まれる新機能については、本連第2回で詳しく紹介する予定である。

誰でも並列化に挑戦できるParallel Studio 2011、多くの開発者にとって有用

 マルチコアCPUの普及により並列化の重要性はより高まっており、並列プログラミングに関する情報も増え、また開発者の意識も高まっている。しかし、並列処理を実装するにはまだまだ専門的な知識が必要であり、誰もが簡単に実装できるというものではなかった。Parallel Studio 2011で新たに搭載されたParallel AdvisorやParallel Composerの新機能は、このような状況を打破できる有用なツールだといえるだろう。

 なお、Parallel Studio 2011は30日間すべての機能が無制限に利用できる体験版が用意されている。日本の代理店となっているエクセルソフトのWebサイトから無料でダウンロードできるので、Windows環境での並列プログラミングに興味のある人はぜひ試して見てはいかがだろうか。