<分区>
我使用的是 Intel(R) Core(TM) i5-4200U CPU @ 1.60GHz,想知道为什么 64 位数字的乘法比 32 位数字的乘法慢。我用 C 语言进行了测试,结果证明它需要两倍的时间。
我预计它需要相同的时间,因为 CPU 使用 native 64 位寄存器工作,数字的宽度应该无关紧要(只要它们适合 64 位寄存器)。
谁能解释一下?
<分区>
我使用的是 Intel(R) Core(TM) i5-4200U CPU @ 1.60GHz,想知道为什么 64 位数字的乘法比 32 位数字的乘法慢。我用 C 语言进行了测试,结果证明它需要两倍的时间。
我预计它需要相同的时间,因为 CPU 使用 native 64 位寄存器工作,数字的宽度应该无关紧要(只要它们适合 64 位寄存器)。
谁能解释一下?
最佳答案
x86-64 指令集中有专门的指令表示您只想将两个32 位
量相乘。在 x86-64 程序集的特定方言中,一条指令可能看起来像 IMUL %EBX, %ECX
,而不是 64 位乘法 IMUL %RBX, %RCX
.
因此处理器知道您只想乘以 32 位数量。这种情况经常发生,以至于处理器的设计者确保内部电路得到优化,以便在这种更简单的情况下提供更快的答案,就像 3 位数字相乘比 6 位数字相乘更容易一样。在 Agner Fog 测量的时间中可以看出差异,并在他的 comprehensive assembly optimization resources 中进行了描述。 .
如果您的编译器针对较旧的 32 位 IA-32 指令集,则 32 位和 64 位乘法之间的差异更大。编译器必须仅使用 32 位乘法指令来实现 64 位乘法,使用其中的四个(如果仅计算结果的 64 个最低有效位,则为三个)。 在这种情况下,64 位乘法比 32 位乘法慢大约三到四倍。
关于c - 性能比较 : 64 bit and 32 bit multiplication,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25462430/