繁体   English   中英

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

[英]How should application perform in 64-bit vs. 32-bit intel architectures?

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

  1. 内置为32位应用程序,运行在Intel 64位处理器(x64-64)上
  2. 内置32位应用程序,运行在Intel 32位处理器(x86)上
  3. 内置为64位应用程序。

另外,在修改/开发应用程序以使其在64位处理器上运行得更快时,我应该考虑哪些因素?

简短的回答:你可能不会注意到很多不同之处。

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

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

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

有关详细信息,请参阅Wikipedia上的x86-64

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

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

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

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

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

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

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

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

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

暂无
暂无

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

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