gpt4 book ai didi

fortran - 为什么将 "complex*16"更改为 "complex(16)"会导致fortran中运行时间不合理地增加?

转载 作者:行者123 更新时间:2023-12-03 01:05:44 25 4
gpt4 key购买 nike

这段fortran代码最初是用Fortran 77格式编写的(我稍后会展示它)。拿到后,我通过转换工具将其转换为f90免费格式。使用intel fortran编译器 ifort,编译和运行和以前一样好。

然后我想做更多,我想将非标准的、过时的数据类型声明 f77 样式(如:real*8complex*16 等)转换为 f90 标准实数(8)复杂(16)

但我发现了一件令人难以置信的事情。 我只是将一个“complex*16”更改为“complex(16)”,然后运行时间从10秒增加到2分钟。怎么可能!!?有人可以用 Fortran 解释这种异常行为吗?

<小时/>

详情如下

源文件可下载 source code download link 1souce code download link 2

首先,您可以使用 ifort 编译 f90 文件,忽略所有警告

ifort -w test-16.f90

然后运行

./a.out

它将在大约 10 秒内完成(取决于您的计算机)。

现在,我们做一个小小的改变。转到第 734 行,这行内容为

  Complex *16 ch, clamda, czero, cspw, com, phase, ctemp

是f77过时款式,改成f90标准

  Complex(16) ch, clamda, czero, cspw, com, phase, ctemp

同样的方式编译,ifort会报错

/tmp/ifortvaXMFi.o: In function `fite4_':
test-(16).f90:(.text+0x9ecf): undefined reference to `dimag_'
test-(16).f90:(.text+0xa354): undefined reference to `dimag_'

不知道为什么,我发现第744行有一个非常可疑的句子

  aimag(ctemp) = dimag(ctemp)

我真的不明白什么意思。但整个代码只有三个地方出现了“ctemp”。显然,这条线是有回馈的。这样我们就可以安全地删除它了。

所以删除744行后,编译就OK了。但正如我之前所说,运行时间增加到了2分钟多。实在是难以置信,这是怎么回事?

最佳答案

哦,亲爱的。种类值与变量占用的字节数不同。在大多数(但不是全部)编译器中,complex(16) 是四倍精度(如果支持),这就是运行时间飞速增长的原因。请了解 kind 值,例如参见

Fortran 90 kind parameter

开始,然后了解对于复杂变量,其种类值与构成它的实际值的种类相同。

我不会多说,说实话,如果有人发布了一个相对较长的程序,然后告诉我在编译期间忽略警告,然后解决他们的问题,那么我不觉得倾向于付出很多努力。修正警告,将程序减少到最多几十行,然后我,我怀疑大多数其他人,会更仔细地看。

关于fortran - 为什么将 "complex*16"更改为 "complex(16)"会导致fortran中运行时间不合理地增加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32935743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com