並列化すべき個所を自動診断する新ツール「インテル Parallel Advisor」を使ってみよう 2ページ

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_final Parallel Advisorで使用する解析用コードをすべて追加したコード
sudoku_annotated_tasks Parallel Advisorで使用する解析用コードを追加したコード
sudoku_cilk Cilk Plusによる並列化が加えられたコード
sudoku_tbb インテル スレッディング・ビルド・ブロック(TBB)による並列化が加えられたコード

プログラムのビルド設定

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

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

 今回使用する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)。

図3 「Debug Information Format」として「Program Database(/Zi)」もしくは「Program Database for Edit & Continue(/ZI)」を選択しておく
図3 「Debug Information Format」として「Program Database(/Zi)」もしくは「Program Database for Edit & Continue(/ZI)」を選択しておく

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

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

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

図4 「Advisor Workflow」の「1. Survery Target」内にある「Start」ボタンをクリックするとSurvey Analysisが実行される
図4 「Advisor Workflow」の「1. Survery Target」内にある「Start」ボタンをクリックするとSurvey Analysisが実行される

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

図5 Survey Analysisの実行が完了すると「Suervey Report」が表示される
図5 Survey Analysisの実行が完了すると「Suervey Report」が表示される

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

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

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

図6 関数やループをダブルクリックすると対応するソースコードが表示される
図6 関数やループをダブルクリックすると対応するソースコードが表示される

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

図7 「Total Time」から「ホットスポット」となる個所を検出できる
図7 「Total Time」から「ホットスポット」となる個所を検出できる