我们正在编写一个模拟器,并想知道对于给定的FPU状态,是运行FPU指令后FPU确定性的状态,例如。 FDIV?
有许多与英特尔兼容的CPU架构,它们实现了x87指令集。在测试FPU仿真的正确性时,我们应该依赖于生成的CPU状态吗?
不同的实现是否以不同方式进行计算?
答案 0 :(得分:5)
是的,x87 FPU对于基本操作+
,-
,*
,/
,sqrt
具有确定性。例如,在其默认状态(全宽有效数和舍入到最近偶数模式)中,x + y
的结果恰好是与数学和的结果最接近的可表示的80位浮点值。 x
和y
。
兼容芯片的制造商已经为上述操作实现了完全相同的定义。
纯粹的CISC传统中的x87指令集还包含用于计算数学函数的高级指令,例如,正弦的近似值(FSIN
)。这些说明的结果因品牌和型号的处理器而异。在您的模拟器中,您可能只需要提供与one of the worst implementations of these instructions一样好的东西。如果您使用宿主语言数学库中sinl()
函数的结果,通常优于FSIN
(由于使用显式argument reduction实现,则不应该抱怨和polynomial approximation,而非拨打FSIN
)。
答案 1 :(得分:2)
如果您坚持使用基本的FPU指令,并且如果您希望它们产生一致的结果,则应该使用相同的编译器来生成FPU算法。这还不包括正确初始化FPU库所需的事实。
如果您有兴趣,请阅读以下有关该主题的一些好读物:https://randomascii.wordpress.com/2013/07/16/floating-point-determinism。
本文中其他文章的链接特别有用。
答案 2 :(得分:1)
正如其他人所说,基本的五个操作将在所有x87 FPU上提供相同的结果。然而...
x87 FPU很奇特。它的80位寄存器意味着它可能获得与任何其他FPU不同的结果(例如在具有64位浮点寄存器的PowerPC或ARM上)。这些结果可能更好或更糟。即使将x87舍入模式设置为32位或64位也不会使其与PowerPC / ARM相同,因为指数仍然是无限制的。
对于编写仿真器,这应该无关紧要,除了它意味着您不一定使用主机FPU来模拟x87 FPU。我在这两篇文章中讨论了很多这些问题:
http://randomascii.wordpress.com/2013/07/16/floating-point-determinism http://randomascii.wordpress.com/2012/03/21/intermediate-floating-point-precision/