【问题标题】:How do modern processors carry out integer arithmetic operations?现代处理器如何进行整数算术运算?
【发布时间】:2017-12-27 12:43:21
【问题描述】:

This维基百科页面提到了不同数学运算的计算复杂性,包括加法、减法、乘法和除法。我想重点关注这四个。

首先,每个提到的操作都将其复杂性指定为位数的函数。这是否意味着在真实硬件上添加任意两个int64_ts 将花费相同的时间?

这是一个重要方面,因为它可以让攻击者获得一些信息,例如纯粹观察加密/解密方的加密密钥。

添加两个int32_ts 会比添加两个int64_ts 短两倍吗?

此外,为乘法和除法运算指定了多种算法。其中哪些用于现实生活中的处理器?我们知道渐近复杂度,但也有常数,这很重要。

IMUL 指令的英特尔软件开发人员手册没有提及实际使用的算法,只是说明:

TMP_XP ← DEST ∗ SRC

一开始,整个问题都与 x86_64 架构有关,但如果有任何其他架构(ARM、Aarch64、POWER)使用与 x86 不同的技术,我会很感兴趣。

【问题讨论】:

标签: algorithm architecture cpu-architecture integer-arithmetic


【解决方案1】:

这是否意味着在真实硬件上添加任意两个int64_ts 将花费相同的时间?

如果 CPU 有一个 64 位宽的ALU,是的。

我之所以这么说是因为目前仍在设计具有 32 位或更小 ALU 的“现代”处理器,主要面向嵌入式市场。

这将允许攻击者获得一些信息,例如纯粹观察加密/解密方的加密密钥。

我不确定基于时间的侧信道攻击是否会像您问题的前提那样起作用。如果给定处理器上的 64 位数学运算与该处理器的真正 64 位版本相比需要多个运算,那么整个算法的所有整数数学运算都将减慢,因此攻击者所要学习的只是它们是在功能较弱的处理器上运行它。

由于指令执行率而导致侧通道泄漏的地方是你有 if/else 分支,并且一个分支比另一个分支花费更长的时间,因此从统计学上来说,攻击者可以探测以确定哪些输入导致执行更多 @ 987654326@ 子句而不是 else 子句,从而收集有关密钥或其他内容的一些信息。

添加两个int32_ts 会比添加两个int64_ts 短两倍吗?

不一定。 64 位处理器可能会同时运行这两个添加。

如果您要问这是否会在 32 位处理器上发生,那么答案是“可能会”,但实际上,您需要在处理器数据手册中查找这些内容。这将为您提供每条指令的时间信息。

您的问题指定了四种不同的架构,您至少缺少一个关键架构(32 位 x86,仍然存在),并且您还缺少其他几个可能的架构。 (例如MIPS。)我不准备阅读所有可能的处理器手册并为您查找。

IMUL 指令的英特尔软件开发人员手册没有提及实际使用的算法

不,但它应该以时钟周期数给出计时信息。

可能不会这么简单的说,因为pipeliningcaching等也参与其中。

如果任何其他架构(ARM、Aarch64、POWER)使用一些不同于 x86 的技术,我会很感兴趣。

当然。这方面没有硬性规定。

例如,像 ARM 这样的 RISC 处理器往往需要至少 4 条指令来执行诸如乘法之类的任何事情,因为它们需要一个读取-计算-存储周期,因为所有数学运算都必须在处理器的寄存器中进行。 (读取操作数 1,读取操作数 2,相乘,存储产品。)

对比一个通常具有内存寻址模式的 CISC 处理器,其中一条乘法指令可以编码为“将内存位置 A 与内存位置 B 相乘并存储在内存位置 C 中”。操作数仍然要加载到 CPU 中并相乘,结果仍然要存储,但它看起来像一条指令。

CISC 模型还掩盖了诸如 DRAM 读取延迟、缓存时序问题等,RISC 模型更加明确。

曾几何时,处理器非常简单,您可以轻松回答这样的问题,但我们已经过了几十年。

【讨论】:

    【解决方案2】:

    这是否意味着在真实硬件上添加任意两个 int64_ts 将花费相同的时间?

    是的,ALU 将使用相同数量的时钟周期来添加数字。现代处理器有很多个门可以解决这个问题,因此可以使用非常复杂的电路(例如spanning tree adders)在单个时钟周期内执行多个此类操作。

    添加两个 int32_ts 会比添加两个 int64_ts 的时间短两倍吗?

    这取决于,例如 x64 SIMD 操作允许在单个操作中添加四个 32 位整数,同样每个时钟周期可能有多个操作。因此,如果您的代码可以向量化以使用它,您可能会发现添加四对 32 位整数将花费与 adding two pairs of 64-bit integers 相同的时间。 (整数不会是int32_t,而是使用 SIMD 矢量化类型)。如果您在 x64 中使用标量 ALU,那么我怀疑寄存器中是否有 32 位或 64 位数字会花费相同的时间,但找不到参考。

    此外,为乘法和除法运算指定了多种算法。其中哪些用于现实生活中的处理器?我们知道渐近复杂度,但也有常数,这很重要。

    处理器具有其支持的整数大小的硬件。现代台式机处理器将支持每个时钟周期的多个此类操作,因此所有复杂性都被推入比您可以动摇的更多晶体管中 - 想象一下使用classic binary multiplier,但这些转变都是并行的,然后是一个有效的加法电路,如上面一个,所以它最终在一个周期内执行所有操作。

    具有更少晶体管的架构替代了时钟周期。所需的周期数取决于数字的存储大小,因此将两个 32 位数字相除总是需要相同的周期数。

    【讨论】:

      猜你喜欢
      • 2018-12-08
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多