簡體   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