浮点运算结果的再现性

use*_*208 5 c++ floating-point fixed-point

浮点算术运算是否有可能在不同的CPU上产生不同的结果?CPU是指x86和x64的全部内容.并且通过不同的结果,我的意思是即使只有一个最不重要的位是不同的.我需要知道我是否可以在项目上使用浮点运算,这对于在不同的机器上具有与相同输入相对应的完全相同的结果是至关重要的.

编辑:添加了c ++标签.
还要澄清一下:我需要可重复的结果运行时间.我不希望不同编辑的结果相同.

eca*_*mur 9

在游戏行业中,这被称为确定性锁步,并且对于实时网络游戏非常重要,其中客户端和服务器需要就物理对象的状态(玩家,射弹,可变形地形等)达成一致.

根据Glenn Fiedler关于浮点决定论的文章,答案是" 可能一个惨淡的跛行 "; 如果在同一体系结构上运行相同的二进制文件限制使用不如基本浮点指定的功能,则可以获得相同的结果.否则,如果您使用不同的编译器,或允许您的代码使用SSE或80位浮点,那么不同的可执行文件和不同的计算机之间的结果会有所不同.

Yosef Kreinin 建议:

  • 扫描汇编器输出以进行代数优化并将其应用于源代码;
  • 抑制融合乘法加法和其他高级指令(例如sin三角函数);
  • 并使用SSE或SSE2,或将FPU CSR设置为64位.(是的,这与Glenn Fiedler的建议相冲突.)

当然,在多台不同的机器上测试您的代码; 获取中间输出的哈希值,这样您就可以知道模拟发生在何处以及何时发生分歧.