Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 在大多数现代64位处理器上,“mulq”的速度是否取决于操作数?_Performance_Assembly_X86 64_Cpu_Intel - Fatal编程技术网

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

Performance 在大多数现代64位处理器上,“mulq”的速度是否取决于操作数?,performance,assembly,x86-64,cpu,intel,Performance,Assembly,X86 64,Cpu,Intel,在大多数moder 64位处理器(如Intel Core 2 Duo或Intel i7系列)上,x86_64命令mulq及其变体的速度是否取决于操作数?例如,相乘11*13会比11111111*13131313快吗?或者它总是需要最坏情况下的时间吗?我手头没有任何参考资料,但我会把钱放在延迟/吞吐量上,这是操作数值不变的。否则,日程安排将是一场噩梦。TL;DR:不是。无论操作数的数值是多少,定长整数数学运算(除数,这是非线性的)消耗的周期数是恒定的。 mulq接受两个QWORD参数 这些值以小端

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

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

TL;DR:不是。无论操作数的数值是多少,定长整数数学运算(除数,这是非线性的)消耗的周期数是恒定的。

mulq
接受两个QWORD参数

这些值以小端二进制格式表示(x86体系结构使用),如下所示:

1011000000000000000000000000000000000000000000000000000000000000 =       13
1000110001111010000100110000000000000000000000000000000000000000 = 13131313
处理器将两者视为相同的“大小”,因为它们都是64位值

因此,无论操作数的实际数值是多少,循环计数都应始终相同

更多信息:

有超前零预测和超前零检测[][](LZA/LZD)的概念可用于加速浮点运算


然而,据我所知,目前还没有主流处理器将这两种方法中的任何一种用于整数运算。这很可能是由于大多数整数算术(本例中为乘法)过于简单。LZA/LZD的开销可能根本不值得,因为简单的整数数学电路可以在更短的时间内完成完整的乘法。

几十年来,Agner Fog一直在出版。他2019年8月的表格证实了我的预期:现代笔记本电脑和台式电脑的CPU芯片的整数乘法单元具有不变的定时。它们的速度非常快,而且相当耗电

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

在(大约)2016年,Thomas Pornin就可变延迟乘法指令对其SSL/TLS库设计造成的“问题”发表了以下看法:


"... CPU中的整数乘法操作码可以在固定时间内执行,也可以不执行;否则,使用此类操作的实现可能会表现出依赖于所涉及数据的执行时间变化,从而可能泄漏机密信息。。。当CPU具有非恒定时间乘法操作码时,执行时间取决于一个或两个操作数的大小(作为整数)。例如,在ARM Cortex-M3上,umull操作码需要3到5个周期才能完成,“短”计数(3或4)仅在两个操作数的数字都小于65536时才进行。。。一般来说,自第一代奔腾问世以来,Intel x86 CPU都提供恒定的时间乘法。其他供应商也不一定如此,尤其是早期的VIA Nano。”

是的,但我听说有处理器可以判断乘法是否提前完成(比如剩余位是否为
0
s)@Matt-您可能指的是LZA/LZD,如或AFAIK中所述,整数数学主流处理器中不存在此类等效物。@Matt-“AFAIK,整数数学主流处理器中不存在此类等效物。“我也编辑了我的答案。即使在现代处理器上,它实际上也具有依赖于价值的运行时。而且,HW uop调度器知道结果何时准备就绪非常有用,因此它可以设置旁路转发并调度其他uop等待该结果,以便它们已经在生成和转发结果的同一周期中命中执行单元。我想这需要一个额外的除法周期。对于负载,调度程序是乐观的,如果数据没有按预期从L1d缓存到达,实际上必须重播依赖UOP。它的速度并不取决于操作数的值。如果它是浮点乘法,我会说操作数的非规范化可能会减慢它的速度,但由于这是整数乘法,所以不适用。噩梦可能有点强烈。CPU中有各种各样的延迟可变的操作(负载、整数除法、许多浮点操作、各种CISCy类型指令)。它是固定延迟的主要原因是因为它非常重要,他们将晶体管放入其中以使其快速(如3个周期)。绝大多数操作数需要3个周期,而且由于要预测需要2个周期或1个周期的操作数成本较高且很难预测,因此考虑到预测失误的风险,这是不值得的。也很容易隐藏3个周期的延迟。