【发布时间】:2015-03-11 11:14:59
【问题描述】:
我有一个大型 Fortran/C++ 项目,它将数百个 Fortran 中间文件组装到一个执行程序中。当我监视一些全局单精度浮点变量时,当我在 Windows 7 x64 机器和 Windows XP SP2 x86 机器上运行执行程序时,会得到不同的结果。 差异高达 1-2%。
该项目是在 x86 机器上构建的,并且在 x64 机器上测试之前没有重新构建,尽管我使用完全相同的编译器 (compaq visual fortran 6.6) 和开发工作室 (visual studio 6.0),并且两者的代码相同机器。 x64机器有奔腾E5400,x86机器有奔腾4双核。这可能是Deterministic Lockstep? 的一个例子吗?
我知道这很模糊 - 我希望我可以提供一些代码,但是有超过 100 万行。所有变量都是REAL*4,并在 Fortran 代码中每秒计算数百次。 c++ MFC 代码将其组装成执行程序。
【问题讨论】:
-
你使用的是什么编译器版本?
-
将
/Op传递给编译器可以规避您面临的问题,如果您正在运行更新的编译器/arch:IA32将阻止编译器发出SSE{,2} 说明(这也可能导致正在发生的事情)。 -
编译器版本为 6.6。很有趣,谢谢你的解释,我会研究一下。
-
/Op 有效,/arch:IA32 给出 IA32 是 /arch 的不可识别选项的错误。澄清一下,这些命令会阻止 x64 机器发出 SSE2 指令?
-
不,
/Op阻止编译器发出优化的浮点指令(程序可能更慢,但更准确) - 其中/arch:IA32说它不应该发出任何 SSE{,2} 指令(因为这些结果可能因架构而异)。
标签: c++ floating-point x86 64-bit fortran