性能32位与64位算术

时间:2012-01-20 22:58:00

标签: c++ c linux cpu

本机64 bit整数算术指令是否慢于32 bit计数器部分(x86_64机器上64 bit OS)?

编辑:在当前的CPU上,如Intel Core2 Duo,i5 / i7等。

3 个答案:

答案 0 :(得分:37)

这取决于确切的CPU和操作。例如,在64位Pentium IV上,64位寄存器的乘法速度要慢得多。 Core 2和更高版本的CPU从头开始设计用于64位操作。

通常,即使为64位平台编写的代码也使用32位变量,其中值将适合它们。这主要不是因为算术更快(在现代CPU上,通常不是),而是因为它使用更少的内存和内存带宽。

如果整数是32位而不是64位,那么包含十二个整数的结构的大小将是其一半。这意味着它将需要一半的字节来存储,一半的空间用于缓存,依此类推。

使用64位本机寄存器和算术,其中值可能不适合32位。但主要的性能优势来自x86_64指令集中可用的额外通用寄存器。当然,64位指针带来了所有好处。

所以真正的答案是无所谓。即使您使用x86_64模式,您也可以(并且通常会)使用32位算术,并且您可以获得更大指针和更多通用寄存器的好处。当您使用64位本机操作时,这是因为您需要64位操作,并且您知道它们比使用多个32位操作伪装更快 - 这是您唯一的其他选择。因此,32位与64位寄存器的相对性能决不应成为任何实现决策的决定因素。

答案 1 :(得分:6)

我只是偶然发现了这个问题,但我认为这里缺少一个非常重要的方面:如果你真的用类型' int'来查看汇编代码。对于索引可能会减慢编译器生成的代码。 这是因为' int'在许多64位编译器和平台(Visual Studio,GCC)上默认为32位类型,并使用指针进行地址计算(在64位操作系统上必须是64位)和' int'将导致编译器在32位和64位寄存器之间发出不必要的转换。 我刚刚在代码的一个性能非常关键的内循环中体验过这一点。从' int'切换长期'因为循环索引改进了我的算法运行时间大约10%,考虑到我当时已经使用的广泛的SSE / AVX2矢量化,这是一个巨大的收获。

答案 2 :(得分:1)

在一个主要的32位应用程序中(意味着只使用32位算法,32位指针就足够了),x86-64架构的真正好处是AMD对架构的其他“更新”:

  • 16个通用寄存器,高达x86中的8个
  • RIP相对寻址模式
  • 其他...

Linux中实现的新x32 ABI显而易见。