[在大多数现代64位处理器(例如Intel Core 2 Duo或Intel i7系列)上,x86_64命令mulq
及其变体的速度是否取决于操作数?例如,乘以11 * 13
会比11111111 * 13131313
快吗?还是总是需要最坏的情况?
我没有任何参考,但是我会把钱花在等待时间/吞吐量上,因为操作数的值是不变的。否则,这将是一场噩梦。
TL; DR:否。恒定长度的整数数学运算(除法运算是非线性的)消耗固定数量的循环,而不管操作数的数值如何。
[mulq
具有两个QWORD参数。
这些值以小尾数二进制格式(由x86架构使用)表示,如下所示:
1011000000000000000000000000000000000000000000000000000000000000 = 13
1000110001111010000100110000000000000000000000000000000000000000 = 13131313
处理器将这两者视为相同的“大小”,因为它们都是64位值。
因此,无论操作数的实际数值如何,周期计数都应该始终相同。
更多信息:
有领先零预测和领先零检测 [[1] [2](LZA / LZD)的概念,可以用来加快浮动-点操作。
但是据我所知,没有主流处理器将这两种方法用于整数算术。这很可能是由于大多数整数算术的简单性(在这种情况下为乘法)。 LZA / LZD的开销可能根本不值得,因为简单的整数数学电路无论如何都可以在更短的时间内完成完整的乘法运算。
[几十年来,Agner Fog一直在出版tables of instruction timings。他在2019年8月发布的表格证实了我的期望:现代笔记本电脑和台式计算机中的CPU芯片的整数倍单位时序不变。这些速度非常快,而且非常耗电。