现代处理器如何执行整数算术运算?

时间:2017-07-21 12:45:55

标签: algorithm architecture cpu-architecture integer-arithmetic

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

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

这是一个重要的方面,因为它允许攻击者获取有关例如加密密钥来自纯粹观察加密/解密方。

添加两个int32_t的时间是否比添加两个int64_t s短两倍?

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

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

TMP_XP ← DEST ∗ SRC

整个问题最初涉及x86_64架构,但如果任何其他架构(ARM,Aarch64,POWER)使用与x86不同的技术,我会感兴趣。

2 个答案:

答案 0 :(得分:1)

  

这是否意味着在实际硬件上添加任何两个int64_t s需要相同的时间?

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

我是这样认定的,因为有现代的"仍在设计具有32位或更小ALU的处理器,主要用于嵌入式市场。

  

它允许攻击者获取有关例如加密密钥来自纯粹观察加密/解密方。

我不确定基于时间的旁道攻击是否像你问题的前提一样有效。如果给定处理器上的64位数学运算与该处理器的真正64位版本相比需要多次运算,则整个算法中的所有整数数学运算都将减慢,因此攻击者将要了解的是,他们是&#39 ;在功能较弱的处理器上运行它。

如果由于指令执行速率而导致由于指令执行率导致的旁通道泄漏,那么您有if / else分支,并且一个分支比另一个分支花费更长时间,因此从统计上来说,攻击者可以进行探测以确定哪些输入导致执行更多{ {1}}条款而不是if条款,从而收集关于密钥或其他内容的一些信息。

  

添加两个else的时间是否比添加两个int32_t s短两倍?

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

如果您想询问是否会在32位处理器上发生这种情况,那么答案是"也许是",但实际上,这是您需要在处理器中查找的内容数据手册。这将为您提供每条指令的计时信息。

您的问题指定了四种不同的体系结构,您至少缺少一个密钥拱(32位x86,仍然存在),并且您缺少其他几种可能的体系结构。 (例如MIPS。)我不准备通过所有可能的处理器手册并为您查看。

  

int64_t指令的英特尔软件开发人员手册并未提及所使用的实际算法

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

它可能不会被简单地说明,因为pipeliningcaching等也会发挥作用。

  

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

不确定。这个领域没有严格的规则。

例如,像ARM这样的RISC处理器倾向于采用至少4条指令来执行任何类似乘法的操作,因为它们需要读取 - 计算 - 存储周期,因为所有数学都必须在处理器的寄存器中进行。 (读取操作数1,读取操作数2,乘以,存储乘积。)

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

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

曾几何时,处理器很简单,你可以轻松回答这个问题,但我们已经过了几十年了。

答案 1 :(得分:1)

  

这是否意味着在实际硬件上添加任何两个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位数字将始终采用相同的周期数。