簡體   English   中英

假設沒有非時間指令,`xchg`是否包含`mfence`?

[英]Does `xchg` encompass `mfence` assuming no non-temporal instructions?

我已經看到了這個答案這個答案 ,但在沒有非時間指令的假設下,似乎都沒有清楚明確地說明mfencexchg的等價或非等價。

xchg的Intel 指令參考提到該指令對於實現用於進程同步的信號量或類似數據結構很有用 ,並且還參考了第3A卷的第8章。 該參考文獻陳述如下。

對於P6系列處理器,鎖定操作會序列化所有未完成的加載和存儲操作(即等待它們完成)。 對於奔騰4和英特爾至強處理器,此規則也是如此,但有一個例外。 引用弱有序內存類型(例如WC內存類型)的加載操作可能無法序列化。

mfence文檔聲明如下。

對MFENCE指令之前發出的所有內存加載和存儲到內存指令執行序列化操作。 此序列化操作保證在遵循MFENCE指令的任何加載或存儲指令之前,按程序順序在MFENCE指令之前的每個加載和存儲指令都變為全局可見。 1 MFENCE指令針對所有加載和存儲指令,其他MFENCE指令,任何LFENCE和SFENCE指令以及任何序列化指令(例如CPUID指令)進行排序。 MFENCE不會序列化指令流。

如果我們忽略弱有序的內存類型, 那么xchg(暗示lock )是否涵蓋了所有mfence關於內存排序的保證?

假設你沒有寫一個設備驅動程序 (因此所有的內存都是回寫,而不是弱排序的Write-Combining),那么xchgmfence一樣強。

NT商店很好。

我確信在當前的硬件上就是這種情況,並且相當確定這是由所有未來x86 CPU的手冊中的措辭保證的。 xchg是一個非常強大的完整內存屏障。

嗯,我沒有看過預取指令重新排序。 這可能與性能有關,甚至可能與奇怪的設備驅動程序情況相關(當你可能不應該使用可緩存的內存時)。


從你的報價:

(P4 / Xeon)引用弱有序存儲器類型(例如WC存儲器類型)的加載操作可能無法序列化。

這是使xchg [mem]弱於mfence的一件事(在Pentium4上?可能還在Sandybridge家族)。

mfence 確實保證了這一點,這就是為什么Skylake必須加強它以修復錯誤。 是否加載並存儲了重新排序的唯一指令?以及您鏈接的答案鎖定xchg與mfence具有相同的行為嗎?

NT存儲由xchg / lock序列化,它只是弱序的負載,可能無法序列化。 您無法從WB內存執行弱排序的加載 movntdqa xmm, [mem] WB內存上的movntdqa xmm, [mem]仍然是強排序的(在當前的實現中,也忽略了NT提示,而不是做任何事情來減少緩存污染)。


看起來xchg在seq-cst存儲上的性能比當前CPU上的mov + mfence更好,所以你應該在普通代碼中使用它。 (您不能意外映射WC內存;正常操作系統將始終為您提供正常分配的WB內存.WC僅用於視頻RAM或其他設備內存。)


這些保證是根據英特爾微體系結構的特定系列指定的。 如果有一些常見的“基線x86”保證我們可以假設未來的Intel和AMD CPU,那將是很好的。

我假設但沒有檢查AMD的xchgmfence情況是否相同。 我確定使用xchg作為seq-cst商店沒有正確性問題,因為這是gcc以外的編譯器實際上做的事情。

暫無
暫無

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

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