我有一个庞大的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代码将它组装成执行程序。
答案 0 :(得分:1)
您正在观察的差异(可能)是由于您的可执行文件包含优化的浮点指令,并且这些指令的结果在不同的体系结构之间可能会有所不同。
注意强>:以下只适用于 MSVC ++ 的较旧的(6.0)版本
除非你明确地告诉你不希望它以优化浮点运算(其中的权衡可能有一些轻微的不准确)的编译器,它会这么做。
将/Op
作为标志传递给编译器启用“'一致性'浮点模型”;有效地禁用了前面提到的优化。
等效标志/fp:strict
是VS2008中的默认选项。
注意:以下内容仅适用于较新版本的 msvc ++ 。
除非您明确表示您不希望 msvc ++ 为浮点计算生成 SSE {,2} 指令,否则这些指令将包含在您的浮点计算中。可执行文件。
可以强制编译器禁用的代 SSE 和 SSE2 通过使该标志说明/arch:IA32
给它。