OpenMP* の例

次の例では、OpenMP 機能の使用方法を示します。

単純な差分演算子

この例は、各繰り返しごとにワーク量が異なる単純な並列ループを示したものです。負荷のバランスをとるために、動的スケジューリングを使用しています。並列領域の最後に暗黙的な barrier があるため、fornowait が含まれています。

void for1(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;

  }

}

2 つの差分演算子

この例では、fork/join のオーバーヘッドを減らすために融合される 2 つの並列ループを使用します。2 番目のループで使用するすべてのデータは最初のループで使用されるすべてのデータと異なるため、最初の fornowait が含まれています。

void for2(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;

  }

}

その他の例は、OpenMP C/C++ バージョン 2.5 仕様 (http://www.openmp.org/specs) を参照してください。