1

我有一个用 Fortran 编写的热工水力学代码,我正在研究它。对于我的调试版本,我-check bounds在编译时使用 ifort 11.1 中的选项。我过去以这种方式捕获了数组边界错误。不过,最近,我看到解决方案在给定案例中迅速爆发。奇怪的是,它在代码的发布版本中很好地融合了。果然,-check bounds从我的调试生成文件中删除标志清除了问题。

奇怪的是,调试版本在我之前使用的许多其他测试用例中运行良好,并且在我的代码中超出任何数组边界时没有抛出任何错误。这种行为对我来说似乎很奇怪,我不知道我的代码中是否存在某种错误或什么。任何人有任何想法可能导致这种行为?

根据要求,我用于发布和调试的标志是:

发布:-c -r8 -traceback -extend-source -override-limits -zero -unroll -O3

调试:-c -r8 -traceback -extend-source -override-limits -zero -g -O0

当然,正如我最初的问题所表明的那样,我-check bounds为调试案例打开和关闭了标志。

4

1 回答 1

0

我会怀疑你的数值算法比 Fortran 代码更多。您是否确保满足所有收敛性和稳定性标准?

听起来像是舍入错误导致解决方案无法收敛。如果您处于安全收敛的边缘,编译器优化肯定会以一种或另一种方式解决问题。

我使用gfortran了 more than ifort,所以我不知道 -unroll 选项的所有细节,但是展开循环可以改变一些舍入,即使计算看起来应该保持不变。此外,调试肯定会改变内存和寄存器访问的确切顺序。如果数字以某种内部表示形式存在于处理器中,然后被写入内存并再次读回,则该值可以更改。这可以通过仔细选择在一定程度上得到缓解kind。从本质上讲,这将是特定于处理器的,而不是可移植的。

理论上,完全符合 IEEE 754 将使浮点运算可重现,但情况并非总是如此。如果调试实际上导致了这些问题,而不是代码中的其他错误,那么与处理器内部工作相关的其他神秘事物也可能导致它崩溃。

我会在代码的各个关键点添加写语句以输出您的数据矩阵(或您正在使用的任何数据结构)。一定要使用二进制输出。form='unformatted'用和打开access='direct'

于 2013-02-27T08:48:25.007 回答