アノテーションは、最小限のコードの追加で 1 つ以上の関数を呼び出します。スータビリティーや依存関係ツールを実行すると、呼び出しはデータ収集中にインストルメントされます。
ほとんどのアノテーションは、開始 - 終了シーケンスで実行されるペアで使用する必要があります (単一のタスクを持つサイトの並列サイト・アノテーションなど)。
C/C++ の場合:ANNOTATE_SITE_BEGIN(サイト名); と ANNOTATE_SITE_END();
Fortran の場合:call annotate_site_begin(サイト名) と call annotate_site_end
C# の場合:Annotate.SiteBegin(サイト名); と Annotate.SiteEnd();
アノテーションの不一致は、データ収集中にエラーとして示されます。
例えば、C/C++ コードが ANNOTATE_SITE_BEGIN(); を実行し、対応する ANNOTATE_SITE_END(); がない場合、エラー: 「スータビリティーまたは依存関係ツールを実行した際に、サイトの終了が見つかりません」という意味のメッセージが表示されます。
動的にペアになるアノテーションを使用することもできます。そのため、アノテーションを追加した領域には複数の出口がある可能性があります。例えば、複数のタスクを持つ並列サイトを考えてみます。
// ループから分岐するためタスク終了アノテーションを繰り返すことを示します
ANNOTATE_SITE_BEGIN(for_site1);
ANNOTATE_TASK_BEGIN(for_taskA);
for () {
if()
ANNOTATE_TASK_END();
break;
ANNOTATE_TASK_END(); // 到達しない! }
ANNOTATE_TASK_BEGIN(for_taskB);
...
ANNOTATE_TASK_END();
ANNOTATE_SITE_END();C/C++ では、中かっこの開閉 ({ と }) を持たない単一文のみを実行するループの後にアノテーションを追加する場合、中かっこの開閉を加えることで元の文とアノテーションを追加した文の両方を実行することができます。
プログラムのソースの観点からは、アノテーション・マクロが実行可能な単一文として拡張されます (null 拡張が使用された場合は何もしません)。そのため、次の例のように単一文を安全に実行する必要がある場所で、アノテーションの使用が可能になります。
...
if (!initialized)
ANNOTATE_RECORD_ALLOCATION(my_buffer, my_buffer_size);
...ソースコードにアノテーションを配置するインテル® Advisor のガイドラインは、デバッガーのブレークポイントの制限に類似します。次の規則が含まれます。
それぞれのアノテーションは異なる行に配置します。つまり、同一行に複数のアノテーションを記述してはなりません。
C/C++ コードでは、プリプロセッサー・マクロ内にアノテーションを配置してはなりません。
以下は、行ごとに単一のアノテーションを記述する正しい例です。
ANNOTATE_TASK_BEGIN(foo);
call xyz();
ANNOTATE_TASK_END();
これらのガイドラインに従わないと、[Dependencies Report (依存関係レポート)] ウィンドウで予期しないアノテーションの不一致が報告されたり (以下のトラブルシューティングのトピックを参照)、[スータビリティー・レポート] ウィンドウでアノテーションに関連したエラーが報告されます。
タスク間の相互作用を収集するためスータビリティーまたは依存関係ツールを実行すると、ツールがシリアル実行を行う間にアノテーションの実行とほかの操作との関係が追跡され、解析結果が対応するレポートに表示されます。
依存関係ツールの実行で注目すべき主な問題は、注意が必要なデータの相互作用です。しかし、プログラムのアノテーションの使用に関するセマンティクス上のエラーが報告されることもあります。