为什么fp除法运算速度慢于倒数运算加倍乘运算

时间:2016-07-13 03:22:00

标签: performance assembly floating-point x86

根据Agner的instruction tables,单个fp除法比单个倒数op和单个乘法op慢。 (这似乎在测量的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

第4个值是延迟。因此乘法运算取5-6,除法运算取9-24,倒数运算取5个周期。从24> 6 + 5,我想知道为什么2个单独的操作比单个操作更快,以获得基本相同的结果。

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

1 个答案:

答案 0 :(得分:4)

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

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

至于问题的其余部分,答案与rsqrt的答案相同,请参阅此问题Why is SSE scalar sqrt(x) slower than rsqrt(x) * x?

(感谢Ross挖掘链接)