次の例に、OpenMP 機能の使用方法を示します。
この例は、各繰返しごとにワーク量が異なる単純な並列ループを示したものです。負荷のバランスをとるために、ダイナミック・スケジューリングを使用しています。並列領域の最後に暗黙的なバリアがあるため、forにnowaitが含まれています。
void for_1 (float a[], float b[], int n)
{
int i, j;
#pragma omp parallel shared(a,b,n) private(i,j)
{
#pragma omp for schedule(dynamic,1) nowait
for(i = 1; i < n; i++)
{
for(j = 0; j <= i; j++)
b[j + n*i] = (a[j + n*i] + a[j + n*(i-1)])/2.0;
}
}
}
下記の例では、fork/joinのオーバーヘッドを減らすために融合される2つの並列ループを使用します。2番目のループで使用するすべてのデータは最初のループで使用されるすべてのデータと異なるため、最初のforにはnowaitを含んでいます。
void for_2 (float a[], float b[], float c[], \
float d[], int n, int m)
{
int i, j;
#pragma omp parallel shared(a,b,c,d,n,m) private(i,j)
{
#pragma omp for schedule(dynamic,1) nowait
for(i = 1; i < n; i++)
{
for(j = 0; j <= i; j++)
b[j + n*i] = ( a[j + n*i] + a[j + n*(i-1)] )/2.0;
}
#pragma omp for schedule(dynamic,1) nowait
for(i = 1; i < m; i++)
{
for(j = 0; j <= i; j++)
d[j + m*i] = ( c[j + m*i] + c[j + m*(i-1)] )/2.0;
}
}
}