2013-02-28 52 views
9

的的x87 FPU值得注意的是使用内部80位精度模式时,这往往会导致跨编译器和机器意想不到和不可再现的结果。 In my search在.NET上可重现的浮点运算,我发现.NET(Microsoft和Mono)的两个主要实现都是在64位模式下发出SSE指令而不是x87。SSE浮点算法是否可重现?

SSE(2)使用用于32位浮点数严格的32位寄存器,和用于64位浮点数严格的64位寄存器。通过设置appropriate control word,可以选择性地将非正常通道清零。

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

撇开超越函数(未通过上证所不同的x87原生提供),并使用SSE保证在机器和编译器可重复的结果回事?例如,编译器优化能否转化为不同的结果?我发现了一些矛盾的意见:

如果你有SSE2,那么使用它,并过后快乐地生活。 SSE2支持 32b和64b操作,中间结果的操作数大小为 。 - 贝纳Kreininhttp://www.yosefk.com/blog/consistency-how-to-defeat-the-purpose-of-ieee-floating-point.html

...

SSE2指令(...)是完全符合IEEE754-1985,他们 允许更好的可重复性(由于静舍入精度)和其他平台的可移植性。 Muller等aliisHandbook of Floating-Point Arithmetic - 第107页

但是:

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

+1

我敢肯定,如果在网络上有两个相互矛盾的观点,你会在这里得到一个论点(也可能至少有第三个观点) – KevinDTimm 2013-02-28 22:51:47

+1

@KevinDTimm虽然没有使这个问题成为主观的。上证所可重现或不重要。 – Asik 2013-02-28 22:55:15

+1

“SSE或SSE2 [指定得太不明确以致无法确定]”。我不认为自己是这方面的专家,但这听起来像是BS。在链接中,有关超验的库函数的讨论,当然在一个平台上可能存在缺陷,而在另一个平台上可能存在缺陷,因为实际上在任何编译器的优化器中都可能存在(实际上可能是),但对于SSE并没有提及/ SSE2本身。他有他的意思吗? – 2013-03-01 00:02:45

回答

9

SSE完全指定*。 Muller是浮点运算的专家;你会信任谁,他还是某个gamedev论坛上的人? (*)对于非IEEE-754操作(如rsqrtss),其中英特尔从未完全明确规定行为,但这不影响IEEE-754基本操作,更重要的是其行为可以这一点实际上并没有改变,因为它会破坏太多事情的二进制兼容性,所以它们与指定的一样好。

3

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

你在那里扔单词“编译”,虽然。这完全是一个不同的球赛。许多编译器在保持浮点代码的正确性方面仍然非常糟糕。(The ATLAS errata page提到clang“未能为某些操作生成正确的代码”)。如果在代码中使用特殊函数,那么在某种程度上,也可能受到执行数学库的人的摆布。