这是确定性的锁步吗?

时间:2015-03-11 11:14:59

标签: c++ floating-point x86 64-bit fortran

我有一个庞大的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代码将它组装成执行程序。

1 个答案:

答案 0 :(得分:1)

简介

您正在观察的差异(可能)是由于您的可执行文件包含优化的浮点指令,并且这些指令的结果在不同的体系结构之间可能会有所不同。



启用浮点一致性

  

注意:以下只适用于 MSVC ++ 的较旧的(6.0)版本

除非你明确地告诉你不希望它以优化浮点运算(其中的权衡可能有一些轻微的不准确)的编译器,它会这么做。

/Op作为标志传递给编译器启用“'一致性'浮点模型”;有效地禁用了前面提到的优化。

等效标志/fp:strict是VS2008中的默认选项。



关闭 SSE2

  

注意:以下内容仅适用于较新版本的 msvc ++

除非您明确表示您不希望 msvc ++ 为浮点计算生成 SSE {,2} 指令,否则这些指令将包含在您的浮点计算中。可执行文件。

可以强制编译器禁用的代 SSE SSE2 通过使该标志说明/arch:IA32给它。