Fortran Coder

查看: 2587|回复: 8
打印 上一主题 下一主题

[通用算法] Fortran中任意精度的FMZM包,可不可应用于并行中

[复制链接]

8

帖子

2

主题

0

精华

入门

F 币
38 元
贡献
18 点
跳转到指定楼层
楼主
发表于 2022-8-24 10:52:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Fortran中任意精度的FMZM包,可不可应用于并行程序中

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

213

帖子

2

主题

0

精华

宗师

F 币
2126 元
贡献
875 点

规矩勋章

沙发
发表于 2022-8-24 20:10:40 | 只看该作者
好像不行。因为该包中有涉及变化的全局变量,可能会在并行中引起racing。

8

帖子

2

主题

0

精华

入门

F 币
38 元
贡献
18 点
板凳
 楼主| 发表于 2022-8-25 16:14:07 | 只看该作者
风平老涡 发表于 2022-8-24 20:10
好像不行。因为该包中有涉及变化的全局变量,可能会在并行中引起racing。

有没有什么修改的策略,使之能并行

213

帖子

2

主题

0

精华

宗师

F 币
2126 元
贡献
875 点

规矩勋章

地板
发表于 2022-8-25 20:28:28 | 只看该作者
12138世界 发表于 2022-8-25 16:14
有没有什么修改的策略,使之能并行

如果是纯粹data parallel, 没有数据间的通讯,或许可行。如有通讯,需用线程安全的包。fmzm不是为并行设计的。下面这个包是为多线程并行设计的。

FM_files.zip

1.43 MB, 下载次数: 5

8

帖子

2

主题

0

精华

入门

F 币
38 元
贡献
18 点
5#
 楼主| 发表于 2022-8-26 16:24:37 | 只看该作者
使用了多线程的FM_parallel包,没有出现并行的报错,但是输出的结果不对

213

帖子

2

主题

0

精华

宗师

F 币
2126 元
贡献
875 点

规矩勋章

6#
发表于 2022-8-26 22:33:41 | 只看该作者
12138世界 发表于 2022-8-26 16:24
使用了多线程的FM_parallel包,没有出现并行的报错,但是输出的结果不对

那就是程序的逻辑错误了,这是最难查的。

8

帖子

2

主题

0

精华

入门

F 币
38 元
贡献
18 点
7#
 楼主| 发表于 2022-8-29 09:51:22 | 只看该作者
我写好了测试FM并行包的程序,使用FM包计算结果不正确,关闭FM包则可以给出正确的结果。测试程序的主要部分就是三个数的平方和,一是通过FM包转换为任意精度,另一种是直接用double计算,发现只有不使用FM包就可以给出正确的并行结果。下面是代码主体部分
[Fortran] 纯文本查看 复制代码
INTEGER :: ppi,ppj,i

  s = 1.0D0
 
!----------------------------test for FM package----------------------------------!

!$omp parallel do private(ppi,CoAMP_HELICITY)

  do ppi = 1,6

       write(str,*) s

       AP_sqs(ppi)=TO_FM(str)
 
       write(str,*) pin(ppi)

       AP_pin(ppi)=TO_FM(str)

       write(str,*) pin(ppi)

       AP_pout(ppi)=TO_FM(str)
       
       var(ppi) = AP_pin(ppi)**2+AP_pout(ppi)**2+AP_sqs(ppi)**2
       
      CoAMP_HELICITY = TO_DP(var(ppi))  
     ! CoAMP_HELICITY = pin(ppi)**2+pin(ppi)**2+s**2

      write(*,*) ppi,s,pin(ppi),CoAMP_HELICITY
  
 end do
!$OMP END parallel do
!--------------------------------------------------------------------------------!

8

帖子

2

主题

0

精华

入门

F 币
38 元
贡献
18 点
8#
 楼主| 发表于 2022-8-29 10:37:20 | 只看该作者
上面这个问题,将str设为private,可以解决,但是若这段程序是在一个子程序中,如何将str再次设置为private变量

213

帖子

2

主题

0

精华

宗师

F 币
2126 元
贡献
875 点

规矩勋章

9#
发表于 2022-8-29 19:47:12 | 只看该作者
12138世界 发表于 2022-8-29 10:37
上面这个问题,将str设为private,可以解决,但是若这段程序是在一个子程序中,如何将str再次设置为private ...

能否把parallel do 放到子程序外?
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-11-1 07:52

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表