应用程序应该如何在64位与32位intel架构中执行?

时间:2009-10-15 06:59:31

标签: c++ 32bit-64bit intel

我想知道以下场景中普通C ++应用程序的相对性能:

  1. 内置为32位应用程序,在Intel 64位处理器(x64-64)上运行
  2. 内置为32位应用程序,在Intel 32位处理器(x86)上运行
  3. 构建为64位应用程序。
  4. 此外,在修改/开发应用程序以使其在64位处理器上运行得更快时,我应该考虑哪些因素?

7 个答案:

答案 0 :(得分:7)

简短的回答:你可能不会发现太大的差异。

更长的答案:64位x86具有更多通用寄存器,这使编译器有更多机会将局部变量优化为寄存器以便更快地访问。编译器还可以采用更多现代功能,例如。不必为386优化代码,并且可以假设您的CPU具有SSE而不是旧的x87 FPU用于浮点数学。但指针的宽度是宽度的两倍,这对缓存来说更糟糕。

答案 1 :(得分:5)

在64位上,CPU密集型程序可能会明显加快。处理器有16个而不是8个通用寄存器,它们也是两倍宽(64而不是32位)。

SSE指令的寄存器数量也从8增加到16,这有助于多媒体应用程序或其他进行大量浮点计算的应用程序。

有关详情,请参阅维基百科上的x86-64

尚未提及的一件事是64位版本的操作系统(如Windows和Linux)在64位系统上使用不同的calling convention进行函数调用;而不是在堆栈上传递参数,参数(优选地)在寄存器中传递,原则上更快。所以软件会更快,因为函数调用开销较少。

答案 2 :(得分:3)

性能很可能取决于您的应用程序,并且可能会有很大差异,具体取决于您是否使用对64位环境进行优化的库。如果你想依靠加速,你应该专注于改进你的算法,而不是考虑指令集架构。

至于准备/开发64位......关键是不要对类型及其各自的大小做出假设。如果您需要具有特定尺寸的类型,请使用< stdint.h>中定义的类型。每当您看到使用 size_t ptrdiff_t 的函数时,您应该使用typedef而不是其他类型。

答案 3 :(得分:1)

一般情况下,您找不到仅仅支持64位操作的等效处理器,因此很难在1)和2)之间进行任何具体的比较。另一方面,构建32位和64位模式之间的差异完全取决于应用程序。 64位版本可能比32位版本略慢或略快。如果您的应用程序使用了大量临时变量,那么增加的64位模式寄存器集可以在性能上产生很大的差异。

答案 4 :(得分:1)

根据经验,我倾向于发现32位应用程序的64位重新编译通常会使事情快30%。它是一个粗略的数字,但它适用于我已移植到64位的许多应用程序。基本上它的原因如上所述。你有更多的寄存器,这是一个天赐之物,并允许更少的内存交换(这可能会被缓存,无论如何使得胜利非常小)。某些优化也可以更容易地进行。但是,你确实遇到了更大指针的问题,它会消除一些增益,更不用说由于寄存器设置较大,进行上下文切换需要使用更多内存。

64位的精心优化可以提供巨大的性能优势。

您最好的计划是重新编译为64位和配置文件。即看哪个更好。

答案 5 :(得分:1)

您对>有任何要求吗?内存4G?利用内存空间真的是64位的重要原因。

答案 6 :(得分:0)

您是否了解多通道MC并发数据总线突发,IMC以及新x86_64架构的多核功能?至少,如果64位因为使用64位总线和寄存器而不管并发突发,可以更快地优化memcpy。至少新的arch能够同时从多个内存模块预取数据到缓存中。还有更多...