应用程序在64位与32位intel体系结构中应如何运行? 我想知道一个普通C++应用程序在下面的场景中的相对性能: 内置32位应用程序,在英特尔64位处理器(x64-64)上运行 内置32位应用程序,在英特尔32位处理器(x86)上运行 构建为64位应用程序 此外,当修改/开发应用程序以使它在64位处理器上运行更快时,我应该考虑哪些因素?性能很可能取决于您的应用程序,并且可以根据您是否使用具有64位环境的优化的库而变化很多。如果您希望提高速度,那么应该专注于改进算法,而不是考虑指令集体系结构

应用程序在64位与32位intel体系结构中应如何运行? 我想知道一个普通C++应用程序在下面的场景中的相对性能: 内置32位应用程序,在英特尔64位处理器(x64-64)上运行 内置32位应用程序,在英特尔32位处理器(x86)上运行 构建为64位应用程序 此外,当修改/开发应用程序以使它在64位处理器上运行更快时,我应该考虑哪些因素?性能很可能取决于您的应用程序,并且可以根据您是否使用具有64位环境的优化的库而变化很多。如果您希望提高速度,那么应该专注于改进算法,而不是考虑指令集体系结构,c++,32bit-64bit,intel,C++,32bit 64bit,Intel,关于准备/开发64位。。。关键是不要对类型及其各自的大小做出假设。如果需要具有特定大小的类型,请使用中定义的类型。每当您看到使用size\u t或ptrdiff\t的函数时,都应该使用typedefs而不是其他类型。简短回答:您可能不会注意到太大的差异 更详细的回答:64位x86有更多的通用寄存器,这使编译器有更多的机会将局部变量优化到寄存器中,以便更快地访问。编译器还可以采用更现代的功能,例如不必为386优化代码,并且可以假定您的CPU具有SSE之类的功能,而不是用于浮点运算的旧x87 FPU

关于准备/开发64位。。。关键是不要对类型及其各自的大小做出假设。如果需要具有特定大小的类型,请使用中定义的类型。每当您看到使用size\u t或ptrdiff\t的函数时,都应该使用typedefs而不是其他类型。

简短回答:您可能不会注意到太大的差异


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

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

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

然而,仔细的64位手动优化可以带来巨大的性能优势


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

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

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

有关详细信息,请参阅维基百科


有一件事还没有提到,64位版本的操作系统,如Windows和Linux,在64位系统上使用不同的函数调用;参数不是在堆栈上传递参数,而是(最好)在寄存器中传递,这在原则上更快。因此,软件会更快,因为函数调用开销更少。

你们知道新x86_64体系结构的多通道MC并发数据总线突发、IMC和多核功能吗?至少,如果使用64位总线和寄存器,则无论并发突发如何,memcpy都可以更快地优化(如果使用64位)。至少新的ARCH能够同时将多个内存模块中的数据预取到缓存中。还有更多…

您是否需要>4G的内存?利用大量内存确实是使用64位的主要原因。

Hmm.未经评论就被否决了。虽然这不是一个非常重要的问题,但这里可能有一些有趣的信息。+1用于提及指针长度。如果使用大指针结构,这可能会产生巨大的差异。通过指定一些编译器选项,例如/arch:SSE2…或对于gcc用户,例如
-march=core2-msse2-mfpmath=SSE
当然,可以在32位代码上启用这些选项,即使在32位构建中,您也可以获得一些编译器优化(SSE标量浮点数学等),但是你不能假设你发送二进制文件给的每个人都有一个CPU。使用amd64,您可以参考文件名EffoDesign_MemTest.pdf了解一些想法。