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

时间:2012-06-05 19:42:32

标签: assembly cpu x86-64 intel

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

3 个答案:

答案 0 :(得分:6)

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

mulq需要两个QWORD参数。

值以小端二进制格式(由x86架构使用)表示如下:

1011000000000000000000000000000000000000000000000000000000000000 =       13
1000110001111010000100110000000000000000000000000000000000000000 = 13131313

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

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

更多信息:

Leading Zero Anticipation Leading Zero Detection [1] [2] 的概念(LZA / LZD)可用于加速浮点运算。

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

答案 1 :(得分:2)

我没有任何关于hand的参考,但我会把钱放在操作数值不变的延迟/吞吐量上。否则,安排这将是一场噩梦。

答案 2 :(得分:1)

几十年来,Agner Fog一直在发布tables of instruction timings。他在2019年8月发布的表格证实了我的预期:现代笔记本电脑和台式计算机中的CPU芯片的整数倍单位时序不变。这些速度非常快,而且非常耗电。

对于智能手机等电池受限的设备,CPU设计空间大不相同。在这样的设备上,可以在具有可变定时的微码循环中实现整数乘法。

在大约2016年,托马斯·珀金(Thomas Pornin)谈到了可变延迟乘法指令给他的SSL / TLS库设计带来的“问题”:

“ ...... CPU中的整数乘法操作码可能会或可能不会在恒定时间内执行;如果不是,则使用此类操作的实现可能会表现出取决于所涉及数据的执行时间变化,从而可能泄漏机密信息。当CPU具有非恒定时间乘法操作码时,执行时间取决于一个或两个操作数的大小(以整数为单位),例如,在ARM Cortex-M3上,总操作码需要3到5个周期为了完成此操作,仅当两个操作数的数值均小于65536时,才采用“短”计数(3或4)...通常,自第一个Pentium以来,Intel x86 CPU均提供恒定时间乘法。不一定适合其他厂商,尤其是早期的VIA Nano。” 2