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

标签 performance assembly floating-point x86

根据 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/

相关文章:

java - variable = null 是否将其设置为垃圾收集

android - 没有任何java的原生android开发?

c - 解释汇编指令

c - 如何在 C 中静态断言浮点是 IEEE-754?

python - 检查字符串是否为仅表示为十进制数的 float

python - 在 Python 中将 float 与一个非常大的整数相乘

performance - 为什么 Lo-Dash _.each 比 Boiler.js _.each 和 Underscore.js _.each 快?

python - 查找多个数组具有相同值的索引的快速算法

r - 哪个 R 实现提供最快的 JSD 矩阵计算?

c - x86-64 程序集 "cmovge"到 C 代码