簡體   English   中英

.NET上的x86 / x64 / ia64內存模型之間的差異

[英]Differences between x86/x64/ia64 memory models on .NET

我正在尋找關於x86 / x64 / ia64上.NET CLR / JIT使用的內存模型之間差異的參考。 我知道x86和ia64之間存在一些差異(指令重新排序,指令刪除等),但我沒有找到x86和x64之間差異的參考。

我有一個應用程序,旨在一些非常緊張的延遲數字,並且目前只能在x86上運行,也許在x64上運行(肯定不在ia64上)。 幾個我想知道我是否可以依賴x86 JIT實現的一些工件並且在x64上仍然相對安全,或者我應該編程為更寬松的ia64 JIT(這將需要更多的字段是volitile並且內存屏障插入幾個地方)。

提前感謝任何指針。

關於.NET內存模型的兩篇文章(比ECMA模型強,順便說一句):

Joe Duffy的書“Windows上的並發編程”也是有關該主題的重要信息來源。

.NET內存模型在ECMA規范ISO / IEC-23271中指定。 特別是在分區I:概念和體系結構,第12.6章“內存模型和優化”中。

此標准定義了JIT可以操作的邊界。如果您希望對架構保持中立,則應遵循此標准,而不使用x86 / x64 JIT的任何細節。

另外,x64是對x86的演進,它主要由附加指令,寄存器和一些擴展(SSE2)組成,被定義為所有x64兼容處理器的基線。 除了額外的地址空間和額外的尋址模式(指令指針相對數據訪問)之外,內存模型幾乎沒有變化。因此,對x86 JIT的優化也應該在x64上產生良好的結果。

這可能是你的水平太低了,但是如果你依賴它作為硬件非阻塞指令,那么一些較舊的AMD 64位cpus沒有CMPXCHG16B( Source )。

此外,C ++的內存模型似乎也有變化,這可能是相關的,因此如果您正在執行非常低級別的代碼,則可能需要留意。

CLR“指定”的內存模型是微軟內部持續爭論的話題(至少可以追溯到2003年 )。 作為旁注,Chris Brumme在該文章中指出x64的模型與x86相同,我認為這是用於CLR托管代碼的准確語句。

除非您的目標用戶明確包含Itanium,否則我認為僅僅包括一個回退,更慢但更簡單和安全的實現,該架構的實現就足夠了。 因此,沒有必要表明您的軟件在該平台上被破壞,只是它在較慢的回退模式下運行。 如果人們隨后想要認真使用該平台,那么您可以編寫那么寬松的模型。

請注意,x64 JIT與x86 JIT不同(因此自3.5 SP1以來非常重要),因此對一個版本的任何發布模式測試都不能代表另一個,反之亦然。 適當測試。

暫無
暫無

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

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