2011-07-30 55 views
5

MXCSR这样的东西的最佳设置是什么?哪种舍入模式最快?在什么处理器上?启用信号NaN是否更快,以便在计算结果为nan时获得通知,或者这会导致非NaN计算变慢?你如何从SSE获得最大速度?

总之,如何从紧密的内部SSE循环中获得最大速度?

任何相关的x87浮点速度建议也欢迎。

回答

6

使用齐平归零和非常规归零模式:它们旨在以您可能不会注意到的精确成本获得速度。

我怀疑不同的舍入模式有不同的成本。理论上圆到最近是最困难的,但在硬件实现中,我猜想额外的晶体管在相同数量的周期内完成它可能无论如何都存在,并且仅用于定向舍入。

信号NaN不会减慢非NaN计算。

在计算之前只设置一次控制标志字一次:在计算过程中对其进行更改将使您实现的任何节约变得更加渺小。

+0

感谢您的意见。自由贸易区在速度方面做得很好。 – FeepingCreature

+1

反常规也是一个黄金提示,虽然(在我看来更重要)。如果你不走运,反常速度可能会降低20-50倍。 – Damon

+3

@Damon“Flush-to-zero”和“denormals-are-zero”都是与非规范化处理有关的计算模式(flush-to-zero)将操作的**结果**的非规范化转换为零,而denormals-are-zero在应用操作之前将操作的**参数**的非规范化转换为零)。使用这些标志中的一个通常足以避免非正常慢速路径,我建议不知道OP算法的细节。 –

3

如果您的计算很可能会遇到非正常现象,并且非常小的值的准确性对您的计算并不重要,那么通过所有方法打开FZ和DAZ(一次,在计算开始时;请勿触摸MXCSR超过必要)。如果你的计算不涉及非规范值,它们不会产生任何影响,但是如果这样做,差异可能非常显着。

没有其他MXCSR位对性能有任何影响。

唯一与x87相关的性能建议是:不要使用x87单元。尽可能在SSE中进行计算。