インテル® C++ コンパイラー 14.0 ユーザー・リファレンス・ガイド
次の例では、いくつかの OpenMP* 機能の使用方法を示します。
この例は、各繰り返しごとにワーク量が異なる単純な並列ループを示したものです。負荷のバランスを向上させるため、動的スケジュールを使用しています。
並列領域の最後に暗黙的な barrier があるため、for に nowait が含まれています。
例では、fork/join のオーバーヘッドを減らすために融合される 2 つの並列ループを使用します。2 番目のループで使用するすべてのデータは最初のループで使用されるすべてのデータと異なるため、最初の omp for プラグマには、nowait 節が含まれています。
例 |
|---|
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; } } |
例では、omp sections プラグマの使用方法を示します。 ロジックは、前述の omp for の例と同じですが、omp for の代わりに omp sections を使用します。 ここでは、2 つの作業単位しかないため、スピードアップは、2 が限度です。前述の例では、作業単位は n-1 + m-1 です。
例 |
|---|
void sections1(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 sections nowait {#pragma omp section 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 section 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; } } } |