A.20 barrier ディレクティブのバインディング
ディレクティブのバインディング規則は、barrier ディレクティブが最も近くで囲んでいる parallel ディレクティブとバインドすることを必要とします。ディレクティブのバインディングの詳細については、32 ページのセクション 2.8 を参照してください。
次の例では、main から sub2 への呼び出しは、barrier (sub3 内) が sub2 内の並行領域にバインドされていることから準拠していることになります。main から sub1 への呼び出しも、barrier がサブルーチン sub2 への並行領域にバインドされていることから準拠しています。main から sub3 への呼び出しは、barrier がどの並行領域ともバインドされておらず、無視されるので準拠していることになります。また、barrier は、sub1 で作成されるすべてのスレッドではなく、囲んでいる並行領域内のスレッドのチームに対してのみ同期をとることにも注意してください。
int main()
{
sub1(2);
sub2(2);
sub3(2);
}
void sub1(int n)
{
int i;
#pragma omp parallel private(i) shared(n)
{
#pragma omp for
for (i=0; i<n; i++)
sub2(i);
}
}
void sub2(int k)
{
#pragma omp parallel shared(k)
sub3(k);
}
void sub3(int n)
{
work(n);
#pragma omp barrier
work(n);
}