次の方法で共有


コンパイラの警告 (レベル 4) C4938

'var' : 浮動小数点の減少変数は、/fp:strict または #pragma fenv_access で矛盾する結果を生じさせる可能性があります

合計は異なる順序で計算されるため、OpenMP の浮動小数点の減少で、 /fp:strict または fenv_access を使用しないでください。 したがって、結果は、/openmp を使用しない場合の結果と異なる可能性があります。

次の例では C4938 が生成されます。

// C4938.cpp
// compile with: /openmp /W4 /fp:strict /c
// #pragma fenv_access(on)
extern double *a;

double test(int first, int last) {
   double sum = 0.0;
   #pragma omp parallel for reduction(+: sum)   // C4938
   for (int i = first ; i <= last ; ++i)
      sum += a[i];
   return sum;
}

明示的な並列化を使用しない場合、合計は次のように計算されます。

sum = a[first] + a[first + 1] + ... + a[last];

明示的な並列化 (および 2 つのスレッド) を使用する場合、合計は次のように計算されます。

sum1 = a[first] + ... a[first + last / 2];
sum2 = a[(first + last / 2) + 1] + ... a[last];
sum = sum1 + sum2;