マルチコア時代の新開発ツール「インテル Parallel Studio」
インテルが新しい開発ツール「インテル Parallel Studio」を発表した。Parallel StudioはマルチコアCPUで高いパフォーマンスを発揮するソフトウェアを開発するためのツールで、並列化機能および強力な最適化機能を備えたコンパイラや並列化関連ライブラリ、デバッガ、プロファイラから構成されている。本記事では、このParallel Studioの機能や特徴を紹介する。
今日ではマルチコアCPUが一般的になりつつあり、それに伴って複数のスレッドで同時に処理を行うことでパフォーマンスを向上させる「並列処理」が注目を浴びている。そのなかで登場したのが、インテルの新しい開発ツール「インテル Parallel Studio」である。
マルチコアCPUのパフォーマンスを最大限に活用するには、並列処理が重要となる。インテルでは今までにも科学・工学分野での大規模計算(High Performance Computing、HPC)向けにさまざまな並列化関連技術を蓄積・公開しているが、一般的なPCにおいても並列処理が重要になりつつある現在、インテルが培ったこれらノウハウを一般向けにも提供すべくリリースされた製品がParallel Studioである。
Parallel StudioはVisual Studioと連携して利用することを想定した製品で、「インテル Parallel Composer」(以下、Parallel Composer)および「インテル Parallel Inspector」(以下、Parallel Inspector)、「インテル Parallel Amplifier」(以下、Parallel Amplifier)という3つのコンポーネントと、今後追加が予定されている「インテル Parallel Advisor」(Parallel Advisor)から構成されている。まずはこれらのコンポーネントについて紹介しておこう。なお、それぞれの機能概要は表1のとおりだ。
コンポーネント | 構成要素 |
---|---|
インテル Parallel Composer | コンパイラおよびデバッガ、各種ライブラリ(32ビット/64ビット環境向けのC++コンパイラ、Parallel Debugger Extension、Threading Building Blocksライブラリ、Integrated Performance Primitivesライブラリ) |
インテル Parallel Inspector | マルチスレッド対応のエラー検出ツール。メモリリークや不正なメモリアクセス、初期化されていないデータの検出、スレッド間でのデータの競合やデッドロックの検出といった、メモリやスレッドに関するエラーを検出できる |
インテル Parallel Amplifier | マルチスレッド対応のプロファイラ。プログラム中でパフォーマンスのボトルネックとなっている個所やデータを検出したり、プログラム実行中のCPUコアごとの活動状況やスレッドのロック状況などを分析できる |
インテル Parallel Advisor | 並列化を実装していないソースコードに関して、並列化実装に向けたアドバイスを表示するコーチング機能を提供する(Parallel Studioの発売当初はLite版の提供となり、正式版のリリース後に無償アップデートされる)。 |
なお、Parallel Studioは現在評価版が無償公開されており、国内の販売代理店であるエクセルソフトのWebサイトからダウンロードが可能だ。興味を持たれた方は、ぜひこちらをダウンロードして試して欲しい。なお、Parallel Studioの動作環境は表2のとおりである。Parallel StudioはVisual Studioのプラグインとして動作するため、別途Visual Studio 2005もしくは2008が必要な点に注意してほしい。
OS | Windows XP/Vista、Windows Server 2003/2008 |
開発環境 | Microsoft Visual Studio 2005/2008(Express版は対象外) |
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)ライブラリ
ラムダ関数は無名関数(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++のテンプレートを利用する場合、上記のような関数オブジェクトを作成することが多かったが、このようなオブジェクトの作成は煩雑であった。ラムダ関数を利用することにより、処理をより簡潔に記述することが可能となる。
新たに追加された並列化キーワード新たに追加された「__taskcomplete」や「__task」、「__par」、「__critical」というキーワードは、並列処理の実装に利用するもので、OpenMPを有効にした(コンパイルオプションとして「/Qopenmp」を使用する)場合に有効となる。たとえば下記のように「__par」キーワードを付けたforループはコンパイラによって自動的に並列化され、ループ内の処理が並列に実行される。
void func1() { int i; __par for( i = 0; i < 100; i++ ) { func2(i); /* ここで複数のスレッドが生成され、func2(i)は複数のスレッドによって並列実行される */ } }
また、__criticalはクリティカルセクション(複数のスレッドが同じ処理を実行する際、複数のスレッド間で同時に行ってはいけない処理)を指定するキーワード、__taskは並列に実行させたい複数の処理を指定するキーワード、__taskcompleteは並列処理中に1スレッドだけで実行させたい処理を指定するキーワードだ。これらはOpenMPを利用しても記述できるが、これらのキーワードを利用することでよりシンプルにコードを記述できる(表3)。
キーワード | 同等のOpenMPディテクティブ |
---|---|
__par | #pragma omp parallel for |
__critical | #pragma omp critical |
__taskcomplete S1 | #pragma omp single |
__task | #pragma omp task |
インテル独自の非同期I/O拡張機能(C/C++ Asynchronous I/O Extensions、C/C++ AIO)はそれぞれ「aio.h」(Cライブラリ)および「aiostream.h」(C++テンプレートライブラリ)をインクルードすることで利用できる。これらはPOSIXで定義されている非同期I/O関数(AIO)をWindows向けに移植したもので、若干の違いはあるものの、POSIXのAIOとほぼ同様に利用できる。また、aiostreamを利用することで、C++のオブジェクトとしてこれらを利用することができる。
なお、インテル C++ コンパイラーやIPPについては過去に別記事でも取り上げているため詳細は割愛するが、Parallel Composerに付属するTBBやIPPも、インテル C++ コンパイラーに付属するものと同じものとのことで、これだけでもコストパフォーマンスは高い。
Parallel Debugger ExtensionParallel ComposerにはParallel Debugger Extensionという、Visual Studioのデバッガを拡張するプラグインも含まれている。Parallel Composerをインストールすることで、Visual Studioのデバッガに下記のような機能が追加される。
- スレッドで共有されるデータに関する分析機能
- リエントラント(再入可能)な関数呼び出しの際にプログラムの実行を停止できる「スマートブレークポイント」機能
- OpenMPディレクティブの認識
- OpenMPを用いて並列化された処理の並列実行許可/禁止
- SSEで使用されるレジスタの情報表示/編集機能
これらの機能を利用することで並列処理を行うプログラムのデバッグをより容易にすることが可能だ。
発見しにくいマルチスレッドのエラーを検出するParallel InspectorParallel Inspectorは、メモリリークや不正なメモリアクセス、未初期化のメモリへのアクセスといったメモリ関連のエラーや、データの競合やデッドロックといったマルチスレッド処理特有のエラーを分析・検出するツールである(図1)。
たとえば、複数のスレッド間でデータの競合が発生した場合、その競合がデータの書き込みに関するものなのかそれとも読み出しに関するものなのか、またソースコード中のどの部分でその問題が発生しているのか、どのような順番で処理が行われたのかなど、Parallel Inspectorを利用することで詳細な情報を確認することができる。
Parallel Inspectorを利用する際、デバッグ用に特別なライブラリを利用したり、プログラム中に検証用のコードを埋め込む、といった作業は不要だ。そのため、「デバッガ経由で実行すると問題が再現しない」、「デバッガ経由での実行時は実際の実行時と挙動が異なる」といった問題が発生しない。また、Visual Studioと統合されているため、その場でソースコードの表示・修正を行えるのも便利である。
プログラムのボトルネックを検出するマルチスレッド対応プロファイラ「Parallel Amplifier」Parallel Amplifierは、プログラム中の任意の個所の実行回数や実行時間などを調査できる、プロファイラと呼ばれるツールである。Parallel Amplifierを利用することで、たとえばプログラム中で実行に時間がかかっている個所を特定したり、関数がどのような順序で呼び出されているのかなどを調査することができる(図2)。
また、Parallel Amplifierで特徴的な機能として、マルチコアCPUでプログラムを実行する際に各コアの動作状況をチェックしてCPUを有効活用できているか調査したり、同期/排他処理によるスレッドのロックがパフォーマンスに与える影響などを測定する、といったものがある。
Visual Studioとの統合により、使いやすいインターフェイスを提供
Parallel Studioの各コンポーネントはVisual Studioのプラグインとしてインストールされ、各機能はVisual Studioのツールバーなどから直接実行できる。Parallel Composerを利用したコンパイルやParallel Amplifierを使ったパフォーマンス測定、Parallel Inspectorを利用したデバッグなどは、ツールバーのボタンをクリックするだけで手軽に実行できる。
Parallel Composerは自動並列化機能や強力な最適化機能を備えているため、並列処理を行うものだけでなく一般的なプログラムにおいても、パフォーマンス向上が期待できる。また、Parallel Amplifierを利用したパフォーマンス解析やParallel Inspectorによるメモリエラーのチェックなどは様々なプログラムのデバッグや最適化に有用だろう。Parallel Studioの評価版は現在無償で利用できるので、興味のある方はぜひダウンロードして試してみてはいかがだろうか。