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

新着トピックス

インテル コンパイラーに準ずる機能を備えるParallel Composer

 Parallel Composerは、32ビット/64ビット両対応の「インテル コンパイラー」およびVisual Studioのデバッガに統合される「Parallel Debugger Extension」、並列化を支援するC++テンプレートライブラリである「Threading Building Blocks(TBB)」、並列化および最適化済みのデータ処理ライブラリ「Integrated Performance Primitives(IPP)」といったツールが含まれるコンポーネントである。

 インテル コンパイラーはインテルCPUへの最適化や自動並列化機能など、パフォーマンスの高いアプリケーションを作成できることで定評があるが、Parallel Composerに含まれるインテル コンパイラーは、単体で販売されているインテル C++ コンパイラー 11.0と同等の自動並列化機能や並列化サポート機能を備えているとのことだ。ただし、自動並列化を行うかどうかを判断する閾地の調整(/Qpar-thresholdオプション)やスタティックの検証(Static Verifier、/Qdiag-enable:sv)などの高度な設定についてはParallel Composerでは提供されていない。

 また、インテル C++ コンパイラーのほかの特徴として、並列化をサポートする次のような機能を備えている点も挙げられる。

  • 現在策定中のC++の新標準規格「C++0x」に含まれる「ラムダ関数」のサポート
  • OpenMPの最新仕様「OpenMP 3.0」のサポート
  • 「__taskcomplete」、「__task」、「__par」、「__critical」という並列処理を記述するためのキーワード
  • インテル独自の非同期I/O拡張機能(C/C++ Asynchronous I/O Extensions、C/C++ AIO)ライブラリ
C++0xのラムダ関数をいち早くサポート

 ラムダ関数は無名関数(Anonymous function)を定義するための機能であり、元々はLispなどの動的プログラミング言語が備えていたものだ。C++0xではこれがC++でも利用可能になる予定で、Parallel Composerではこれをいち早くサポートしている(利用の際はコンパイルオプションとして「/Qstd=c++0x」が必要)。

 たとえば、引数として与えた数が3の倍数である場合に真、そうでない場合に偽を返す関数をラムダ関数を利用して定義すると、下記のようになる。

u = [](int x) {return x % 3 == 0;}

 いっぽう、関数オブジェクトとして上記と同様のものを定義すると、下記のようになる。

class unique {
  public:
    bool operator()(int x ) const {return x % 3 == 0;}
};

unique u;

 C++では並列処理を実装する際やC++のテンプレートを利用する場合、上記のような関数オブジェクトを作成することが多かったが、このようなオブジェクトの作成は煩雑であった。ラムダ関数を利用することにより、処理をより簡潔に記述することが可能となる。