【问题标题】:Performance comparison: 64 bit and 32 bit multiplication [closed]性能比较:64 位和 32 位乘法 [关闭]
【发布时间】:2014-10-17 05:13:21
【问题描述】:

我正在使用 Intel(R) Core(TM) i5-4200U CPU @ 1.60GHz,我想知道为什么 64 位数字的乘法比 32 位数字的乘法慢。我在 C 中进行了一次测试,结果证明它需要两倍的时间。

我预计它需要相同的时间,因为 CPU 使用本机 64 位寄存器,并且数字的宽度无关紧要(只要它们适合 64 位寄存器)。

谁能解释一下?

【问题讨论】:

  • 您确定要编译为 64 位吗?
  • @Boann 大多数实现 x86-64 的处理器仍将具有更快的 32 位乘法。参见例如agner.org/optimize/instruction_tables.pdf 中的第 12 页,了解 32 位和 64 位 IMUL 之间的时间差异。
  • @Boann 页面错误! (这适用于旧处理器,其中乘法仅达到 32 位。不过,它仍然比 16 位乘法快)。在实现 x86-64 的处理器上尝试 64 位与 32 位 IMUL 的第 22 页。
  • 现代核心速度快得离谱。但这不是程序中的典型约束,那些快速内核必须处理非常慢的内存。有人期望当您使用 64 位乘法时移动两倍的数据,当真正的瓶颈是内存时,这当然会慢两倍。在那里,快速解释,还有更多。不显示您的代码是没有意义的,因此您可以获得准确的答案而不是猜测。
  • 更好地展示汇编代码。此外,如果有机会,现代 CPU 很可能能够并行处理两个 32 位操作,使用与单个 64 位操作相同的逻辑电路。

标签: c performance cpu cpu-registers


【解决方案1】:

x86-64 指令集中有专门的指令来表示您只想将两个 32-bit 数量相乘。在 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 位乘法慢三四倍。

【讨论】:

    【解决方案2】:

    我可以想到这里出现的问题是因为 64 位乘法。

    实际上,两个 32 位数字相乘,结果最大为 64 位。但是,如果将两个 64 位数字相乘,则乘积可能是 128 位,并且在所有情况下都将大于 64 位!

    作为 8086 微处理器中的类似示例,如果您对 8 位数字和 16 位数字执行相同的操作,您将遇到 CPU 寄存器必须将其从 AX 寄存器和 DX 寄存器存储为好吧(如果你知道汇编语言的缩写)。

    所以,我相信这可能会增加计算时间!!!我觉得这就是让你的 64 位乘法变慢的原因!

    【讨论】:

    • 猜测不是答案,也许这应该是评论。
    • AX 和 DX 是 16 位寄存器。所有 64 位乘法在结果中都产生 128 个有效位,这肯定不是正确的。 2 和 3 操作数 mul 指令丢弃高位。
    • AX 和 DX 是 16 位的,但它们在 x86_64 系统中的对应物可能有相同的情况。好像忘记说8086系统了,我举的这个例子是针对8086微处理器的!我正在添加它。谢谢!
    • @Gene- 我的回答之前也已经说过,并非所有 64 位乘法都是 128 位长,但肯定大于 64 位!
    猜你喜欢
    • 2010-11-27
    • 1970-01-01
    • 2012-09-01
    • 2012-02-15
    • 1970-01-01
    • 2012-09-19
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多