2014-12-23 32 views
2

當我們從前面的問題知道:Does it make any sense instruction LFENCE in processors x86/x86_64?什麼機制禁用LFENCE使不可能重新排序?

那我們不能用SFENCE代替MFENCE的順序一致性。並且,如果沒有這些,我們不能提供順序一致性,並且做了一些事情,並且mainaly MFENCE = SFENCE + LFENCE

LFENCE使得不可能重新排序:

SFENCE 
LFENCE 
MOV reg, [addr] 

- 至 - >

MOV reg, [addr] 
SFENCE 
LFENCE 

對於MOV [addr], regLFENCE例如重排序 - 通過機構提供>LFENCEMOV [addr], reg - 存儲緩衝器,這會重新排序Store - Loads以提高性能,並且因爲LFENCE不能阻止它。並且SFENCE禁用此機制

什麼機制禁止LFENCE使不可能的重新排序(x86沒有機制 - 無效隊列)?

而且是重新排序的SFENCEMOV reg, [addr] - >MOV reg, [addr]SFENCE可能只有在理論上或可能在現實中?如果可能的話,現實中,什麼機制,它是如何工作的?

+0

我想L/S/M FENCE是由'memory controller'實施的。柵欄用於協調系統內存和高速緩存內存。我認爲這種緩存一致性是「內存控制器」的責任。 –

+0

@Peng Zhang Cache一致性通過MOESI/MESIF cc協議自動**提供,更具體地說這些協議 - 提供獲取釋放一致性。正如我所知'L/S/MFENCE'與高速緩存一致性無關,因爲'SFENCE'會刷新與高速緩存一致性無關的Store-Buffer。在某些CPU(不是x86)中加載FENCE flush Invalidate-Queue,但是x86沒有。在互聯網上,我發現LFENCE在處理器x86中沒有任何意義,即它什麼都不做。然後,對於「SFENCE」MOV reg,[addr]' - >'MOV reg,[addr]'SFENCE'重新排序只能在理論上,而不是現實中,這是真的嗎? – Alex

回答

0

什麼機制禁用LFENCE,使不可能的重新排序(x86沒有機制 - 無效隊列)?

從英特爾手冊,卷2A,第3-464文檔的LFENCE指令:

LFENCE不執行,直到所有的指令之前已在本地完成,最遲指令開始執行,直到LFENCE完成

所以是的,您的示例重新排序明確地由LFENCE指令阻止。您的第二個示例只涉及SFENCE指令是有效的重新排序,因爲SFENCE對加載操作沒有影響。

+0

謝謝!但我並沒有聲稱'MFENCE' ='LFENCE + SFENCE',我聲稱'MFENCE' ='SFENCE + LFENCE' - 障礙的順序很重要,您可以看看我們的討論:http:// stackoverflow。com/questions/20316124/does-it-make-any-sense-instruction-in-processors-x86-x86-64#comment43665649_27608800「SFENCE + LFENCE」不能重新排序爲「LFENCE + SFENCE」,所以,'mov mov [mem],reg'不能在'SFENCE'和'3 mov reg,[mem]'在'LFENCE'前執行,無法重新排序:1 mov reg,[mem ] 2 MOV [MEM],章 SFENCE LFENCE 3 MOV REG,[MEM] 4 MOV [MEM],reg' – Alex

+0

@Alex你是絕對正確的,遺憾的錯誤。我已經刪除了我的答案的那一部分。我想更詳細地調查這一點,我會在寫完文章後發佈鏈接。 –

+0

好的,不要擔心,我也犯了同樣的錯誤,在關於鏈接的討論開始時:)也許這不是一個簡單的問題。 – Alex

相關問題