[英]How many memory barriers instructions does an x86 CPU have?
我發現x86 CPU具有以下內存屏障指令: mfence
, lfence
和sfence
。
x86 CPU是否僅具有這三個內存屏障指令,或者還有更多指令?
sfence
(SSE1)和mfence
/ lfence
(SSE2)是唯一以其存儲器圍牆/屏障功能命名的指令 。 除非您使用NT加載或存儲和/或WC內存, mfence
僅需mfence
即可進行內存排序。
(請注意, lfence
Intel CPU的也是亂序執行的障礙,因此它可以序列rdtsc
,是幽靈緩解,防止投機性執行是有用的。在AMD,還有一個必須設置一個MSR,否則lfence
nop
是nop
( nop
4個吞吐量)。該MSR是通過Spectre緩解微代碼更新引入的,通常由更新的內核設置。)
lock
等編指令lock add [mem], eax
是滿存儲器的障礙 。 鎖xchg的行為與mfence相同嗎? 。 (雖然可能沒有那么強的mfence
從WC內存排序NT負載: 不要鎖定指令提供弱有序訪問之間的屏障? )。 xchg [mem], reg
具有隱式lock
前綴,因此它也是一個障礙。
在我對Skylake進行的測試中 , lock
指令確實會阻止使用此代碼https://godbolt.org/g/7Q9xgz的常規商店對NT商店進行重新排序。
xchg
似乎是進行seq-cst存儲的好方法,尤其是在Intel硬件(例如Skylake)上,其中mfence
還會阻止無序執行純ALU指令 ,例如lfence
:請參閱此答案的底部 。
AMD還建議使用xchg
或其他鎖定的指令代替mfence
。 ( mfence
在AMD手冊中記錄為在AMD上序列化,因此始終會阻止OoO執行程序。)
對於沒有SSE的32位目標上的順序一致性存儲或完全屏障,編譯器通常僅出於內存屏障的效果而使用lock or [esp], 0
或其他無操作鎖定的指令。 這就是g++7.3 -O3 -m32 -mno-sse
對std::atomic_thread_fence(std::memory_order_seq_cst);
。
但是無論如何,無論某些CPU的實現細節如何, mfence
或lock
insns都沒有在架構上定義為在Intel上進行序列化 。
諸如cpuid
類的完整序列化指令也是完整的內存屏障 ,耗盡了存儲緩沖區並刷新了管道。 鎖xchg的行為與mfence相同嗎? 引用了英特爾手冊中的相關報價。
在Intel處理器上,以下是架構上的序列化說明(來自: https : //xem.github.io/minix86/manual/intel-x86-and-64-manual-vol3/o_fe12b1e2a880e0ce-273.html ):
特權序列化指令 -INVD,INVEPT,INVLPG,INVVPID,LGDT,LIDT,LLDT,LTR,MOV到控制寄存器,MOV(到調試寄存器),WBINVD和WRMSR。
例外: MOV CR8
未序列化。 IA32_TSC_DEADLINE MSR的WRMSR
(MSR索引6E0H)和X2APIC MSR(MSR索引802H至83FH)未序列化。
非特權序列化指令 -CPUID,IRET 1和RSM
在AMD處理器上,以下是架構上的序列化說明:
特權序列化指令 -INVD,INVLPG,LGDT,LIDT,LLDT,LTR,MOV到控制寄存器,MOV(到調試寄存器),WBINVD,WRMSR和SWAPGS。
非特權序列化指令 -MFENCE,CPUID,IRET和RSM
英特爾處理器上的“ [完全]序列化指令”一詞與AMD處理器具有相同的含義,只是有一個區別:只有在AMD上, MFENCE
才針對后續指令對CLFLUSH
(而非CLFLUSHOPT
)的高速緩存行刷新操作進行排序。處理器。
in
/ out
(以及它們的字符串副本版本ins
和outs
)是完整的內存屏障,並且也是部分序列化的(例如lfence
)。 文檔說他們將下一條指令的執行延遲到I / O事務的“數據階段”之后。
腳注:
(1)根據BJ137(桑迪橋(Sandy Bridge)),HSD152(Haswell),BDM103(Broadwell):
問題:通過從嵌套任務返回而導致任務切換的IRET指令不會序列化處理器(與軟件開發人員手冊第3卷的標題為“序列化指令”的部分相反)。
含義:在任務切換過程中依賴IRET序列化屬性的軟件可能無法正常運行。 英特爾尚未觀察到這種錯誤,不會影響任何市售軟件的運行。
解決方法:未確定。 如果需要序列化,軟件可以在IRET指令之前立即執行MFENCE指令。
沒錯,x86 CPU上僅有的三個內存屏障功能是:
LFENCE
SFENCE
MFENCE
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.