我们正在编写一个仿真器,并想知道对于给定的FPU状态,在运行FPU指令后FPU的状态是确定性的。FDIV?
有许多英特尔兼容的中央处理器架构,它们实现了x87指令集。在测试FPU仿真的正确性时,我们是否应该依赖于生成的CPU状态?
不同的实现是否有不同的取整/计算方式?
发布于 2013-09-18 20:25:34
是的,对于基本操作+、-、*、/、sqrt,x87微处理器是确定性的。例如,在其默认状态(全角有效数和舍入到最近的偶数模式)下,x + y的结果恰好是与x和y的数学和的结果最接近的可表示的80位浮点值。
兼容芯片的制造商已经为上述操作实现了完全相同的定义。
在纯CISC传统中,x87的指令集还包含用于计算数学函数的高级指令,例如,正弦(FSIN)的近似值。这些指令的结果因处理器的品牌和型号而异。在您的模拟器中,您可能只需要提供仍在使用的one of the worst implementations of these instructions一样好的东西。如果您使用宿主语言的数学库中的sinl()函数的结果,那么没有人会抱怨,因为它通常比FSIN更好(因为它是用显式的argument reduction和polynomial approximation实现的,而不是调用FSIN)。
发布于 2013-09-18 20:36:59
如果你坚持使用基本的FPU指令,并对你的FPU算法使用相同的编译器,如果你希望它们产生一致的结果,那么它应该是正确的。这还不包括正确初始化FPU库所需的事实。
如果你感兴趣,这里有一些关于这个主题的好读物:https://randomascii.wordpress.com/2013/07/16/floating-point-determinism。
这篇文章中的其他文章的链接非常有用。
发布于 2013-10-01 23:36:16
正如其他人所说,基本的五个操作将在所有x87 FPU上产生相同的结果。然而..。
x87的浮点运算单元很特别。它的80位寄存器意味着它可能会得到与任何其他浮点单元不同的结果(例如在具有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/
https://stackoverflow.com/questions/18872078
复制相似问题