64位程序是否比32位版本更大更快?

phi*_*urn 78 performance 64-bit 32-bit 128-bit

我想我专注于x86,但我通常对从32位到64位的移动感兴趣.

从逻辑上讲,我可以看到常量和指针在某些情况下会更大,因此程序可能会更大.为了提高效率而在字边界上分配内存的愿望意味着分配之间会有更多的空白.

我还听说x86上的32位模式必须在上下文切换时刷新其缓存,因为可能存在重叠的4G地址空间.

那么,64位的真正好处是什么?

作为补充问题,128位会更好吗?

编辑:

我刚刚编写了我的第一个32/64位程序.它生成16字节(32b版本)或32字节(64b版本)对象的链接列表/树,并对stderr进行大量打印 - 不是一个非常有用的程序,而不是典型的,但它是我的第一个.

大小:81128(32b)v 83672(64b) - 所以差别不大

速度:17s(32b)v 24s(64b) - 在32位OS(OS-X 10.5.8)上运行

更新:

我注意到正在开发一种新的混合x32 ABI(应用程序二进制接口),它是64b但使用32b指针.对于某些测试,它导致比32b或64b更小的代码和更快的执行.

https://sites.google.com/site/x32abi/

Pau*_*l R 40

与x86相比,我通常认为x86-64上的计算密集型代码的速度提高了30%.这很可能是因为我们有16 x 64位通用寄存器和16 x SSE寄存器,而不是8 x 32位通用寄存器和8 x SSE寄存器.这是在x86-64 Linux上的英特尔ICC编译器(11.1) - 与其他编译器(例如gcc)或其他操作系统(例如Windows)的结果当然可能不同.

  • @phil:是的,主要是图像处理,大多是整数(定点),大量的SIMD代码等. (3认同)

Sum*_*uma 29

除非您需要访问32b寻址所允许的更多内存,否则其好处将很小(如果有的话).

当在64b CPU上运行时,无论您运行的是32b还是64b代码(使用相同的缓存和相同的BUS),都可以获得相同的内存接口.

虽然x64体系结构有更多的寄存器允许更容易的优化,但这通常被指针现在更大的事实所抵消,并且使用任何带指针的结构会导致更高的内存流量.我估计64b应用程序的总内存使用量增加,而32b应用程序的总内存使用量增加约15-30%.

  • 您对拟议的x32 ABI有何看法? (2认同)

Mic*_*yan 15

无论好处如何,我建议您始终为系统的默认字大小(32位或64位)编译程序,因为如果将库编译为32位二进制文​​件并在64位上提供它系统,当64位版本是默认可用时,您将强制任何想要与您的库链接的人提供他们的库(以及任何其他库依赖项)作为32位二进制文​​件.这对每个人来说都是非常麻烦的.如有疑问,请提供两个版本的库.

至于64位的实际好处......最明显的是你获得了更大的地址空间,所以如果mmap是一个文件,你可以一次解决更多的问题(并将更大的文件加载到内存中).另一个好处是,假设编译器在优化方面做得很好,许多算术运算都可以并行化(例如,将两对32位数放在两个寄存器中,并在单个加法运算中执行两次加法),并且数字计算将更快地运行.也就是说,整个64位与32位的东西根本无法帮助你渐进复杂,所以如果你想要优化你的代码,你应该看看算法而不是像这样的常数因素.

编辑:
请忽略我关于并行添加的声明.这不是由普通的add语句执行的...我对一些向量化/ SSE指令感到困惑.除了更大的地址空间之外,更准确的好处是有更多的通用寄存器,这意味着可以在CPU寄存器文件中维护更多的局部变量,这比将变量放入的更快.程序堆栈(通常意味着转出L1缓存).


小智 5

除了拥有更多的寄存器之外,64 位默认还有 SSE2。这意味着您确实可以并行执行一些计算。SSE 扩展也有其他好处。但我想主要的好处是不必检查扩展是否存在。如果是 x64,则有 SSE2 可用。...如果我没记错的话。


blo*_*ody 5

我正在编写一个国际象棋引擎,名为“傻瓜”。使用基于极小极大值的树搜索到深度 9(从某个位置)的最佳移动提取采用:

关于Win32配置:~ 17.0s;

切换到x64配置后:~ 10.3s;

这是41%的加速度!