並列サイト・アノテーションは、並列サイトの開始と終了をマークします。一方、単純なループ本体全体をタスクとしてマークする場合、サーベイツールがアプリケーションの時間を消費する単純なループを特定する一般的なケースでは、単一の反復タスク・アノテーションのみが必要です。多くの場合、単一の時間を消費する単純なループ構造は、並列サイト内で実行される唯一のタスクである可能性があります。このアノテーション形式はまた、並列コードへの変換が容易です。
タスクのコードがループ本体全体を含まない場合、単一の並列サイトで複数のタスクが必要な場合、または複雑なループの場合は、それぞれのタスクをマークするため開始/終了アノテーションのペアを使用します。
ループではない時間を消費するコード、タスクを含む複雑なループ、または並列サイト内に複数のタスクが必要な場合は、一般的なサイト/タスク・アノテーション形式を使用します。
並列サイト・アノテーションは、ループを囲む並列サイトをマークします。
C/C++: |
ANNOTATE_SITE_BEGIN(sitename);とANNOTATE_SITE_END(); |
Fortran: |
call annotate_site_begin(sitename)とcall annotate_site_end |
C#: |
Annotate.SiteBegin(sitename);とAnnotate.SiteEnd(); |
反復タスク・アノテーションは、並列サイト内で実行されます。ループ本体の開始点近辺にこのアノテーションを配置して、単純なループ本体全体をタスクとしてマークします。
C/C++: |
ANNOTATE_ITERATION_TASK(taskname); |
Fortran: |
call annotate_iteration_task(taskname) |
C#: |
Annotate.IterationTask(taskname); |
C/C++ では、ANNOTATE_SITE_END();アノテーションのsitename 引数はオプションです。
sitename と taskname は、アノテーション名の引数規則に従います。
C/C++ コードでは、sitename は ASCII C++ 識別子です。インテル® Advisor のツールレポートに表示したときに分かりやすい名前を選択すると良いでしょう。
Fortran コードでは、sitename は文字定数です。インテル® Advisor のツールレポートに表示したときに分かりやすい名前を選択すると良いでしょう。
C# コードでは、sitename は文字列です。インテル® Advisor のツールレポートに表示したときに分かりやすい文字列を選択すると良いでしょう。
次の C/C++ コードは、単一タスクのループ向けの並列サイトであり、タスクは単純なループ本体全体を含みます。
...
ANNOTATE_SITE_BEGIN(sitename);
for (i=0; i<N; i++) {
ANNOTATE_ITERATION_TASK(taskname);
func(i);
}
ANNOTATE_SITE_END();
...次の Fortran コードは、単一タスクのループ向けの並列サイトであり、タスクは単純なループ本体全体を含みます。
call annotate_site_begin("sitename")
do i=1,size
call annotate_iteration_task("taskname")
call func(i)
end do
call annotate_site_end
...次の C# コードは、単一タスクのループ向けの並列サイトであり、タスクは単純なループ本体全体を含みます。
...
Annotate.SiteBegin("sitename");
for (int i = 0; i < N; i++) {
Annotate.IterationTask("taskname");
func(i);
}
Annotate.SiteEnd();
...
Visual Studio* プロジェクトでは、並列サイトはプロジェクト境界にまたがる可能性がありますが、並列サイトと関連するアノテーションは、スタートアップ・プロジェクトの関連プロジェクト内に配置される必要があります。適切な依存関係を追加するため、Visual Studio* の [プロジェクト依存関係] コンテキスト・メニュー項目を使用する必要があるかもしれません。
C++ のサンプル nqueens_Advisor と Fortran のサンプル nqueens_Fortran は、この形式のサイト/タスク・アノテーションを示します。C++ アノテーション・コードの例は、nqueens_annotated.cpp にあります。
ANNOTATE_SITE_BEGIN(solve);
for(int i=0; i<size; i++) {
// 最初の行のすべての位置を確認
// 再帰ごとに個別の配列を作成
ANNOTATE_ITERATION_TASK(setQueen);
// int * queens = new int[size]; // 盤上のクイーンの位置を表す配列 ...
// ADVISOR COMMENT: これはすべてのタスクが使用する偶発的共有です ...
setQueen(queens, 0, i);
}
ANNOTATE_SITE_END();ヘルプトピックの並列サイトとタスクのアノテーションは、並列サイトとタスクの追加を説明しています。