この記事は、インテル® デベロッパー・ゾーンに掲載されている「How to use the Intel® Advisor Collection Control APIs」(https://software.intel.com/en-us/articles/intel-advisor-collection-control-apis) の日本語参考訳です。
概要
インストルメントとトレース・テクノロジー (ITT) を使用して、インテル® Advisor のパフォーマンス・データ収集のスピードアップとサンプルデータのサイズを軽減します。ITT API は、インテル® Advisor のサーベイ収集では初期のリリースからサポートされていますが、インテル® Advisor 2018 ではトリップカウントと FLOP 収集でも利用できるようになりました。これにより、大規模な長時間実行されるアプリケーションでも、ルーフライン解析を利用することができます。
この記事では、ターゲット・アプリケーションの実行中に、収集制御 API を使用してインテル® Advisor のパフォーマンス・データ収集を開始および停止する方法を説明します。
背景
インテル® Advisor は通常、解析を始めるとデータの収集を開始します。そのため、大きなコードでは注目しないコード領域のデータも収集してしまいます。収集制御 ITT API によって、インテル® Advisor がモニターしパフォーマンス・データを記録するソースコードの領域を選択することができます。
使用例: 特定のコード領域に注目します。
最初に、注目するソースコードの領域を resume と pause API で囲んで、インテル® Advisor をポーズモードで開始します。インテル® Advisor は、resume API に到達するとパフォーマンス・データの収集を開始し、pause API に到達すると収集を停止します。
小規模なコードを使用して、一連の手順を説明します。
- 最初に、C/C++ アプリケーションは ITT API を理解する必要があります。そのため、インテル® Advisor のインストール・ディレクトリーに含まれる “ittnotify.h” ヘッダーファイルをソースコードでインクルードします。
Windows* のデフォルトのインストール・ディレクトリーは以下です。C:\Program Files (x86)\IntelSWTools\Advisor 2018\include
Linux* のデフォルトのインストール・ディレクトリーは以下です。/opt/intel/advisor_2018/include
注:
"ittnotify.h"
ヘッダーファイルには、コードのインストルメントに使用するすべての ITT API のテンプレートが含まれます。コンパイラーがライブラリーを検出できるように、ヘッダーファイルへのパスを指定します。Microsoft* Visual Studio* では、[プロパティ ページ] の [C/C++] > [全般] > [追加のインクルード ディレクトリ] で設定します。環境変数 $(ADVISOR_2018_DIR)include を使用することもできます。
- 最後に、ITT ライブラリー (
libittnotify.lib
) をリンクして、アプリケーションを再コンパイルします。Visual Studio* では、[プロパティ ページ] の [リンカー] > [追加のライブラリ ディレクトリ] にライブラリーへのパスを追加します。
Windows* 環境のデフォルトパスは以下です。C:\Program Files (x86)\IntelSWTools\Advisor 2018\lib64\libittnotify.lib
Linux* 環境のデフォルトパスは以下です/opt/intel/advisor_2018/
そして、ライブラリーへのパスを含むようにビルドスクリプトを設定し、-ittnotify
オプションをコンパイラーに指定してlibittnotify.a
ライブラリーとリンクします。 - 次に、インテル® Advisor をポーズモードで開始します。次のポーズして実行ボタンを使用します。
注: インテル® Advisor は、サーベイ解析およびトリップカウントと FLOP 解析で収集制御 API をサポートします。
例:
#include "ittnotify.h" int main(int argc, char* argv[]) { // 初期化を実行 __itt_resume(); // インテル® Advisor はパフォーマンス・データの記録を開始 for (int i=0;i<size;i++) { do_some_math(); } __itt_pause(); // インテル® Advisor はパフォーマンス・データの記録を停止 for (int i=0;i<size;i++) { do_some_other_math(); } return 0; }
上記の例では、インテル® Advisor は do_some_math()
関数を含むループのパフォーマンス・データを収集しますが、do_some_other_math()
関数を含むループのデータは収集しません。ルーフライン・モデルで解析結果のグラフを表示すると、グラフには 1 つのドットのみが表示されます。収集 API を使用しない場合は、2 つのドットが表示されます。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。