如何最大化利用SSE提高速度?

5
以下是您需要翻译的内容:

对于像MXCSR这样的东西,最佳设置是什么?哪种舍入模式最快?适用于哪些处理器?启用信号NaN是否更快,以便在计算结果为NaN时通知我,还是会导致非NaN计算速度变慢?

总之,如何使紧密内部SSE循环的速度最大化?

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

2个回答

6

使用Flush-to-zero和Denormals-are-zero模式:它们旨在提高速度,但会牺牲一定的精度,不过您可能不会注意到。

我怀疑不同的舍入模式有不同的成本。按最接近舍入理论上是最难的,但在硬件实现中,我猜想为了进行相同数量的循环所需的额外晶体管可能已经存在,并且仅在有向舍入时未被使用。

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

只在您的计算之前设置控制标志字:在计算期间更改它将使您实现的任何节省变得微不足道。


谢谢您的建议。FTZ 在速度上有很大的改善。 - FeepingCreature
1
不过,denormal也是一个黄金技巧(在我看来更加重要)。如果你运气不好,denormal可能会慢20-50倍。 - Damon
3
“Flush-to-zero”和“denormals-are-zero”都是与处理非规范化数相关的计算模式(flush-to-zero将作为操作结果的非规范化数转换为零,而denormals-are-zero在应用操作之前将作为操作参数的非规范化数转换为零)。通常使用其中一个标志就足以避免非规范化数的慢速路径,我建议同时使用这两个标志,因为不知道OP算法的详细信息。 - Pascal Cuoq

3
如果您的计算可能会遇到denormals,并且非常小的值的精度对于您的计算不重要,那么请务必打开FZ和DAZ(一次,在计算开始时;尽量不要更改MXCSR)。如果您的计算不涉及denormal值,则它们不会有任何区别,但如果涉及,则差异可能相当显着。
其他MXCSR位对性能没有任何影响。
唯一与x87相关的性能建议是:不要使用x87单元。尽可能在SSE中进行计算。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接