簡體   English   中英

x86 CPU有多少個內存屏障指令?

[英]How many memory barriers instructions does an x86 CPU have?

我發現x86 CPU具有以下內存屏障指令: mfencelfencesfence

x86 CPU是否僅具有這三個內存屏障指令,或者還有更多指令?

sfence (SSE1)和mfence / lfence (SSE2)是唯一以其存儲器圍牆/屏障功能命名的指令 除非您使用NT加載或存儲和/或WC內存, mfence僅需mfence即可進行內存排序。

(請注意, lfence Intel CPU的也是亂序執行的障礙,因此它可以序列rdtsc ,是幽靈緩解,防止投機性執行是有用的。在AMD,還有一個必須設置一個MSR,否則lfence nopnopnop 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-ssestd::atomic_thread_fence(std::memory_order_seq_cst);

但是無論如何,無論某些CPU的實現細節如何, mfencelock 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 (以及它們的字符串副本版本insouts )是完整的內存屏障,並且也是部分序列化的(例如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.

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