我希望以下fortran代码为所有线程生成相同的结果 . 我正在使用最新的cygwin处理32位Windows 7 . Gfortran版本是4.8.3
program strange
use omp_lib
implicit none
real(kind=8) :: X(3)
real(kind=8) :: R
real(kind=8) :: R3
!$omp parallel private(X,R,R3) default(none)
X(1)=7.d0
X(2)=5.3d0
X(3)=0.d0
R = dsqrt(X(1)**2 + X(2)**2 +X(3)**2)
R3 = R*R*R
write(*,*) "Thread ", omp_get_thread_num(), " results: ", R, R3
!$omp end parallel
end program
在我的机器上我得到了
radg@pc_radg ~/morralla/terror
$ gfortran terror.f90 -fopenmp
radg@pc_radg ~/morralla/terror
$ ./a.exe
Thread 1 results: 8.7800911157003387 676.85722410933931
Thread 0 results: 8.7800911157003370 676.85722410933886
Thread 2 results: 8.7800911157003387 676.85722410933931
Thread 3 results: 8.7800911157003387 676.85722410933931
运行几次之后,我看到线程0始终显示相同的结果,与所有其他线程不同 . 我还观察到,当更改要生成的线程数(导出OMP_NUM_THREADS = x)时,我仍然从线程0得到相同的错误结果
在更改优化级别时,我会得到很好的结果
radg@pc_radg ~/morralla/terror
$ gfortran -O3 terror.f90 -fopenmp
radg@pc_radg ~/morralla/terror
$ ./a.exe
Thread 0 results: 8.7800911157003387 676.85722410933931
Thread 1 results: 8.7800911157003387 676.85722410933931
Thread 3 results: 8.7800911157003387 676.85722410933931
Thread 2 results: 8.7800911157003387 676.85722410933931
相同的程序在Linux 64位机器(32位和64位二进制文件)上正常工作 . 这种输出的一个例子
Thread 3 results: 8.7800911157003387 676.85722410933931
Thread 0 results: 8.7800911157003387 676.85722410933931
Thread 1 results: 8.7800911157003387 676.85722410933931
Thread 2 results: 8.7800911157003387 676.85722410933931
知道为什么会在我的特定环境中发生这种情况?
1 回答
您是否考虑过,Fortran双精度通常只有15 guaranteed significant digits?
一般来说,这意味着由于浮点运算的复杂性,第15位数之后的所有内容都无法被信任 .
您可能想要阅读here .
特别是关于精度的系列中的this帖子解释了为什么你总是在线程0上得到相同的结果,只要你不重新编译:
另外this系列文章,关于双打也可能会让你感兴趣 .