2015-12-28 14 views
4

當您使用非臨時商店時,例如movntq,並且數據已經在緩存中,商店會更新緩存而不是寫入內存嗎?或者它會更新緩存行並寫出來,驅逐它?或者是什麼?如果數據已經在緩存中,非臨時存儲會發生什麼情況?

這是一個有趣的困境。假設線程A正在加載包含x和y的緩存行。線程B使用NT存儲寫入x。線程A寫入y。這裏有一個數據競賽,如果在A的負載發生時,B的存儲到x可以傳輸到內存中。如果A看到x的舊值,但是X的寫入已經發生,則稍後寫入y並最終回寫緩存行將會打斷不相關的值x。我認爲處理器以某種方式防止了這種情況的發生?我不明白如果任何人都可以使用NT商店來建立一個可靠的系統,如果它是允許的行爲。

回答

5

您描述的所有行爲都是非臨時存儲的合理實現。實際上,在現代x86 CPU上,實際的語義是對L1緩存沒有影響,但是L2(以及更高級別的緩存,如果有的話)不會驅逐緩存行來存儲非暫時性獲取結果。

因爲緩存是硬件一致的,所以沒有數據競爭。這種一致性不會因驅逐高速緩存行的決定而受到任何影響。

+0

因此,非臨時存儲不會影響緩存一致性。這很重要。如果它已經在那裏,那麼他們現在將數據保存在緩存中(這在我看來是非常明智的)。 – Eloff

+1

@Eloff - 請記住,非臨時性指令明確地不會按照相同的一致性規則來玩正規商店。因此,如果您需要通常的x86一致性規則,則需要使用顯式內存屏障(或等效的序列化指令)。也就是說,所有這些都不允許你提到的「寫入位置y clobbers x」場景。這仍然會被一致性協議阻止。 – BeeOnRope

+0

另外值得一提的是,一個NT商店到*已經在緩存中的行[強制驅逐包含它的行](https://stackoverflow.com/questions/35516878/acquire-release-semantics-with-non-顳店-ON-64/35571387#35571387)。此外,英特爾將NT商店描述爲「不一致」,因爲它們可以在與其他內核加載衝突的行填充緩衝區中存儲數據。 (他們是弱秩序的,所以這是允許的,直到他們離開核心) –

相關問題