2016-03-01 63 views
1

在x86/x64上,非臨時存儲指令(如MOVNTIMOVNTPS)會比「常規」存儲庫產生更弱的內存排序保證。我知道共享內存時必須使用圍欄(例如SFENCE),而這些內存將被寫入非時間跨線程。但是,線程本地內存是否需要fence指令?如果我通過MOVNTPS寫入某個位置,寫入是否保證在沒有任何fence指令的情況下對同一線程中的後續指令可見?x86非時序指令:線程本地數據是否需要屏蔽?

+0

單線程**總是**按程序順序觀察它自己的*動作。亂序CPU的基本規則是它們總是表現得好像你的代碼按程序順序運行。 (唯一的例外是當架構有其他規則時:例如IA-64是一個顯式並行的實驗,每個VLIW指令塊並行執行,所以你可以用'{a = b,b = a} '在同一塊指令或其他東西中,我想在一些RISC架構中的分支延遲時隙是另一個例子。) –

+0

有可能沒有ISA,其中單線程代碼需要屏蔽任何東西。核心可以輕鬆窺探他們自己的商店緩衝區。 –

回答

3

是的,他們將是可見的沒有圍欄。見8.2.2內存排序在P6和最近的處理器系列英特爾®64和IA-32架構軟件開發人員手冊卷3A:系統編程指南,第1部分它說,其中包括:

定義爲回寫可高速緩存的存儲器區域, 讀取可能會被舊的寫入重新排序到不同的位置,但 不會與較舊的寫入到同一位置。

寫入存儲器不與另一個寫重新排序,用 以下例外: - 流存儲(寫入)與非時間移動指令執行 (MOVNTI,MOVNTQ ,MOVNTDQ,MOVNTPS和MOVNTPD);