根据 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 个单独的操作更快以获得基本相同的结果。
我怀疑这个问题的答案涉及误差的测量。也许是这样,除法比倒数加乘法准确得多。如果是这种情况,误差测量如何比较?例如,是否存在线性关系,因为除法的速度几乎是倒数 + 乘法的两倍,所以它的准确度也是两倍吗?
最佳答案
IIRC,快速近似倒数除法和 sqrt 指令基本上是一个表查找(从内部表),没有迭代细化,使精确除法/sqrt 变慢且难以流水线化。这就是为什么/如何以每时钟一个吞吐量来实现它们。
请注意,直到最近的微体系结构,divss
吞吐量并没有比延迟好多少,甚至 Skylake 非常令人印象深刻的 FP 除法/sqrt 单元也没有完全流水线化。
至于您的其余问题,答案与 rsqrt
相同,因此请参阅此问题 Why is SSE scalar sqrt(x) slower than rsqrt(x) * x?
(感谢罗斯挖掘链接)
关于performance - 为什么 fp 除法运算比倒数运算加乘法运算慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38342154/