在大多数现代64位处理器上,`mulq`的速度是否取决于操作数?

Mat*_*att 5 cpu assembly x86-64 intel

在大多数现代64位处理器(例如Intel Core 2 Duo或Intel i7系列)上,x86_64命令mulq及其变体的速度是否取决于操作数?例如,乘法11 * 13会比11111111 * 13131313?或者它总是花费最坏情况的时间?

Uns*_*ned 6

TL; DR:否.恒定长度整数数学运算(禁止除法,非线性)消耗恒定数量的周期,无论操作数的数值如何.

mulq 需要两个QWORD参数.

这些值以little-endian二进制格式(由x86架构使用)表示如下:

1011000000000000000000000000000000000000000000000000000000000000 =       13
1000110001111010000100110000000000000000000000000000000000000000 = 13131313
Run Code Online (Sandbox Code Playgroud)

处理器将这两者视为相同的"大小",因为它们都是64位值.

因此,无论操作数的实际数值如何,循环计数应始终相同.

更多信息:

有概念领先零期待领先零检测[ 1 ] [ 2 ]可使用的,以加快浮点运算(LZA/LZD).

然而,据我所知,没有主流处理器采用这些方法中的任何一种来进行整数运算.这很可能是由于大多数整数运算的简单性(在这种情况下是乘法).LZA/LZD的开销可能根本不值得,因为简单的整数数学电路可以在更短的时间内完成全部乘法.

  • @Matt - 您可能是指http://www.zsearch.ibm.com/arl/publications/papers/arithlza.PDF或http://www.fdi.ucm.es/profesor/中所述的LZA/LZD. mozos/AEC/lza.pdf AFAIK,在整数数学的主流处理器中没有这样的等价物. (3认同)

Oli*_*rth 2

我没有任何参考资料,但我会把钱花在延迟/吞吐量上,因为延迟/吞吐量不随操作数的值而变化。否则,安排起来将是一场噩梦。

  • 噩梦可能有点强烈。CPU 中存在各种具有可变延迟的操作(加载、整数除法、许多浮点操作、各种 CISCy 类型指令)。它是固定延迟的主要原因是因为它非常重要,因此他们将晶体管放入其中以使其快速(例如 3 个周期)。绝大多数操作数需要 3 个周期,而且预测需要 2 个周期或 1 个周期的操作数成本高昂且困难,考虑到错误预测风险的惩罚,这是不值得的。隐藏 3 个周期的延迟也很容易。 (3认同)