这是确定性的锁步
Is this deterministic lockstep?
我有一个大型的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
传递给编译器来强制编译器禁用 SSE 和 SSE2 指令的生成。
- msdn.microsoft.com - /拱门 (x86)
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 与互斥锁相比,旋转锁可以保证上下文切换
- 维护unordered_map但同时每一步都需要最低的映射值
- 我应该在锁定TBitmap画布后解锁它吗
- C++编译器中有哪些非确定性的例子?
- 如何在没有死锁和/或争用的情况下正确使用 std::mutex C++?
- 具有两个独占锁组的共享锁
- 需要反转音频步进公式
- 用C++中的std::condition_variable将线程置于死锁中会有风险吗
- 如何在最后一步使用CryptDecrypt解决NTE_BAD_DATA
- condition_variable、引用和线程:谁拥有锁?
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- 使用 std::async 时死锁,将来作为成员
- 如何调试读写器锁的死锁?
- 为什么我的 HWID 锁接受任何acceptedSerial_2值
- 生产者使用者在 cpp 中使用互斥锁的问题
- 是否有必要获取锁并在不需要唤醒线程时通知condition_variable?
- 在通知提升间处理条件变量时未按住锁会导致问题
- 每次使用带有LOCK_EX标志的LOCK_NB时,相同的程序/进程都会获取锁
- 这是确定性的锁步