インテル® Advisor ユーザーガイド
インテル® Advisor を使用してターゲット・アプリケーションを実行すると、ターゲット・アプリケーションの実行時間が大幅に増加する場合があります。パースペクティブで選択した精度レベルと解析に応じて、アプリケーションの実行時間には異なるオーバーヘッドが追加されます。以下に例を示します。
ランタイム・オーバーヘッド/解析 |
サーベイ |
特性化 |
依存関係 |
MAP |
---|---|---|---|---|
インテル® Advisor を使用した場合と、使用しない場合のアプリケーションの実行時間の比較 |
1.1x 増加 |
2 - 55x 増加 |
5 - 100x 増加 |
5 - 20x 増加 |
次の手法を使用して、初期化フェーズなど、ターゲット・アプリケーションの重要ではない部分をスキップし、注目する部分のみを解析します。
ここでは、解析のオーバーヘッドを最小化するインテルのインストルメントおよびトレース・テクノロジー (ITT) API の使い方について詳しく説明します。https://github.com/intel/ittapi から ITT API のドキュメントを入手できます。
収集のオーバーヘッドを最小化します。
適用される解析: サーベイ、依存関係。
一部の解析タイプでは、スレッド化パースペクティブのワークフローで使用されるアノテーション構造が認識されます。
次の場合に使用します。
ターゲット・アプリケーションの変更/再コンパイルが問題とならない場合。
ターゲット・アプリケーションの注目しない部分を解析する必要がない場合。
ターゲット・アプリケーションの注目する部分に大きなワークロードが含まれている場合 (ポーズ/再開 API 呼び出しはおよそ 1Hz であり、操作は解析実行のすべてのプロセスのデータ収集をポーズおよび再開し、対応する収集状態を GUI に通知します)。
収集をポーズするには、コードに次のアノテーションを追加します。
C++: ANNOTATE_DISABLE_COLLECTION_PUSH
Fortran: call annotate_disable_collection_push()
C#: Annotate.DisableCollectionPush();
収集を再開するには、コードに次のアノテーションを追加します。
C++: ANNOTATE_DISABLE_COLLECTION_POP
Fortran: call annotate_disable_collection_push()
C#: Annotate.DisableCollectionPop();
詳細は、「収集のポーズと収集の再開アノテーション」を参照してください。
収集のオーバーヘッドを最小化します。
適用される解析: サーベイ、トリップカウント & FLOP 収集を有効にした特性化。
次の場合に使用します。
ターゲット・アプリケーションの変更/再コンパイルが問題とならない場合。
ターゲット・アプリケーションの注目しない部分を解析する必要がない場合。
ターゲット・アプリケーションの注目する部分に大きなワークロードが含まれている場合 (ポーズ/再開 API 呼び出しはおよそ 1Hz であり、操作は解析実行のすべてのプロセスのデータ収集をポーズおよび再開し、対応する収集状態を GUI に通知します)。
必要条件:
インストルメントするすべてのソースに次の文を追加します。
C/C++: ittnotify.h
Fortran: USE ITTNOTIFY
ittnotify ヘッダーファイルには、ITT API ルーチンの定義と、アプリケーションから API を適切に起動するロジックを提供するマクロ定義が含まれています。
ITT API は、トレースが無効な場合オーバーヘッドがほぼゼロになるように設計されています。オーバーヘッドを完全にゼロにするには、ittnotify ヘッダーファイルをインクルードする前に、コンパイラーのコマンドラインやソースファイルで、プロジェクトに INTEL_NO_ITTNOTIFY_API マクロを定義することで、アプリケーションからすべての ITT API 呼び出しをコンパイルできます。
ITT API ヘッダーファイルとライブラリーに到達するようにビルドシステムを設定します。<install-dir> はインテル® Advisor のインストール・ディレクトリーです。
適切なエントリーを INCLUDE パスに追加します。
C++: <install-dir>/sdk/include
Fortran: <install-dir>/sdk/include/lib32 または <install-dir>/sdk/include/lib64
Microsoft* Visual Studio* IDE: [プロジェクト] > [プロパティ] > [C/C++] | [Fortran] > [全般] > [追加のインクルード ディレクトリ]
LIBRARIES パスに <install-dir>/sdk/lib32 または <install-dir>/sdk/lib64 を追加します。
Visual Studio* IDE: [プロジェクト] > [プロパティ] > [C/C++] | [Fortran] > [全般] > [追加のインクルード ライブラリ]
これまで、<install-dir>/include と <install-dir>/[lib32 | lib64] フォルダーにあった、ITT API ヘッダー、静的ライブラリー、Fortran モジュールは、<install-dir>/sdk/include と <install-dir>/sdk/[lib32 | lib64] フォルダーに移動されました。下位互換のため、以前の場所にこれらのファイルのコピーがありますが、新しいプロジェクトでは使用しないでください。
ターゲット・アプリケーションを静的ライブラリー libittnotify.a (Linux*) または libittnotify.lib (Windows*) とリンクするため、コンパイラーに -littnotify を渡します。トレースが有効な場合、この静的ライブラリーは ITT API 実装をロードし、ITT API インストルメント・データをインテル® Advisor に転送します。トレースが無効な場合、静的ライブラリーは ITT API 呼び出しを無視するため、インストルメントのオーバーヘッドはほぼゼロになります。
Visual Studio* IDE: [プロジェクト] > [プロパティ] > [リンカー] > [入力] > [追加の依存ファイル]
ターゲット・アプリケーションの注目しない部分の前に __itt_pause (C/C++) または CALL ITT_PAUSE (Fortran) を挿入し、ターゲット・アプリケーションの重要な部分の前には __itt_resume (C/C++) または CALL ITT_RESUME (Fortran) を挿入します。
例 1: 次のコード例と標準の実行制御は、コードの最初と中ほどで解析データを 2 度収集します。
#include <ittnotify.h> int main(int argc, char* argv[]) { // ワークを記述 __itt_pause(); // 注目しないワークをここに記述 __itt_resume(); // ワークを記述 __itt_pause(); // 注目しないワークをここに記述 return 0; }
例 2: 次のコード例と標準の実行制御は、コードの中ほどで 1 度だけ解析データを収集します。
#include <ittnotify.h> int main(int argc, char* argv[]) { __itt_pause(); // 注目しないワークをここに記述 __itt_resume(); // ワークを記述 __itt_pause(); // 注目しないワークをここに記述 return 0; }
例 3: 次のコード例と標準の実行制御は、コードの最後で 1 度だけ解析データを収集します。
#include <ittnotify.h> int main(int argc, char* argv[]) { __itt_pause(); // 注目しないワークをここに記述 __itt_resume(); // ワークを記述 return 0; }
例 4: 次のコード例と [Start Paused] コントロールは、コードの最後で 1 度だけ解析データを収集します。
#include <ittnotify.h> int main(int argc, char* argv[]) { // 注目しないワークをここに記述 __itt_resume(); // ワークを記述 return 0; }
前提条件を整えて再コンパイルした後に、次のいずれかを行います。
[Analysis Workflow] ペインの標準コントロール、または [Started Paused] コントロールをクリックして解析を実行します。
advisor CLI アクション --collect を --start-paused CLI アクションオプションあり/なしで使用して、目的の解析を実行します。以下に例を示します。
advisor --collect=survey --project-dir=./myAdvisorProj -- ./bin/myTargetApplication
起動されたアプリケーションに ITT API をアタッチするには (つまり、すでに起動されているアプリケーションで API データを収集するには)、環境変数を使用してターゲット・アプリケーションが ittnotify_collector ライブラリーを使用するようにします。
Windows*:
set INTEL_LIBITTNOTIFY32=<install_dir>\bin32\runtime\ittnotify_collector.dll
set INTEL_LIBITTNOTIFY64=<install_dir>\bin64\runtime\ittnotify_collector.dll
Linux*:
export INTEL_LIBITTNOTIFY32=<install_dir>/lib32/runtime/libittnotify_collector.so
export INTEL_LIBITTNOTIFY64=<install_dir>/lib64/runtime/libittnotify_collector.so
引用符なしでライブラリーへのフルパスを指定します。
設定が完了したら、適切な環境でインストルメントされたアプリケーションを起動します。インテル® Advisor が起動する前にアプリケーションが開始されても、インテル® Advisor は API データを収集します。
収集のオーバーヘッドを最小化します。
適用される解析: サーベイ、トリップカウント & FLOP 収集を有効にした特性化。
ターゲット・アプリケーションの初期フェーズ (初期化など) の解析を望まないが、レディーモードで解析を行う場合に使用します。
実装するには、次のいずれかを行います。
[Analysis Workflow] ペインで コントロールをクリックして解析を実行します。
目的の解析を実行するには、advisor CLI アクションオプション -start-paused を使用します。以下に例を示します。
advisor --collect=survey --project-dir=./myAdvisorProj --start-paused -- ./bin/myTargetApplication
さまざまな方法で収集を再開できます。最も一般的なものは __itt_resume です。
収集のオーバーヘッドを最小化します。
適用される解析: サーベイ、トリップカウント & FLOP 収集を有効にした特性化。
次の場合に使用します。
ターゲット・アプリケーションを変更/再コンパイルしたくない場合。
ターゲット・アプリケーションの初期化を解析する必要がない場合。
ターゲット・アプリケーションの注目する領域の時間間隔を把握しており、領域の最後をピンポイントで特定しなくても良い場合。
ターゲット・アプリケーションの注目する領域が少数のループで構成されている場合。
実装するには、次のいずれかを行います。
[Project Properties] > [Analysis Target] > [<解析名> Analysis] > [Advanced] > [Automatically resume collection after (sec)] チェックボックスをオンにして値を設定します。ここで、<解析名> は Survey または Trip Counts & FLOP です。
[Analysis Workflow] ペインで関連するコントロールをクリックして解析を実行します。(収集は自動的にポーズ状態で開始されます。)
目的の解析を実行するには、advisor CLI アクションオプション --resume-after=<integer> を使用します。以下に例を示します。
advisor --collect=survey --project-dir=./myAdvisorProj --resume-after=30 -- ./bin/myTargetApplication
GUI フィールドには秒を表す値を、整数引数にはミリ秒を指定します。
収集のオーバーヘッドを最小化します。
適用される解析: サーベイ、トリップカウント & FLOP 収集を有効にした特性化、依存関係、メモリー・アクセス・パターン。
これは、収集をポーズした状態でアプリケーションを開始の逆です。次の場合に使用します。
ターゲット・アプリケーションを変更/再コンパイルしたくない場合。
ターゲット・アプリケーションの最後を解析する必要がない場合。
ターゲット・アプリケーションの注目する領域の時間間隔を把握しており、領域の最後をピンポイントで特定しなくても良い場合。
ターゲット・アプリケーションの注目する領域が少数のループで構成されている場合。
実装するには、次のいずれかを行います。
[Project Properties] > [Analysis Target] > [<解析名> Analysis] > [Advanced] > [Automatically stop collection after (sec)] チェックボックスをオンにして値を設定します。ここで、<解析名> は [Survey] または [Trip Counts & FLOP] です。
[Analysis Workflow] ペインで関連するコントロールをクリックして解析を実行します。
目的の解析を実行するには、advisor CLI アクションオプション --stop-after=<integer> を使用します。以下に例を示します。
advisor --collect=survey --project-dir=./myAdvisorProj --stop-after=30 -- ./bin/myTargetApplication
GUI フィールドと整数引数の両方で秒を表す値を指定します。
収集のオーバーヘッドを最小化します。
適用される解析: サーベイ、トリップカウント & FLOP 収集を有効にした特性化、依存関係、メモリー・アクセス・パターン。
次の場合に使用します。
ターゲット・アプリケーションを変更/再コンパイルしたくない場合。
ターゲット・アプリケーションの最後を解析する必要がない場合。
ターゲット・アプリケーションの出力を基に注目する領域の時間間隔を特定できる場合。
ターゲット・アプリケーションの注目する領域が少数のループで構成されている場合。
実装するには、次のいずれかを行います。
解析の実行中に [Analysis Workflow] ペインで コントロールをクリックします。
依存関係またはメモリー・アクセス・パターン解析を実行している場合、[Site Coverage] バーを使用して、マークされたすべてのループが少なくとも 1 度解析されるタイミングを判断します。
目的の解析を実行するには、advisor CLI アクション -command=stop を使用します。以下に例を示します。
advisor --command=stop --result-dir=./myAdvisorResult
収集のオーバーヘッドを最小化します。
適用される解析: サーベイ、トリップカウント & FLOP 収集を有効にした特性化。
次の場合に使用します。
ターゲット・アプリケーションの出力を基に、注目する領域の時間間隔を特定できます。
ポーズまたは再開の必要性は不定で自発的です。
実装するには、次のいずれかを行い解析データの収集をポーズします (ターゲット・アプリケーションは続行しますが、解析データの収集を停止します)。
解析を実行中に [Analysis Workflow] ペインで コントロールをクリックします。
目的の解析を実行するには、advisor CLI アクション --command=pause を使用します。以下に例を示します。
advisor --command=pause --result-dir ./myAdvisorResult
次のいずれかを実行して解析データの収集を再開します。
[Analysis Workflow] ペインで コントロールをクリックします。
advisor CLI アクション --command=resume を使用します。次に例を示します。
advisor --command=resume --result-dir=./myAdvisorResult
収集のオーバーヘッドを最小化します。
適用される解析: サーベイ、トリップカウント & FLOP 収集を有効にした特性化 (コールスタックなし)。
この手法は、すでに実行中のプロセスにアタッチできることを除いて、収集をポーズした状態でターゲット・アプリケーションを起動するのと似ています。これは、次のような場合に有益です。
プロセスが永久に実行されるサービスである場合。
起動の仕組みが複雑な場合。例えば、起動収集コマンドを組み込むため変更の必要があるスクリプトなど。
GUI:
[Project Properties] > [Analysis Target] > [<解析名> Analysis] > [Launch Application] ドロップダウン・リスト で [Attach to Process] を選択します。ここで、<解析名> は、Survey または Trip Counts & FLOP です。
[Inherit settings from the Survey Hotspots Analysis Type] チェックボックスをオフにします。
[Process name] または [PID] オプションを選択してプロセスを識別します。
必要に応じてその他の情報を入力し、[Project Properties] ダイアログボックスを閉じます。
[Analysis Workflow] ペインで関連するコントロールをクリックして解析を実行します。
CLI: 目的の解析を実行するには、advisor CLI アクションオプション --target-pid=<unsigned integer> または --target-process=<string> を使用してプロセスにアタッチします。以下に例を示します。
advisor --collect=survey --project-dir=./myAdvisorProj --result-dir=./myAdvisorResult --target-process=myProcess
プロセスの解析データの収集を停止するには、次のいずれかを行います (プロセスの実行は続行しますが、解析データの収集を停止します)。
[Analysis Workflow] ペインで コントロールをクリックします。
advisor CLI アクション --command=detach を使用します。次に例を示します。
advisor --command=detach --result-dir=./myAdvisorResult
トリップカウント & FLOPを有効にした特性化解析を実行する場合、コールスタックが無効であることを (デフォルト設定) 確認してください。
[Project Properties] > [Analysis Target] > [Trip Counts & FLOP Analysis] > [Advanced] > [Collect stacks] チェックボックスをオフにします。
advisor CLI アクションオプション --no-stacks を --collect コマンドに追加するか、--stacks アクションオプションを --collect に追加します。
ビルトイン関数の使用 advisor CLI アクション --command=stop を使用すると、プロセスが強制終了します (解析データの収集も停止します)。