Mac上使用英特尔Fortran编译器的结果不正确,但在Linux上却没问题

时间:2010-10-11 17:11:24

标签: macos optimization fortran intel

我一直在使用Fortran中的快速多极代码。对我来说这是一个黑盒子,在我的mac上编译时我一直有些奇怪。

我正在使用版本11.1的编译器,我有一台MacBook Pro在Snow Leopard上运行2.5 GHz Intel Core 2 Duo。

当我将优化标志设置为-O0时,代码运行正常,但是当我使用-O2或-O3时,代码运行失败。奇怪的是代码在Linux机器上运行良好,至少使用默认的-O2标志。

任何人对可能导致此问题的原因有什么想法?它必须是矢量化的东西。

2 个答案:

答案 0 :(得分:1)

乍一看,没有任何进一步的信息,我得出的结论是你的程序不稳定;也就是说,当您调整优化(对生成的代码有各种影响)时,您的程序会产生非常不同的结果(在某些情况下失败与非失败)。一些调整会对浮点运算的结果产生影响,这可能很容易导致长期运行的科学模拟成功与失败之间的差异。

这是程序潜在“问题”的症状,我建议你不要依赖程序“成功”运行的结果,直到你理解得更好 - 你需要打开黑匣子,看看里面是什么。

至少你应该测试你的程序对输入的微小变化的敏感性。

答案 1 :(得分:1)

如前所述,最终结果可能是数值敏感的,并且放宽算术规则的优化导致数值不稳定。或者优化可能会揭示程序中的错误。如果代码使用内部内存数组进行自己的内存管理(不再需要使用Fortran 90/95/2003),那么不同的操作系统可能会出现问题。我会进一步调查......

我建议启用所有警告和检查选项。如果有一个错误,你很幸运,他们可能会揭示或提供线索。至少它很容易尝试。尝试以下选项:

-check all -traceback -warn all -fstack-protector

您还可以尝试“-assume protect_parens”,这将使ifort符合Fortran标准,并查看是否会导致问题消失。

或者程序可能假设内存已预先分配给某个值。这与Linux和Mac有什么不同?我认为ifort可以选择控制它。如果它是一个旧的Fortran 77代码,它可以假设局部变量在过程调用中保留,即使在声明中没有使用“save”。有一个编译器选项可以使所有局部变量都像使用“save”一样 - 看看是否有所不同。