整数乘法的时间成本是否与 ARM 或 Intel 处理器上的任何二进制运算相同?

Is time cost of integer multiplication the same as any binary operation on ARM or Intel processors?

整数乘法的处理时间是否与现代 CPU 流水线(例如 Intel、ARM)上的任何整数二进制运算相同?

在Intel的汇编文档中,据说整数乘法需要1个周期,就像任何整数二进制运算一样。如果操作是流水线的,这个周期是否等于持续时间?

要考虑的周期不止这些:

  • 延迟
  • 流水线

虽然 ALU 指令的结果是瞬时的,但乘法指令必须经过 MAC(乘法累加),这通常会花费更多的周期并伴随多个周期的延迟。
通常只有一个 MAC 单元,这意味着核心不允许双重发出两个 mul 指令。

示例:ARMv5E:
smulxy(16bit): 一个周期加三个周期延迟
mul(32 位):两个周期加三个周期延迟
umull(64 位):三个周期加上四个(下半部分)和五个(上半部分)周期延迟

不,乘法比 XOR、ADD、OR、NOT 等复杂得多。虽然二进制比以 10 为基数更容易,但您仍然需要更大的加法器(不仅仅是两个操作数 ADD 或其他运算).

取位abcd

    abcd
  * 1011
 ========
    abcd
   abcd.
  0000..
+abcd...
=========

在像小学一样以 10 为基数的情况下,你每次都必须乘法,你仍然在这里乘法,但只乘以 1 或零,所以你要么复制并移动第一个操作数,要么复制并移动零。它变得非常大,加法是级联的。在维基百科上查找异或门并查看完整的加法器或只是 google 它。您有一个单列加法器,用于简单的两个操作数加法,具有三个输入和两个输出,但一位的进位是另一位的进位。即使单个晶体管反转 (NOT) 需要非零时间,也没有任何逻辑是瞬时的。你可以开始考虑有多少门排列只是为了使一个 32 位两个操作数加法,然后考虑一个 32 位乘法,其中每个加法器是 32 个操作数位和一些进位位,然后所有这些都是级联。芯片面积和结算时间几乎成倍增加,然后你开始担心你能不能满足时序(你能不能在desired/designed时钟速度内结算结果的msbit)。

所以你会看到优化包括多个管道阶段,而不是 32 个时钟来执行 32 位乘法,但可能不是一个时钟,也可能是两个或四个。有十几级深管道,虽然你可以把它埋在那里,但仍然符合每条指令平均一个时钟的广告。

Intel、ARM等1个周期的东西是假象,数学运算本身可能需要那么长时间,但指令的执行需要几到几把,而你的管道深度可能是几到十几个或者更多。如今,尝试计算周期的用途有限。喂养管道和处理内存操作往往会主导性能,而不是 pipe/instructions 本身在精心制作的核心 sim 之外。

对于 cortex-ms,这可能不是您要问的,但却是我们日常生活的重要组成部分,您在文档中看到,芯片供应商可以选择更大更快的乘法或更慢更小的乘法这有助于整体芯片尺寸和性能。 (我不经常检查 cortex-a 文档,因为我不经常使用它们)编译核心时的编译时间选项,有很多编译时间选项(这就是为什么对于任何 arm core cortex-m 或 cortex -a) 例如,您不能比较来自不同供应商或供应商内的芯片系列的两个 cortex-m4,因为它们的编译方式可能不同并且 behave/perform 不同(当然,它们仍然以相同的功能方式执行启用的指令).

所以不,你不能假设任何指令的“执行时间”或“循环时间”,特别是像乘法和除法这样的指令以及任何浮点数都不能假设为单周期。是的,就像宣传的所有其他指令一样,一个周期是基于流水线效应,没有一条指令需要一个周期开始到完成,并且根据设计的流水线深度,乘法和除法可能需要一个以上的时钟,但被流水线隐藏每条指令仍然平均一个时钟。

请注意,这个问题“过于宽泛”,因为过去和现在有许多 Intel 和 ARM 实现。并且芯片实现细节通常不可用或不受 NDA 保护,如果有的话,你所拥有的只是 public 可以隐藏现实的文件。