タスクの静的および動的範囲の例

ヘルプトピックの「偶発的共有」からの例を考えてみます。

extern int x;
ANNOTATE_SITE_BEGIN(site1);
for (i = 0; i != n; ++i) {
    ANNOTATE_ITERATION_TASK(task1);
    x = a[i];
    b[i] = x * b[i];
}
ANNOTATE_SITE_END();

タスクの静的範囲を調査

静的範囲で代替変数を定義する場合、それぞれのタスクはプライベート・ストレージから値を取得します。

extern int x;
// ...
ANNOTATE_SITE_BEGIN(site2);
for (i = 0; i != n; ++i) {
    ANNOTATE_ITERATION_TASK(task2);
    int x_sub;
    x_sub = a[i];
    b[i] = x_sub * b[i];
}
ANNOTATE_SITE_END();

タスクの動的範囲を調査

上記の最も簡単な例では、タスクの動的範囲は静的範囲と同じであり、関数呼び出しは含まれていません。関数呼び出しが含まれる場合、タスクの実行中に呼び出されるすべての関数は動的範囲の一部であり、関数内で読み書きされるすべてのメモリー位置を考慮する必要があります。

そのため、静的範囲だけではなくタスクの動的範囲を調査する必要があります。

関連情報