【问题标题】:Why is fp division op slower than reciprocal op plus multiply op为什么 fp 除法运算比倒数运算加乘运算慢
【发布时间】:2016-11-15 11:29:53
【问题描述】:

根据 Agner 的instruction tables,单个 fp 除法比单个倒数运算和单个乘法运算慢。 (这似乎在测量的 x86 架构中很常见)

这是打桩机架构表的摘录。

MULSS MULSD    x,x/m    1  5-6   0.5   P01  fma
MULPS MULPD    x,x/m    1  5-6   0.5   P01  fma
VMULPS VMULPD  y,y,y/m  2  5-6   1     P01  fma
DIVSS DIVPS    x,x/m    1  9-24  5-10  P01  fp
VDIVPS         y,y,y/m  2  9-24  9-20  P01  fp
DIVSD DIVPD    x,x/m    1  9-27  5-10  P01  fp
VDIVPD         y,y,y/m  2  9-27  9-18  P01  fp
RCPSS/PS       x,x/m    1  5     1     P01  fp

第四个值是延迟。所以乘法运算需要 5-6,除法运算需要 9-24,倒数运算需要 5 个周期。由于 24 > 6 + 5,我想知道为什么 2 个单独的操作比 1 个单独的操作快以获得基本相同的结果。

我怀疑这个问题的答案涉及误差的测量。也许是除法比倒数加乘法更准确。如果是这种情况,误差测量如何比较?例如,是否存在线性关系,因为除法的速度几乎是倒数 + 乘法的两倍,那么它的准确度也是两倍吗?

【问题讨论】:

  • 记录了错误。 rpcss is good to 11.5 binary places。另一方面,divss 是 IEEE 划分,所以对 24 个二进制位很好。
  • 正如英特尔文档所说:“RCPSS(计算标量单精度浮点值的倒数)指令计算 近似 的倒数源操作数中的低位单精度浮点值,并将结果存储在目标操作数的低位双字中。” (强调我的)
  • 查看有关平方根及其倒数运算的相关问题:stackoverflow.com/questions/1528727/…

标签: performance assembly floating-point x86


【解决方案1】:

IIRC,快速近似倒数除法和 sqrt 指令基本上是表查找(从内部表),没有迭代细化,使精确除法/sqrt 变慢且难以流水线化。这就是为什么/如何以每时钟一个吞吐量实现它们的原因。

请注意,在最近的微架构之前,divss 的吞吐量并不比延迟好多少,甚至 Skylake 令人印象深刻的 FP 划分/sqrt 单元也没有完全流水线化。


至于你剩下的问题,答案和rsqrt一样,所以看这个问题Why is SSE scalar sqrt(x) slower than rsqrt(x) * x?

(感谢罗斯挖掘链接)

【讨论】:

    猜你喜欢
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多