【问题标题】:Different program result depending on how program is linked不同的程序结果取决于程序的链接方式
【发布时间】: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


【解决方案1】:

我将根据this explanation 得出以下结论。与 /usr/lib/libm.so 链接时,将使用平台 libm.so。当与-lm 链接时,英特尔编译器将更改链接命令以同时链接英特尔数学库libimf.so。显然,这些不同的实现会产生导致差异的数值舍入误差。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多