这是确定性的锁步

Is this deterministic lockstep?

本文关键字:锁步 确定性      更新时间:2023-10-16

我有一个大型的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双核。 这可能是确定性锁步的一个例子吗?

我知道这很模糊 - 我希望我能提供一些代码,但有超过 100 万行。 所有变量都是REAL*4的,并在 Fortran 代码中每秒计算数百次。 c++ MFC 代码将其组装到执行中。

简介

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

<小时 /> <小时 />

启用浮点一致性

注意:以下内容仅适用于较旧 (6.0) 版本的 msvc++

除非您明确告诉编译器您不希望它优化浮点运算(其中的权衡可能是一些轻微的不准确性),否则它会这样做。

/Op作为标志传递给编译器可以实现"'一致性'浮点模型";有效地禁用前面提到的优化。

  • msdn.microsoft.com - VS6.0 - /Op (提高浮点一致性)

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

<小时 /> <小时 />

关闭 SSE2

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

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

您可以通过将标志/arch:IA32传递给编译器来强制编译器禁用 SSESSE2 指令的生成。

  • msdn.microsoft.com - /拱门 (x86)