簡體   English   中英

性能 32 位與 64 位算法

[英]Performance 32 bit vs. 64 bit arithmetic

本機64 bit整數算術指令是否比它們的32 bit計數器部分慢(在具有64 bit操作系統的x86_64機器上)?

編輯:在當前的 CPU 上,例如 Intel Core2 Duo、i5/i7 等。

這取決於確切的 CPU 和操作。 例如,在 64 位 Pentium IV 上,64 位寄存器的乘法要慢很多。 Core 2 和更高版本的 CPU 從頭開始​​設計用於 64 位操作。

通常,即使是為 64 位平台編寫的代碼也使用 32 位變量,其中的值適合它們。 這主要不是因為算術速度更快(在現代 CPU 上,它通常不是),而是因為它使用更少的內存和內存帶寬。

如果這些整數是 32 位的,那么包含十幾個整數的結構的大小將是 64 位的一半。 這意味着它需要一半的字節來存儲,一半的空間在緩存中,等等。

在值可能不適合 32 位的情況下使用 64 位本機寄存器和算術。 但主要的性能優勢來自 x86_64 指令集中可用的額外通用寄存器。 當然,還有來自 64 位指針的所有好處。

所以真正的答案是沒關系。 即使您使用 x86_64 模式,您仍然可以(並且通常會)使用 32 位算術,並且您可以獲得更大的指針和更多通用寄存器的好處。 當您使用 64 位本機操作時,這是因為您需要 64 位操作,並且您知道它們會比使用多個 32 位操作偽造它更快——這是您唯一的其他選擇。 因此,32 位與 64 位寄存器的相對性能永遠不應成為任何實現決策的決定性因素。

我只是偶然發現了這個問題,但我認為這里缺少一個非常重要的方面:如果您真的仔細查看匯編代碼,使用類型 'int' 作為索引可能會減慢編譯器生成的代碼。 這是因為“int”在許多 64 位編譯器和平台(Visual Studio、GCC)上默認為 32 位類型,並且使用指針進行地址計算(在 64 位操作系統上必須是 64 位)和“int”將導致編譯器發出不必要的信息32 位和 64 位寄存器之間的轉換。 我剛剛在我的代碼的一個非常關鍵的性能內部循環中體驗到了這一點。 從“int”切換到“long long”作為循環索引將我的算法運行時間提高了大約 10%,考慮到我當時已經在使用的廣泛的 SSE/AVX2 矢量化,這是一個相當大的收益。

在主要 32 位應用程序中(意味着只使用 32 位算法,並且 32 位指針就足夠了),x86-64 架構的真正好處是 AMD 對該架構進行的其他“更新”:

  • 16 個通用寄存器,高於 x86 中的 8 個
  • RIP 相對尋址模式
  • 其他...

Linux 中實現的新x32 ABI證明了這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM