【发布时间】:2019-08-16 15:10:31
【问题描述】:
我正在开发一个大型数值模拟程序,主要用 Fortran 编写,使用英特尔 Fortran 编译器 (v18.0.3) 编译。
最近遇到一个神秘问题:如果我将程序与外部库链接为绝对路径,与-L/path/to/lib -lnameOfLib链接的程序相比,数值结果略有不同
我已经检查了以下内容:
- 共享库的运行时加载:我检查了
strace,在这两种情况下都加载了相同的库并且它们以相同的顺序加载; - 未初始化的变量:使用
-check all -ftrapuv编译时没有警告或错误; - 这两个二进制文件都使用 valgrind 运行,除了在外部库中之外,没有发现内存问题;
- 在它们上使用
diff时,二进制文件会有所不同。
我无法检查为什么会发生这种情况。如果有人能进一步建议如何处理这个问题以及差异可能来自哪里,我会很高兴。
【问题讨论】:
-
至少我最后一次检查英特尔编译器无法捕获所有未初始化的变量——所以这是我的猜测。你可以使用 NAG 编译器吗?
-
很遗憾无法访问 NAG 编译器。
-
-ftrapuv 没有做任何有用的事情,而且名称具有误导性。不要打扰它。我还怀疑未初始化的变量或参数不匹配。考虑添加“-warn interface”并重建。
-
当你写“结果略有不同”时,这是最后一位还是两位不同?可以用数值四舍五入或浮点运算的弱点来解释吗?
-
我不确定这是否是纯粹的数字舍入,但最终在其中一个测试用例中,差异在小数点后三位,由于这些差异,在达到收敛之前的迭代次数也关闭了一个。
标签: fortran intel-fortran