是SSE浮点运算重现?(Is SSE floating-point arithmetic repro

2019-07-20 18:37发布

所述的x87 FPU值得注意的是使用内部80位精度模式时,这往往会导致跨编译器和机器意想不到和不可再现的结果。 我在寻找对.NET重复性浮点运算,我发现.NET(微软和Mono)的两个主要实现发射SSE指令,而不是在的x87 64位模式。

SSE(2)使用用于32位浮点数严格的32位寄存器,和用于64位浮点数严格的64位寄存器。 非正规数可任选地通过设置刷新为零合适的控制字 。

因此,这样看来,SSE不从的x87的精度有关问题的影响,那唯一的变量是反规范的行为,可以被控制。

撇开超越函数(未通过上证所不同的x87原生提供),并使用SSE此事保证在机器和编译器可重复的结果? 难道编译器优化,例如,翻译成不同的结果? 我发现了一些相互矛盾的观点:

如果您有SSE2,使用它,从此幸福地生活之后。 SSE2同时支持32b和64b的操作和中间结果是操作数的大小。 - 贝纳Kreinin, http://www.yosefk.com/blog/consistency-how-to-defeat-the-purpose-of-ieee-floating-point.html

...

SSE2指令(...)是完全符合IEEE754-1985,他们允许更好的可重复性(由于静态舍入精度)和便携性与其它平台。 Muller等aliis, 浮点运算的手册 -第107页

然而:

此外,您不能使用SSE SSE2或浮动点,因为它太欠指定为确定性。 约翰 - Watte http://www.gamedev.net/topic/499435-floating-point-determinism/#entry4259411

Answer 1:

SSE完全指定*。 穆勒是在浮点运算方面的专家; 谁是你要相信,他或在gamedev论坛某些人?

(*)有非IEEE-754一样rsqrtss,其中英特尔从来没有完全指定的行为实际操作有一些例外,但不影响IEEE-754基本操作,更重要的是他们的行为实际上并不能改变在这一点上,因为它会破坏二进制兼容性的东西太多了,所以他们采用指定为好。



Answer 2:

斯蒂芬指出的,结果由一个给定的一段SSE汇编代码将是可重复的生产; 你喂相同的代码相同的输入,你会得到在年底相同的输出。 (也就是说,约翰Watte的报价是完全错误。)

你扔在那里单词“编译”,虽然。 这是一个不同的球赛完全。 许多编译器仍处于保留的浮点代码的正确性相当糟糕。 ( ATLAS的勘误表 ,使提的是铛“不能产生正确的代码进行一些操作。”)如果你在代码中使用特殊的功能,你也是,在一定程度上,在谁实现你的数学库摆布。



文章来源: Is SSE floating-point arithmetic reproducible?