加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows – 跨线程的数值差异(cygwin上的openMP)

发布时间:2020-12-14 02:46:41 所属栏目:Windows 来源:网络整理
导读:我希望以下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)
我希望以下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 guarantee is mostly straightforward (if you haven’t recompiled then you’ll get the same results) but nailing it down precisely is tricky.

So the guarantee is really that the same machine code will produce the same results,as long as you don’t do something wacky.

另外this系列的帖子,关于双打可能也会引起你的兴趣.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读