Fortran Coder

查看: 1425|回复: 2
打印 上一主题 下一主题

[求助] 大数组但不是每次调用,设成可分配还是存为common计算更快

[复制链接]

36

帖子

17

主题

0

精华

专家

F 币
410 元
贡献
399 点
跳转到指定楼层
楼主
发表于 2023-7-17 19:02:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 石子 于 2023-7-17 19:07 编辑

各位好,我有若干个二维数组,每维的大小大约为10000~20000之间,采用omp并行计算。
计算的目标数组为AB,计算的总时间步大约为十万左右。为了更新A和B,每隔50步要调用subroutine1,关系大概如下:
[Fortran] 纯文本查看 复制代码
do t=1,Nt
...
if(mod(t,50)==0) then
 call subroutine1(A,B,c1,c2,w1,w2,n1,n2)
end if
...
end do


subroutine1中的关系为:A,B属性为in, c1,c2属性为out,其余的w1,w2和n1,n2为inout,即读入上一次的值并进行更新。
目前我的处理办法是subroutine中所有的数组都存在公共数据块COMMON中。我想W1,W2和N1,N2可不可以在subroutine1中每次分配,然后计算,然后释放,这样会省很多内存,或许会快一些?但是这样有个问题就是,上一步算的没法存下来。

想请问各位,这个问题有没有什么更合适的处理方式?目标是让计算更高效、速度。感谢

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩
欢迎交流

213

帖子

2

主题

0

精华

宗师

F 币
2142 元
贡献
875 点

规矩勋章

沙发
发表于 2023-7-17 23:33:17 | 只看该作者

回帖奖励 +10

本帖最后由 风平老涡 于 2023-7-17 23:39 编辑

你的一个数组单精度最小0.4G,最大1.6G,双精度加倍。8个数组就是3.2G~12G。如果W和N数组每次重新分配,计算速度降低并且无法保存前一次的结果。能够改进的是算法,可以看看数组的对称性及稀疏性。

36

帖子

17

主题

0

精华

专家

F 币
410 元
贡献
399 点
板凳
 楼主| 发表于 2023-7-18 10:58:03 | 只看该作者
本帖最后由 石子 于 2023-7-18 11:20 编辑
风平老涡 发表于 2023-7-17 23:33
你的一个数组单精度最小0.4G,最大1.6G,双精度加倍。8个数组就是3.2G~12G。如果W和N数组每次重新分配,计 ...

好的,谢谢呀。
欢迎交流
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-12-23 21:52

Powered by Tencent X3.4

© 2013-2024 Tencent

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