【问题标题】:How do you get maximal speed out of SSE?如何从 SSE 中获得最大速度?
【发布时间】:2011-07-30 13:39:39
【问题描述】:

MXCSR 等内容的最佳设置是什么?哪种舍入模式最快?在什么处理器上?启用信号 NaN 是否会更快,以便在计算导致 nan 时通知我,或者这是否会导致非 NaN 计算速度变慢?

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

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

【问题讨论】:

    标签: optimization assembly x86 sse x87


    【解决方案1】:

    使用清零和非正规为零模式:它们旨在以您可能不会注意到的精度成本提高速度。

    我怀疑不同的舍入模式有不同的成本。从理论上讲,四舍五入是最难的,但在硬件实现中,我猜想在相同数量的周期内执行此操作的额外晶体管可能无论如何都存在,只是未用于定向舍入。

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

    在计算之前只设置一次控制标志字:在计算期间更改它将使您节省的任何费用都相形见绌。

    【讨论】:

    • 感谢您的建议。 FTZ 在速度上取得了不错的成绩。
    • 非正规化也是一个黄金技巧(在我看来,更重要的是)。如果你不走运,非正规可能会慢 20-50 倍。
    • @Damon "Flush-to-zero" 和 "denormals-are-zero" 都是与非正规化处理相关的计算模式(flush-to-zero 转换非正规化,即 操作的结果为零,而非正规化为零将作为操作的参数的非正规化在应用操作之前转换为零)。通常只使用其中一个标志就足以避免非规范化慢速路径,我建议两者都不知道 OP 算法的细节。
    【解决方案2】:

    如果您的计算可能会遇到非规范化,并且非常小的值的准确性对您的计算并不重要,那么请务必打开 FZ 和 DAZ(一次,在您的计算开始时;不要触摸 MXCSR超过必要)。如果您的计算不涉及非规范值,它们不会产生任何影响,但如果涉及,则差异可能非常显着。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多