【问题标题】:Is this deterministic lockstep?这是确定性的锁步吗?
【发布时间】: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


【解决方案1】:

简介

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



启用浮点一致性

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

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

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

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



关闭SSE2

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

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

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

【讨论】:

  • 感谢 Filip,这是很好的信息。我将编译我的数百个文件并重新测试。
  • 很好的信息,但是在使用 /Op 编译每个源文件并重新构建后,结果完全相同。
  • @AlexB 你能创建一个小的 testcase 吗?您真正需要做的就是编写一个简单的应用程序来执行一些浮点运算,并在两种架构上显示不同的行为。
  • 这样做。您似乎对 Compaq Visual fortran 编译器选项了解很多。是否有可用选项的手册?我在任何地方都找不到任何东西......
  • @AlexB 5 秒的简单谷歌搜索jp.xlsoft.com/documents/intel/cvf/cvf_pg.pdf BTW 购买编译器时应该已经收到了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 2013-06-07
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
相关资源
最近更新 更多