2012-02-10 28 views
10

x86-64指令集增加了更多寄存器和其他改進以幫助簡化可執行代碼。但是,在許多應用中,增加的指針大小是一種負擔。每個指針中額外的,未使用的字節堵塞了緩存,甚至可能導致RAM溢出。例如,GCC使用-m32標誌建立,我認爲這是原因。32位指針與x86-64 ISA:爲什麼不呢?

可以加載一個32位值並將其視爲指針。這不需要額外的指令,只需加載/計算32位並從結果地址加載即可。但是,這個技巧不會便攜,因爲平臺具有不同的內存映射。在Mac OS X上,整個地址空間的低4 GiB被保留。儘管如此,對於我寫的一個程序,在使用與真正的64位地址相比更好的性能或者使用-m32進行編譯之前,先將0x100000000L添加到32位「地址」中。

使用32位x86-64平臺有什麼根本障礙嗎?我認爲支持這樣一個嵌合體會給任何操作系統增加複雜性,任何想要最後20%的人都應該只是讓它工作,但它似乎仍然最適合各種計算密集型程序。

+0

大多數應用程序中的分析數據表明由於指針大小增加而沒有顯着的損失。 – Puppy 2012-02-10 19:09:02

+0

英特爾編譯器有['Qauto-ilp32']選項(http://software.intel.com/sites/products/documentation/hpc/compilerpro/en-us/cpp/lin/compiler_c/copts/ccpp_options/option_qauto_ilp32 .htm)「嘗試」使用32位指針 - 即使在x64模式下也是如此。 – Mysticial 2012-02-10 19:10:31

+0

@Mysticial,但更像是老式的「近」和「遠」指針,對吧?我想這個解決方案是可以的,但它並不像我指的那麼幹淨。 – Potatoswatter 2012-02-10 19:12:41

回答

10

在開發中有一個名爲「x32」的linux版本。它是x86_64和ia32之間的混合,類似於您所描述的 - 使用完整64位寄存器集時的32位地址空間。它需要一個定製的內核,binutils和gcc。

某些SPEC運行表明某些基準測試的性能提高了約30%。在https://sites.google.com/site/x32abi/

+0

這真的是一個很好的信息。我對這個問題有些不確定,因爲它的措辭可能排除了任何好的答案。但即使只有一個平臺支持嵌合體,以防萬一差異足夠大,也會改變遊戲場。 – Potatoswatter 2012-02-11 09:59:11

-4

它被稱爲「x86-32仿真」,或Windows上的WOW64(大概是其他操作系統上的其他東西),它是處理器中的硬件標誌。這裏不需要任何用戶模式的技巧。

+0

這是一個用戶可訪問的標誌嗎?所以操作系統需要保存/恢復和支持它? – Potatoswatter 2012-02-10 19:11:35

+0

啊,查看它 - http://en.wikipedia.org/wiki/WOW64。不,這只是在64位操作系統上運行標準x86代碼,即只有8個寄存器的舊ISA。和'-m32'一樣。我不認爲其他操作系統打擾給這個「功能」一個名字。 – Potatoswatter 2012-02-10 19:15:31

+0

@Patatoswatter:這與你所描述的完全不同,究竟是什麼?處理器不是通過用戶模式來實現目標,而是通過硬件實現。這總是會更快。沒有編譯器標誌可以實現這一點,它是一個硬件處理器功能。 – Puppy 2012-02-10 19:17:16

0

查看更多信息我不指望它很難在操作系統中支持這樣的模型。關於此模型中唯一需要更改的進程是頁面管理,頁面必須分配在4 GB點以下。如果內核將它們傳遞給應用程序,內核也應該從虛擬地址空間的前4個GB分配緩衝區。這同樣適用於加載和啓動應用程序的加載程序。除此之外,64位內核應該能夠處理這種無重大修改的應用程序。

編譯器支持不應該是一個大問題。這主要是生成代碼的問題,可以使用額外的CPU寄存器及其全部64位,並在需要時添加適當的REX前綴。