インテル® C++ コンパイラー XE 13.1 ユーザー・リファレンス・ガイド
次の例について考えてみます。
float A[10][10000];
float B[10][10000];
float C[10][10000];
void foo(
int n,
int m1,
int m2
)
{
int i,j;
float W[10000];
for (i =0; i < n; i++) {
for (j =0; j < m1; j++)
W[j] = A[i][j] * B[i][j];
for (j =0; j < m2; j++)
C[i][j] += W[j] + 1.0;
}
}
この例では、確実に m1 >= m2 になるかどうか分からないため、コンパイラーはこのループを並列化しません。
m1 >= m2 であることが分かっており、ループ終了後に W の要素が書き込まれる前に読み取られることがない場合、次のプラグマを使用できます。
安全であることが分かっている場合は、次のようにプラグマを追加できます。
float A[10][10000];
float B[10][10000];
float C[10][10000];
void foo(
int n,
int m1,
int m2
)
{
int i,j;
float W[10000];
#pragma parallel private (W)
for (i =0; i < n; i++) {
for (j =0; j < m1; j++)
W[j] = A[i][j] * B[i][j];
for (j =0; j < m2; j++)
C[i][j] += W[j] + 1.0;
}
}