为什么fp除法运算比倒数运算加乘法运算慢?

5
根据Agner的指令表,单个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,我想知道为什么两个单独的操作比一个单一的操作更快地获得基本相同的结果。
我怀疑这个问题的答案涉及误差的测量。也许除法比倒数加乘法更精确。如果是这样,误差测量如何比较?例如,是否存在线性关系,因为除法几乎比倒数+乘法慢两倍,它也是两倍准确?

6
这个错误已有记录。rpcss的精确度为11.5位二进制数。而divss是IEEE除法,因此它的精确度高达24位二进制数。 - Raymond Chen
正如英特尔文档所述:“RCPSS(计算标量单精度浮点值的倒数)指令计算源操作数中低位单精度浮点值的近似倒数,并将结果存储在目标操作数的低双字中。”(强调是我的) - Rudy Velthuis
关于平方根及其倒数操作的相关问题,请参考以下链接:https://dev59.com/gXI_5IYBdhLWcg3wF_B3 - Ross Ridge
1个回答

4
据我所知,快速近似倒数除法和平方根指令基本上是通过查找内部表格(而不进行迭代细化,这使得准确的除法/平方根变慢且难以流水线化)来实现的。这就是它们如何在每个时钟周期内实现的原因。请注意,divss吞吐量直到最近的微架构才比延迟好得多,即使Skylake非常出色的FP除法/平方根单元也没有完全流水线化。
关于你问题的其他部分,答案和rsqrt一样,所以请参考这个问题为什么SSE标量sqrt(x)比rsqrt(x)* x慢?
(感谢Ross挖出链接)

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