Avertissement du compilateur (niveau 4) C4938
'var' : la variable de réduction à virgule flottante peut générer des résultats incohérents sous /fp:strict ou #pragma fenv_access
Vous ne devez pas utiliser /fp:strict ou fenv_access avec des réductions à virgule flottante OpenMP, car la somme est calculée dans un ordre différent. Par conséquent, les résultats peuvent différer des résultats obtenus sans /openmp.
L’exemple suivant génère l’avertissement 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;
}
Sans une parallélisation explicite, la somme est calculée comme suit :
sum = a[first] + a[first + 1] + ... + a[last];
Avec une parallélisation explicite (et deux threads), la somme est calculée comme suit :
sum1 = a[first] + ... a[first + last / 2];
sum2 = a[(first + last / 2) + 1] + ... a[last];
sum = sum1 + sum2;