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

新着トピックス

Parallel Advisorを使用するための準備

 Parallel Advisorではプログラムを実際に実行して各種分析を行うため、対象とするプログラムはあらかじめコンパイルされている必要がある。

 サンプルコードを含む「sudoku.zip」を適当なフォルダに展開し、含まれる「sudoku.sln」をダブルクリックするとVisual Studioが起動し、ソリューションが開かれる。ソリューション内には「sudoku」および「sudoku_annotated_final」、「sudoku_annotated_tasks」、「sudoku_cilk」、「sudoku_tbb」というプロジェクトが表示されるはずだ。このうち、「sudoku」プロジェクトに含まれるソースコードが並列されていないオリジナルのコードとなる(表3)。

表3 sudokuソリューションに含まれるプロジェクト
プロジェクト説明
sudoku並列化されていないオリジナルコード
sudoku_annotated_finalParallel Advisorで使用する解析用コードをすべて追加したコード
sudoku_annotated_tasksParallel Advisorで使用する解析用コードを追加したコード
sudoku_cilkCilk Plusによる並列化が加えられたコード
sudoku_tbbインテル スレッディング・ビルド・ブロック(TBB)による並列化が加えられたコード

プログラムのビルド設定

 Parallel Advisorでプログラムを解析する際に、Survey AnalysisおよびSuitability Analysisでは各種最適化を有効にしたReleaseビルドを、Correctness Analysisではコンパイラの最適化オプションを無効にしたデバッグビルドを利用することが推奨されている。また、Correctness Analysisの実行時はプログラムの実行速度が大きく低下するため、入力データのサイズについても少なくすることが推奨されている(表4)。

表4 テストに使用する際のビルドおよびデバッグ設定
分析ツールビルド設定実行時の入力データサイズ
Survey AnalysisReleaseフル
Suitability AnalysisReleaseフル
Correctness AnalysisDebugできるだけ少なくする

 今回使用するsudokuプロジェクトでは、デフォルトのコンパイラとしてVisual C++を使用する設定となっている。そのため、先にツールバーの「Use Intel C++」ボタンをクリックしてParallel Stdioに含まれるインテル コンパイラーを使用するように切り替えたうえで、DebugおよびRelease設定でリビルドし、それぞれ実際にコンパイルが成功するか、また生成されたプログラムが問題なく動作するかを確認しておこう。

 また、Parallel Advisorはリリースビルド・デバッグビルドの両方でデバッグ情報ファイルを使用する。これを生成するよう、「Debug Information Format」で「Program Database(/Zi)」もしくは「Program Database for Edit Continue(/ZI)」を選択しておく(図3)。

プログラムのパフォーマンスを調査する

 プログラムを並列化するにあたり、まず最初に必要なのがプログラムのパフォーマンス分析だ。前述のとおり並列化にはオーバーヘッドが発生するため、むやみやたらに処理を並列化するのではなく、処理に時間がかかっている個所(「ホットスポット」と呼ばれる)のみをピンポイントで並列化することが求められる。この作業を支援するツールが、Survey Analysis機能だ。

 Survey Analysisを実行するには、ツールバーの「Open Advisor Workflow」ボタンをクリックすると表示される「Advisor Workflow」ウィンドウの「1.Survey Target」内にある「Start」ボタンをクリックする(図4)。このときビルド設定が「Debug」になっているとその旨を確認する画面が表示されるので、その際は「Cancel」をクリックし、ビルド設定を「Release」にしてから再度実行しよう。

 Survey Analysisを実行すると分析対象となるプログラムが実行され、パフォーマンスの計測が行われたのち結果が「Survey Report」として表示される(図5)。

Survey Reportでプログラムのパフォーマンスをチェックする

 Survey Reportでは、画面左側(「Function Call Sites and Loops」)にプログラム内のブロック(「サイト」と呼ばれる)やループが、右側にはそれぞれの実行時間や対応するソースコードの個所が表示される。このなかで「Total Time %」が大きいサイトやループが並列化の候補となる個所となる。

 また、Survey Reportに表示されている関数やループをダブルクリックすると、対応するソースコードが表示される(図6)。関数の場合「Total Time」でその関数の総実行時間が、ループの場合「Loop Time」でループの総実行時間が表示される。

 今回のプログラムの場合、main.cxxファイル129行目からのループ内で呼び出されている「generate」関数が大きく時間を消費していることが分かる(図7)。