c - 性能比较 : 64 bit and 32 bit multiplication

标签 c performance cpu cpu-registers

<分区>

我使用的是 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/

相关文章:

c - 线程同步

c# - 存储和检索 +2000 列表项的正确方法 Sharepojnt 2007

mysql - 使用 MySql View 时出现问题 - 速度非常慢,但为什么呢?

macos - 在 OS X 上以编程方式检测当前 CPU 时钟速度?

c++ - 如何在不吞噬 CPU 的情况下进行大量处理?

c++ - 如何从进程内部确定 CPU 和内存消耗

c - 这个 realloc 使用有什么问题

c++ - c/c++ 自然语言处理库

mysql - mySQL和关系数据库:如何在应用程序级别处理分片/拆分?

c - UNIX 上的进程间通信