はじめに
2010年11月10日にエクセルソフト社より発売された「インテル Parallel Studio XE 2011」(以降Parallel Studio XE 2011)は、並列アプリケーション実装を行うためのコンパイラーと分析ツールを含むスイート製品です。同じく9月3日にリリースされたインテル Parallel Studio 2011(以降Parallel Studio 2011)の上位製品という位置づけになり、主に科学技術計算のような性能を求められる分野などを対象としています。
Parallel Studio XE 2011の構成は表1のようになります。
製品名 | 特徴 | 以前の製品名 |
インテル C++ Composer XE | C++言語による並列実装のためのコンパイラ、ライブラリ | インテル C/C++コンパイラー プロフェッショナル エディション |
インテル Fortran Composer XE | Fortran言語による並列実装のためのコンパイラ、ライブラリ | インテル (Visual) Fortranコンパイラー プロフェッショナル エディション |
インテル Inspector XE | 並列化に伴うエラーやデータ競合を検出する | インテル スレッドチェッカー |
インテル VTune Amplifier XE | パフォーマンスのボトルネックを検出する | インテル VTune パフォーマンス アナライザー |
各製品は今回のバージョンアップに合わせて改名されており、操作性も下位製品であるParallel Studio 2011と違和感がないように調整されています。Parallel Studio 2011に含まれてるParallel Advisorに直接対応する製品は含まれていませんが、C++ Composer XEの新機能としてガイド付き自動並列化がサポートされています(後述)。
本記事ではC++ Composer XE、Inspector XE、VTune Amplifier XEの新機能について解説します。Parallel Studio 2011と共通する機能については、以下の記事を参考にしてください。
動作環境
Parallel Studio XE 2011は以下の環境で動作します。
CPU | Intel SSE2命令に対応したCPU(IntelであればPentium 4以降。他社CPUでも動作) |
OS | Windows XP,Windows Vista,Windows 7,Windows Server 2003,Windows Server 2008、Linux(各x86/x64エディションに対応) |
開発環境 | Visual Studio 2005 / 2008 / 2010(Windowsの場合) |
開発言語 | C/C++、Fortran(ネイティブコード用。一部.NETのマネージドコードにも対応) |
Parallel Studio 2011までのバージョンはすべてWindows専用でしたが、Parallel Studio XE 2011より新たにLinux版がリリースされています。
Windows版ではこれまでのバージョンと同様に、Visual Studioに統合して使用することができます。Linux版では製品付属のGUIによる編集、デバッグ環境を利用可能です。
Parallel Studio XE 2011の評価版も公開されており、30日間無償で体験することができます。エクセルソフト社のページからダウンロード可能です。
なお、Parallel Studio XE 2011の日本語バージョンは2010年12月頃にリリースされる予定となっています。本記事では、Windows 7(32ビット版)、Visual Studio 2010、Parallel Studio XE 2011(英語版)を使って解説します。
C++ Composer XEの新機能
C++ Composer XEは、出力するコードの高速性で定評のあるインテルC++コンパイラーと、並列化アプリケーションのためのライブラリで構成されています。含まれるライブラリは表3のとおりです。
ライブラリ | 概要 |
インテル MKL 10.3(Math Kernel Library) | 工学、科学、金融系アプリケーションなどで活用できるマルチスレッド算術ライブラリ |
インテル IPP 7.0(Integrated Performance Primitives) | マルチメディア処理(画像や動画)、信号処理(音声など)、データ処理(データ圧縮や暗号化など)のライブラリ |
インテル TBB 3.0(Threading Building Blocks) | スレッドをタスクに抽象化し、スケーラブルな並列処理を行うためのライブラリ |
今回のバージョンでは、前バージョン(インテルC/C++コンパイラー プロフェッショナル エディション)から以下のような新機能が追加されています。
- 次期標準であるC++0xのサポートを拡大
- 並列化のためのC/C++言語拡張であるインテル Cilk Plusのサポート
- ガイド付き自動並列化
- 最新プロセッサのサポート
ここではガイド付き自動並列化機能について解説します。
なお、Cilk Plusについては、先に触れたParallel Studio 2011の記事で詳しく解説していますので参照してください。
ガイド付き自動並列化
ガイド付き自動並列化とは、インテル C++コンパイラーの新機能で、逐次処理で記述したアプリケーションを解析し、並列化のためのアドバイスを生成する機能です。もちろんコンパイラーがソースコードを自動的に修正するわけではなく、「インテル C++コンパイラーの持っている並列化処理機能を有効に使用するためにはソースコードのどの部分を修正する必要があるか」を教えてくれる機能です。
例えば、リスト1は製品付属のサンプルで、浮動小数点の配列について演算を行うプログラムの一部です({Parallel Studio XE 2011をインストールしたフォルダ}\Composer\Samples\en_US\C++\GuidedAutoParallel.zip)。
このサンプルでは浮動小数点の配列Aをループし、条件に合わせて浮動小数点演算を行います。インテル C++コンパイラーの持つベクトル化(配列をループして1つずつ処理するのではなく、同時に処理する)機能を使えば、高速化を図ることができそうです。
1: void test_scalar_dep(double *A, int n) 2: { 3: int i; 4: double b; 5: for (i=0; i<n; i++) { //配列内をループ 6: if (A[i] > 0) {b=A[i]; A[i] = 1 / A[i]; } //bは条件付きで代入 7: if (A[i] > 1) {A[i] += b;} 8: } //変数bの値が、次のループまで持ち越される 9: }
このプログラムについてガイド付き自動並列化を行うと、インテル C++コンパイラーからリスト2のようなガイドメッセージが出力されます。メッセージが英語なので分かりづらいですが、「リスト1の6行目で変数bへの条件付き代入があるため、ループをベクトル化できない」という内容です。
1>scalar_dep.cpp(42): warning #30521: (PAR) Assign a value to the variable(s) "b" at the beginning of the body of the loop in line 42. This will allow the loop to be parallelized. [VERIFY] Make sure that, in the original program, the variable(s) "b" read in any iteration of the loop has been defined earlier in the same iteration.
今回はbの値が前のループの処理に依存するため、nループ目とn+1ループ目を同時に処理することができません。
従って、ループをベクトル化するためには、変数bへの代入をループの最初に移動し、条件なし代入を行う必要がある、ということになります。もちろんこの変更により、処理内容は変わりますので、修正して正しい結果が得られるのかどうかはきちんと検討する必要があります。
今回の場合はリスト3のように変数bへの代入文をループの先頭に移動させることで、並列化の条件を満たすことができました。
for (i=0; i<n; i++) { b=A[i]; //ループの先頭で変数bに条件なし代入 if (A[i] > 0) { A[i] = 1 / A[i]; } if (A[i] > 1) { A[i] += b;} }
これにより、ループは前のループに依存することがなくなったため、インテルC++コンパイラーのベクトル化機能で並列処理を行うことができます。今回の例では、この修正により、表4のように3倍以上の処理速度の向上を確認できました。
処理時間(ミリ秒) | 処理速度(GFlops) | |
最適化前 | 8016 | 0.2495 |
最適化後 | 2332 | 0.8576 |
このようにC++ Composer XEでは、コンパイラーが出力した並列化に関するガイドを参考に、ソースコードを修正して並列化を行うことができます。
Inspector XEの新機能
Inspector XEは、メモリーリークやスレッド間のデータ競合といった並列化処理を実装する際に発生する問題を解析するためのツールです。前バージョンであるインテル スレッドチェッカーに対して、以下のような新機能が搭載されています。
- スレッドエラーに加え、メモリーエラーの検出もサポート
- C++ Composer XEとの連携による、ソースコードの静的分析によるメモリー、スレッドエラーの検出のサポート
- .NETマネージコードの解析をサポート
なお、Inspector XEはインテル スレッドチェッカーからのバージョンアップということもあり、UIはParallel Studio 2011に搭載されたParallel Inspector 2011とはやや異なります。ただし、メモリーエラーやスレッドエラーの検出と、検出後の原因となったソースコードの確認の流れなどは、Parallel Inspector 2011と同様の流れで行うことができます。
今回は新機能である.NETのマネージコードの解析をサンプルで見てみましょう。
マネージコードのスレッドエラー解析
Inspector XEのマネージコード解析機能は、現在のところスレッドエラーのみに限られており、メモリーエラーの検出は行えません。
今回はマルチスレッドでデッドロックが起きるケースについて、解析を行ってみましょう。
リスト4は、リソースAとBを2つのスレッドが逆の順番で取り合うことにより、デッドロックが起きるケースです。スレッド1はリソースをA、Bの順に、スレッド2はリソースをB、Aの順に取得しようとしますが、実行タイミングによっては2つめに取得するリソースが別のスレッドによってロックされているため、リソースを取得することも、ロックしているリソースを解放することもできなくなってしまいます。
class Program { private static Object resA = new Object(); //リソースA private static Object resB = new Object(); //リソースB public static void Main() { Thread thread1 = new Thread(new ThreadStart(Thread1)); thread1.Start(); //スレッド1開始 Thread2(); //メインがスレッド2となる } //A,Bの順でロック private static void Thread1() { lock (resA) //リソースAをロック { Thread.Sleep(1000); lock (resB) //リソースBをロック { Thread.Sleep(100); } } } //B,Aの順でロック private static void Thread2() { lock (resB) { Thread.Sleep(1000); lock (resA) { Thread.Sleep(100); } } } }
Visual Studio 2010で以上のソースをビルドし、図1のような画面上部のInspector XEツールバーから、解析アイコンをクリックします。
表示される[Configure Analysis Type]画面では、[Analysis Type](検出する内容)を[Memory Error Analysis]と[Threading Error Analysis]から選択できます。今回はスレッドエラーを検出するため[Threading Error Analysis]-[Detect Deadlocks]を選び、[Terminate on deadlock]をチェックして[Start]ボタンを押します。このチェックは、デッドロック発生時にアプリケーションを終了させるためのものです。
アプリケーションの実行中、複数のスレッドによってデッドロックが発生したことをInspector XEが検出すると、自動的にアプリケーションを終了させます。
解析結果の収集が行われた後、図3のような検出結果画面が表示されます。画面上部(Problems部分)に問題が表示され、下部(Code Locations)に問題となるコードの箇所が表示されます。今回はDeadlockがProgram.csの4つの行で発生していることが確認できます。
該当する行をダブルクリックすると、以下のように該当する行が表示されます。
これまでネイティブコードに限定されていた並列化エラーの解析がマネージコードでも可能になったことは大きなメリットです。もちろんInspector XEではネイティブコードにおけるメモリーエラー、スレッドエラーの解析機能も向上していますので、並列化アプリケーションの実装の際に発生する問題の解決に役立つことでしょう。
VTune Amplifier XEの機能紹介
VTune Amplifier XEは、パフォーマンス解析とチューニングを行うためのツールです。高性能なプロファイラとして知られているVTune パフォーマンス アナライザーにVisual Studioへの統合機能が追加されたことにより、Visual Studioからも 高度な解析を簡単な手順で行えるようになっています。
画面で見ながら解析方法を確認しましょう。
図5のようなVisual Studio画面上部のVTune Amplifier XEツールバーから解析アイコンをクリックします。
表示される[Choose Analysis Type]画面(図6)では、さまざまな種類の解析方法を選択できます。
[Algorithm Analysis]が基本となる解析カテゴリで、表5のようにいくつかの方法を選ぶことができます。
解析方法 | 意味 |
Hotspots | プログラム内で特に時間を消費しているホットスポット(=最適化すれば大きく性能向上する部分)の解析 |
Lightweight Hotspots | 高速なホットスポット解析 |
Concurrency | マルチスレッドによる並列処理が効率的に行われているかどうかの解析 |
Locks and Waits | 並列処理中に発生するロックと待機の解析 |
左側のツリーを横スクロールすると、図7のように、[Advanced Intel Core 2 Processor Family Analysis]と[Advanced Intel Microarchitecture Codename Nehalem Analysis]という解析カテゴリがあることが分かります。
これら2つは、VTune Amplifier XEの真骨頂とも呼べる、対象とするCPUに密着した形でコードの解析を行う方法です。前者はCore 2プロセッサを、後者はCore iプロセッサ(開発コードネームNehalem)を対象としています。それぞれの解析項目が異なるのは、プロセッサごとに最適化すべき分野が異なるためです。
ホットスポット解析とCPUに密着した解析
それでは、実際のサンプルで解析を行います。
今回は製品付属のtachyon_vtune_amp_xeサンプル({Parallel Studio XE 2011をインストールしたフォルダ}\VTune Amplifier XE 2011\samples\en\tachyon_vtune_amp_xe.zip)を使って解析を行ってみましょう。このサンプルは、レイトレーシングと呼ばれる手法で3D CGを作成するプログラムです。
最初はホットスポット解析を行いますので、[Hotspots]を選択して[Start]をクリックします。サンプルの実行完了後、図8のように解析結果が表示されます。
やや情報量が多い画面ですが、上部にCPU消費時間の長い関数名が列挙され、下部にスレッドごとのCPU使用率が表示されています。今回はinitialize_2D_buffer、grid_intersectという関数がそれぞれ30秒、20秒ほどの時間を消費しているようです。
画面上部の[Top-down Tree]をクリックすることで、図9のようにトップダウンでソースコード中の消費時間を確認することもできます。
また、前述のとおりVTune Amplifier XEではCPUに密着した解析も行えます。図10は[Advanced Intel Core 2 Processor Family Analysis]-[Cycles and uOps]を選択してCore 2プロセッサ向けに解析を行った結果です。ここではソースコードとコンパイルされたアセンブリコードが並べて表示されています。この解析では、各行でどの命令が何回実行されているか、といった非常に詳細な情報まで確認することができ、最適化に役立てることができます。
まとめ
本記事ではParallel Studio XE 2011の新機能を概観しました。基本的な使い方はParallel Studio 2011に似ている部分もありますが、確認できたとおり、より詳細な解析機能や、より高性能なアプリケーションを開発するための機能が搭載されています。
特にVTune Amplifier XEの解析の詳細さは他の追随を許さないものがあり、CPUを設計開発し、すべてを知り尽くしているインテル社の製品であるということを改めて感じさせられます。
インテル社では、Parallel Studio XE 2011と同時に、HPCクラスタ環境向けのインテル Cluster Studioもリリースしています。こちらの製品はC++ Composer XE、Fortran Composer XEに加え、数万コア以上のクラスター環境においても利用可能な並列ライブラリと、処理状況を解析するためのツールなども含まれています。
マルチコア化が進む中、よりハイパフォーマンスなアプリケーション開発のため、Parallel Studio XE 2011をぜひ活用してください。