繁体   English   中英

性能 32 位与 64 位算法

[英]Performance 32 bit vs. 64 bit arithmetic

本机64 bit整数算术指令是否比它们的32 bit计数器部分慢(在具有64 bit操作系统的x86_64机器上)?

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

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

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

如果这些整数是 32 位的,那么包含十几个整数的结构的大小将是 64 位的一半。 这意味着它需要一半的字节来存储,一半的空间在缓存中,等等。

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

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

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

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

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

Linux 中实现的新x32 ABI证明了这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM