インテル® Advisor ツールがプログラムの並列実行と同期の発生を推測するように、プログラムのシリアル部分にインテル® Advisor のアノテーションを追加してマークします。後で、コードを変更してプログラムを並列実行する準備ができたら、実際にその部分が並列実行されるように、アノテーションを並列フレームワークのコードで置き換えます。
コンパイラーが処理できるように、アノテーションは使用する言語に応じてサブルーチンまたはマクロとして実装されます。アノテーションはプログラムの計算を変更しないため、アプリケーションは通常通りに実行されます。
以下の場所をマークする 3 つのアノテーション・タイプがあります。
並列サイト。並列サイトは、1 つまたは複数のタスクを含み、並列実行の範囲を定義します。並列コードに変更されると、並列サイトはシングルスレッドで実行を開始します。
並列サイト内の 1 つまたは複数の並列タスク。並列サイトの実行中に遭遇するそれぞれのタスクは、ほかのタスクや並列サイト内のコードと並列実行される可能性を考慮してモデル化されます。並列コードに変更されると、タスクは並列に実行されます。つまり、タスクコードの各インスタンスは異なるコア上で並列に実行され、タスクコードの複数のインスタンスは同じ並列サイト内のほかのタスクの複数インスタンスと並列に実行されます。
同期のロック。並列プログラム内の相互排他が必要なデータアクセスの場所を示します。
さらに次のアノテーションがあります。
データ収集を停止および再開するアノテーション。ターゲットが実行されている間、データ収集が行われます。これらのアノテーションを使用して、ターゲットプログラム実行の必要がない部分をスキップできます。
特殊アノテーション。あまり一般的でない状況で使用されます。
3 つのインテル® Advisor ツールは、3 つの主なアノテーション・タイプと、収集の停止および再開アノテーションを認識します。依存関係ツールのみが特殊アノテーションを処理します。
並列処理を追加する候補のコード領域をマークするため、並列サイトとタスク・アノテーションを使用します。これらのアノテーションは、インテル® Advisor のスータビリティーと依存関係ツールが、シリアルプログラムの並列動作を予測できるようにします。例:
スータビリティー・ツールは、シリアルプログラムを実行し並列サイトとタスク境界を使用して、並列プログラムの大まかなパフォーマンス特性を予測します。
依存関係ツールは、シリアルプログラムを実行し並列サイトとタスク境界を使用して、データ競合とその他の同期の問題を確認します。
サイトとタスクの一般的な使い方として、ループ全体を並列サイトで囲み、ループ本体をタスクで囲む方法があります。次の C/C++ コードは、2 つの並列サイト・アノテーションと 1 つのタスク・アノテーションを使用する簡単な nqueens_Advisor の例です。3 つのアノテーションとアノテーション定義のインクルード行は、太字で示します。
#include "advisor-annotate.h"
...
void solve() {
int * queens = new int[size]; // 配列は盤上に配置されたクイーンを示します
...
ANNOTATE_SITE_BEGIN(solve);
for(int i=0; i<size; i++) { // 最初の列のすべての位置を試行
ANNOTATE_ITERATION_TASK(setQueen);
setQueen(queens, 0, i);
}
ANNOTATE_SITE_END(); ...}以下は Fortran の nqueens のコード例です。並列サイトの使用と call annotate_site_begin("label") などの Fortran タスク・アノテーションの使用例を示します。3 つの追加されたアノテーションとアノテーション定義モジュール ( use 文) の参照は、太字で示します。
use advisor_annotate
...! main solver routine
subroutine solve (queens)
implicit none
integer, intent(inout) :: queens(:)
integer :: i
call annotate_site_begin("solve")
do i=1,size
! 最初の行のすべての位置を試行
call annotate_iteration_task("setQueen")
call SetQueen (queens, 1, i)
end do
call annotate_site_end
end subroutine solve以下のコードは、 Windows* システム上の C# のnqueensの例です。Annotate.SiteBegin("label");...追加された 3 つのアノテーションとアノテーション定義の使用を可能にする行 (usingディレクティブ) は、太字で示します。
using AdvisorAnnotate;
...
public void Solve() {
int[] queens = new int[size]; // 盤上に配置されたクイーンを示す配列。インデックスは行位置、値は列です。
Annotate.SiteBegin("solve");
for (int i = 0; i < size; i++) {
Annotate.IterationTask("setQueen");
// 最初の列のすべての位置を試行
SetQueen(ref queens, 0, i);
}
Annotate.SiteEnd(); ...}アノテーションの追加を簡素化します。
Microsoft* Visual Studio* コードエディターを使用する場合、アノテーション・ウィザードを使用できます。
[Survey (サーベイ)] ウィンドウ、または [No Data (データなし)] メッセージでは、アノテーション・アシスタントを使用して、任意のエディターにアノテーション・コードとビルド設定の例をコピーできます。
手動でアノテーションを追加する場合、アノテーションを個別の行に配置して、アノテーションの引数に正しいデータ型を指定する必要があります。C/C++ では、正しいソースの場所を参照できるようにするため、マクロ内にアノテーションを記述してはなりません。
並列処理を追加する最適な場所を特定するため、実験的にアノテーションを変更してツールを再度実行できます。
アノテーションを追加したソースをコンパイルする前に、次のことを行う必要があります。
アノテーションを追加したファイルごとに、インテル® Advisor のアノテーション定義ファイルを参照する行を追加します。
C/C++ モジューでは、advisor-annotate.h ヘッダーファイルをインクルードするため、#include "advisor-annotate.h" または #include <advisor-annotate.h> を追加します。
Fortran のコンパイル単位では、use advisor_annotate 文を追加します。
C# モジュール (Windows*) では、using AdvisorAnnotate ディレクティブを追加します。
C/C++ または Fortran アプリケーションをビルドする際に、コンパイラーがインクルード・ファイルを検出できるように、インテル® Advisor のインクルード・ディレクトリーを指定します。同様に、C# プロジェクトに C# アノテーションの定義ファイルを追加する必要があります。
ネイティブ・アプリケーションでは、ビルド設定 (コンパイラーとリンカー) を追加します。