windows – 跨线程的数值差异(cygwin上的openMP)
我希望以下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: ",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 知道为什么会在我的特定环境中发生这种情况? 解决方法
你有没有考虑过,Fortran双精度通常只有
15 guaranteed significant digits?
Thread 1 results: 8.7800911157003387 676.85722410933931 Thread 0 results: 8.7800911157003370 676.85722410933886 Digits : 1 23456789012345-- 123 456789012345-- 一般来说,这意味着由于浮点运算的复杂性,第15位数之后的所有内容都不可信任. 您可能想要阅读here. 特别是系列中的this帖子,关于精度,解释了为什么你总是在线程0上得到相同的结果,只要你不重新编译:
另外this系列的帖子,关于双打可能也会引起你的兴趣. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- windows-server-2008-r2 – 磁盘性能低于预期
- windows向ubuntu传送文件(不用SAMBA)
- Windows – 运行64位操作系统有什么好处?
- windows-7 – Windows 7 Print Spooler服务不断停止
- 如何使用Microsoft R Open 3.3.2获得rmarkdown 1.2
- 汇编 – 为什么MS-DOS不初始化DS和ES寄存器?
- 如何将软件注册为Windows 7的防病毒软件?
- windows-7 – 通过GP添加快捷方式 – 程序文件与程序文件(x
- windows – 当你插入一个新的USB设备时会发生什么?
- 如何在Windows Powershell中区分两个文件夹?
- windows-phone-8.1 – 如何检测在Windows 10 Mob
- 无法修改表(使用microsoft sql server managemen
- 如何判断文件是EXE还是DLL?
- Windows PowerShell中特定文件类型的递归列表
- Windows上的Git提交(Cygwin)已损坏.
- Windows – IT是否需要用户的域密码?
- windows-server-2008 – IIS7 Windows Server 20
- Windows批处理文件,用于列出其中包含特定文件的文
- 如何在Windows上使用’rhc’命令进入openshift应
- windows – 如何在perfmon.exe中为当前未运行的进