fortran - 不同的程序结果取决于程序的链接方式
问题描述
我正在开发一个大型数值模拟程序,主要用 Fortran 编写,使用 Intel Fortran 编译器 (v18.0.3) 编译。
最近遇到一个神秘的问题:如果我将程序与外部库链接为绝对路径,与链接的程序相比,数值结果略有不同-L/path/to/lib -lnameOfLib
我检查了以下内容:
- 共享库的运行时加载:我检查
strace
并在两种情况下都加载了相同的库并且它们以相同的顺序加载; - 单元化变量:编译时
-check all -ftrapuv
没有警告或错误; - 两个二进制文件都使用 valgrind 运行,除了在外部库中之外,没有发现内存问题;
- 二进制文件
diff
在它们上使用时是不同的。
我无法检查为什么会发生这种情况。如果有人可以进一步建议如何处理此问题以及差异可能源自何处,我将很高兴。
解决方案
我将根据这个解释得出以下结论。与 /usr/lib/libm.so 链接时,libm.so
将使用平台。链接时-lm
,英特尔编译器将更改链接命令以链接英特尔数学库libimf.so
。显然,这些不同的实现会给出导致差异的数值舍入误差。
推荐阅读
- php - 文件权限被拒绝(Laravel、Windows Server 2016、IIS10)
- sharepoint - 过滤文档“组(y)上的最大(x)”
- google-apps-script - 谷歌表中的 onedit 脚本仅适用于一个功能
- c++ - 这真的能确保一个数字在 1-9 之间吗?
- r - 在 R 中查找数据框范围的重叠
- android - AndroidNetworking 库没有记录任何内容
- http - Nifi http post -F 参数
- c - 移动到下一个函数后我的变量发生了变化
- apache-flink - Exactly-once:谁在存储历史数据,flink 还是数据源
- c# - Azure 函数创建 Word 文档