不同的程序结果取决于程序的链接方式
Different program result depending on how program is linked
我正在开发一个大型数值模拟程序,主要用 Fortran 编写,使用 Intel Fortran 编译器 (v18.0.3) 编译。
最近遇到一个神秘的问题:如果我link将外部库作为绝对路径的程序,与link编辑的程序相比,数值结果略有不同-L/path/to/lib -lnameOfLib
我检查了以下内容:
- 运行加载共享库的时间:我检查了
strace
,在这两种情况下加载了相同的库,并且它们以相同的顺序加载;
- 未初始化变量:使用
-check all -ftrapuv
编译时没有警告或错误;
- 两个二进制文件 运行 都带有 valgrind,没有发现内存问题,除了在外部库中;
- 二进制文件在使用
diff
时有所不同。
我无法检查为什么会发生这种情况。如果有人可以进一步建议如何处理这个问题以及可能产生差异的地方,我将很高兴。
我将根据 this explanation 得出以下结论。当 link 与 /usr/lib/libm.so 连接时,将使用平台 libm.so
。当 linking 与 -lm
时,英特尔编译器会将 linking 命令也更改为 link 英特尔数学库 libimf.so
。显然,这些不同的实现会产生导致差异的数值舍入误差。
我正在开发一个大型数值模拟程序,主要用 Fortran 编写,使用 Intel Fortran 编译器 (v18.0.3) 编译。
最近遇到一个神秘的问题:如果我link将外部库作为绝对路径的程序,与link编辑的程序相比,数值结果略有不同-L/path/to/lib -lnameOfLib
我检查了以下内容:
- 运行加载共享库的时间:我检查了
strace
,在这两种情况下加载了相同的库,并且它们以相同的顺序加载; - 未初始化变量:使用
-check all -ftrapuv
编译时没有警告或错误; - 两个二进制文件 运行 都带有 valgrind,没有发现内存问题,除了在外部库中;
- 二进制文件在使用
diff
时有所不同。
我无法检查为什么会发生这种情况。如果有人可以进一步建议如何处理这个问题以及可能产生差异的地方,我将很高兴。
我将根据 this explanation 得出以下结论。当 link 与 /usr/lib/libm.so 连接时,将使用平台 libm.so
。当 linking 与 -lm
时,英特尔编译器会将 linking 命令也更改为 link 英特尔数学库 libimf.so
。显然,这些不同的实现会产生导致差异的数值舍入误差。