Fortran Coder

查看: 10879|回复: 9
打印 上一主题 下一主题

[数值问题] 请教下面这段代码的差异

[复制链接]

7

帖子

2

主题

0

精华

入门

F 币
53 元
贡献
28 点
跳转到指定楼层
楼主
发表于 2018-1-8 11:24:05 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
大家好,我的程序里面有这么一段代码:

[Fortran] 纯文本查看 复制代码
     do j=1,nt
      ! csum=G_0t(j)
      do ic0=1,ndims
       ! CP0(j,ic0)=CP0(j,ic0)*csum
       CP0(j,ic0)=CP0(j,ic0)*G_0t(j)
      enddo
     enddo


其中 nt 是比较大的数,比如,640000。以上的代码可以 run。但是如果把上面的注释去掉,像下面这样:
[Fortran] 纯文本查看 复制代码
     do j=1,nt
      csum=G_0t(j)
      do ic0=1,ndims
       CP0(j,ic0)=CP0(j,ic0)*csum
       ! CP0(j,ic0)=CP0(j,ic0)*G_0t(j)
      enddo
     enddo


想来这样会减少对 G_0t 这个数组的内存的访问。但是这样会出现运行时错误,说 segmentation fault。

看起来这两种方式对内存的处理是不一样的。有没有高手帮我解释一下?

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

7

帖子

2

主题

0

精华

入门

F 币
53 元
贡献
28 点
沙发
 楼主| 发表于 2018-1-8 12:24:29 | 显示全部楼层
pasuka 发表于 2018-1-8 11:51
csum没有定义吧?改成associate也出错?
do j=1,nt
       associate(csum=>G_0t(j))then

谢谢。不过, csum 是声明成复数类型了的,因此应该不是这个原因

7

帖子

2

主题

0

精华

入门

F 币
53 元
贡献
28 点
板凳
 楼主| 发表于 2018-1-9 13:48:10 | 显示全部楼层
pasuka 发表于 2018-1-8 13:17
无法提供能够重现错误的最小代码,实在爱莫能助了
非涉密项目,可以考虑加入qq群,然后加群主好友,再远程 ...

谢谢。我问这个问题只是想了解一下fortran的更细致的规则。这两段代码,一般情况下应该是一样的。可是,在我这里,第二种方式确实就会出现段错误。我怀疑是这两种方式对内存的操作是不一样的。但是这种错误大概只是在数组非常大的情况下才会出现。

7

帖子

2

主题

0

精华

入门

F 币
53 元
贡献
28 点
地板
 楼主| 发表于 2018-1-9 13:49:02 | 显示全部楼层
dypang 发表于 2018-1-9 13:48
谢谢。我问这个问题只是想了解一下fortran的更细致的规则。这两段代码,一般情况下应该是一样的。可是, ...

实际上,同样的程序,在 Linux 下面用第二种方式也是可以的,但是在 Windows 10 下面就不行。所以,应该跟操作系统也有关系。

7

帖子

2

主题

0

精华

入门

F 币
53 元
贡献
28 点
5#
 楼主| 发表于 2018-1-17 22:36:13 | 显示全部楼层
是的,大概跟编译器有关系,都是 pgfortran,但是一个是 windows 下面的版本,一个是 Linux 下面的版本。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-10 12:15

Powered by Tencent X3.4

© 2013-2024 Tencent

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