並列化支援ツール「Parallel Advisor」やC/C++言語拡張「Cilk」が追加、並列アプリケーション開発ツール「Parallel Studio 2011」の新機能

 Windows向けの並列アプリケーション開発支援ツールスイート「インテル Parallel Studio」の最新バージョン「インテル Parallel Studio 2011」がリリースされた。Parallel Studio 2011では並列化の効果やその際に発生しうる問題を分析するツール「インテル Parallel Advisor」が新たに追加されたほか、並列プログラミング向けのC/C++言語拡張「インテル Cilk Plus」や並列化支援ライブラリ「インテル Array Building Blocks」(ベータ版)に対応するなど、大幅なアップデートが行われている。本記事では、これら新機能を中心にParallel Studio 2011を紹介していく。

並列プログラミングを支援するツールを備えたParallel Studio 2011

 Parallel Studioは、自動並列化機能やOpenMPなどの並列プログラミングAPIサポートを備えるコンパイラやデバッガを含む「インテル Parallel Composer」と、メモリの競合やデッドロック、メモリリークなどの問題を検出するデバッグツール「インテル Parallel Inspector」、関数や命令レベルで実行時間やCPUの利用状況を調査できるプロファイラ「インテル Parallel Amplifier」、そしてParallel Stduio 2011から新たに追加された並列化支援ツール「インテル Parallel Advisor」から構成される、アプリケーション開発ツールスイートである。

 それぞれに含まれるツールの詳細については表1にまとめているが、設計段階ではParallel Advisorを使って並列化に関する診断を行い、実装段階ではParallel Composerの並列化支援機能を活用、デバッグ段階ではParallel Inspectorでバグを検出、そして最後にParallel Amplifierを用いて性能の測定およびチューニングを行うという、ソフトウェアの開発ライフサイクルすべてにおいて活用できるツールが揃えられている。

表1 Parallel Studioに含まれる主なコンポーネント
コンポーネント 説明
Parallel Advisor 既存のソースコードを診断し、パフォーマンス上問題となっている個所の検出や、指定した個所を並列化することでどの程度パフォーマンスが向上するかの予測、並列化により発生しうる問題の検出などを行うツール
Parallel Composer コンパイラ(インテル C++ コンパイラー)、デバッガ(インテル Parallel Debugger Extension)、並列化支援ライブラリ(インテル スレッディング・ビルディング・ブロック、Cilk Plus、Array Building Blocksベータ版、インテル インテグレーテッド・パフォーマンス・プリミティブ・ライブラリ)が含まれるツール群
Parallel Inspector スレッド間でのデータの競合やデッドロック、メモリリークといったメモリやスレッドに関する問題を検出するツール
Parallel Amplifier プログラム内でボトルネックとなっている個所を検出するプロファイルツール。関数・命令レベルでCPUコアごとの活動状況を確認できる

 また、Visual Studioとのシームレスな統合も特徴の1つだ。Parallel ComposerにはVisual Studio 2005/2008/2010用のプラグインが同梱されており、Visual StudioからGUIで各種機能やツールを簡単に呼び出し、その結果をグラフィカルに確認できる。コンパイルなど一部の操作についてはコマンドラインから呼び出すことも可能で、バッチ処理やMakefileとテキストエディタを使ったコマンドラインベース開発にも柔軟に対応できる。

 なお、Parallel Studioの動作環境は表2のとおりだ。Parallel Studioはリンクやアーカイブファイルの操作などにVisual Studioに含まれるツールを使用するため、Visual Studioが必須な点には注意が必要だ。

表2 Parallel Studioの動作環境
OS Windows XP/Vista/7/Server 2003/Server 2008
開発環境 Visual Studio 2005/2008/2010(2005/2008についてはStandard Edition以上、2010についてはProfessional Edition以上)

Parallel Studio 2010の新機能

 Parallel Studio 2010の主要な新機能としては、次が挙げられる。

  • Visual Studio 2010に対応
  • 新ツール「Parallel Advisor」の追加
  • Parallel Composerに含まれるコンパイラ「インテル C++ コンパイラー」が並列プログラミング向けのC/C++言語拡張「Cilk Plus」をサポート
  • インテル C++ コンパイラーのC++0xサポートがさらに強化
  • Parallel Composerに新たな並列プログラミングライブラリ「Array Building Blocks」(ベータ版)が追加された。
  • Parallel Inspectorにリソースリーク検出機能が追加された
  • Parallel InspectorでCilk Plusを使った並列プログラムの解析が可能に

 この中でも特に注目したいのが、新ツールであるParallel Advisorと、新たにサポートされた並列プログラミング向けのC/C++言語拡張「Cilk Plus」サポートである。

並列化すべき個所やその方法をソースコードから診断、新ツール「Parallel Advisor」

 Parallel Studio 2010ではさまざまな新機能が追加されているが、その中でも「目玉」と言えるのが、新たに追加されたツール「Parallel Advisor」である(図1)。

図1 ガイドに従って操作することで効率良く並列化が行える「Parallel Advisor」
図1 ガイドに従って操作することで効率良く並列化が行える「Parallel Advisor」

 Parallel Advisorはパフォーマンス面で問題となっている個所を特定し、その部分の並列化によってどの程度のパフォーマンス向上が期待できるか、また並列化によってどのような問題が発生するかを診断するツールだ。作業手順は次の5つのステップに分かれており、指示に従って操作することでプログラムを効率良く並列化できる。

  1. Survey Target(プログラムを実行して処理に時間がかかっている個所を特定する)
  2. Annotate Sources(1.の結果を元にして、ソースコード中で並列化を行う候補となる個所にマクロを埋め込む)
  3. Check Suitability(マクロを埋め込んだ個所を並列化するとどの程度パフォーマンスが向上するかを予測する)
  4. Check Correctness(マクロを埋め込んだ個所を並列化した際に発生する問題を調査する)
  5. Add Parallel Framework(埋め込んだマクロを並列プログラミングフレームワークのコードに置き換える)

 1.の「Survey Target」ではまず対象のプログラムが実行され、関数やステートメントごとにその実行時間の測定結果が表示される(図2)。ここで時間がかかっている処理やループを見つけ、並列化の候補とする。

図2 「Survey Target」の実行結果。関数ごとに処理時間が表示される
図2 「Survey Target」の実行結果。関数ごとに処理時間が表示される

 続いて2.の「Annotate Source」で、並列化の候補となる個所にマクロを埋め込む作業を行う。このステップは基本的には手動での作業となるのだが、たとえばループの前後には「ANNOTATE_SITE_BEGIN」「ANNOTATE_SITE_END」を、ループ内で実行される処理の前後には「ANNOTATE_TASK_BEGIN」「ANNOTATE_TASK_END」を埋め込む、といったように基本的なルールは決まっているため、ルールを把握してしまえば作業自体は容易だ。また、「Annotation Wizard」などの支援ツールも用意されている(図3)。

図3 「Annotation Wizard」などを使って、並列化の候補となる個所にマクロを埋め込んでいく
図3 「Annotation Wizard」などを使って、並列化の候補となる個所にマクロを埋め込んでいく

 マクロを埋め込んだ後にソースコードを再コンパイルして3.の「Check Suitability」を実行すると、マクロで指定した個所それぞれについて「その部分を並列化するとどの程度のパフォーマンス向上が見られるか」を確認できるようになる(図4)。これにより、並列化でパフォーマンスが向上する個所とそうでない個所を簡単に判別できるというわけだ。

図4 「Check Suitability」では並列化の効果を確認できる
図4 「Check Suitability」では並列化の効果を確認できる

 また、4.の「Check Correctness」では、マクロで指定した個所を並列化した場合に発生しうる問題を検出できる。複数スレッドから同時にメモリにアクセスすることで発生する問題や、複数スレッドで共有すべきでないメモリを共有することで発生する問題など、検出された問題がその具体的な原因や発生個所とともに表示される(図5)。

図5 「Check Correctness」では、並列化によって発生するメモリ関連のエラーを事前に検出できる
図5 「Check Correctness」では、並列化によって発生するメモリ関連のエラーを事前に検出できる

 あとは3.で得られた結果を元に並列化する個所を決定して並列化のためのコードを入力し、また4.で得られた結果を元に発生しうるメモリ関連の問題を解決すべく修正を加えることで、プログラムの並列化が完了する(5.のAdd Parallel Framework)。ドキュメントにはパターンに応じたコードの実装例が示されており、基本的にはこれらに従ってコードを入力すれば作業が完了するようになっている。

 このようにParallel Advisorは一部手作業が必要ではあるものの、並列化に不慣れなユーザーでも指示に従って作業するだけで並列化を実現できるという、非常に強力なツールとなっている。

 なお、Parallel Advisorについては本連載3回目でその使い方や詳細を紹介する予定だ。

コンパイラもアップデート、並列プログラミング技術「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_opadd<int> 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環境での並列プログラミングに興味のある人はぜひ試して見てはいかがだろうか。