2014-09-13 97 views
12

某處,有一次我讀了關於記憶柵欄(障礙)的內容。據說內存圍欄導致幾個CPU內核之間的高速緩存同步。內存防護是否會減慢所有CPU內核速度?

所以我的問題是:

  1. 怎樣的OS(或CPU本身)知道哪些核心需要同步?

  2. 是否同步所有CPU內核的緩存?

  3. 如果答案(2)是「是」,並假設同步操作不便宜,不使用內存柵欄未使用我的應用內核慢下來?例如,如果我有一個在我的8核CPU上運行的單線程應用程序,它是否會減慢CPU的所有其他7個核心,因爲一些緩存行必須與所有這些核心同步?

  4. 高於一無所知的問題和圍欄的工作完全不同?

+1

操作系統不涉及這個,它是一個處理器細節。操作系統只是需要處理對圍牆需求的另一大塊軟件,在其線程調度程序中必然如此。 – 2014-09-13 10:54:30

+0

柵欄實際上不同步緩存,它們同步程序流。 – Leeor 2014-09-17 14:07:27

回答

8
  1. 操作系統並不需要知道,每個CPU核心做什麼它說:用的存儲柵欄每個核心擁有之前或之後做一些操作,而這一切。核心不與「其他核心」同步,它是相對於自身同步內存訪問。
  2. 在一個核心圍欄並不意味着其他核心與它同步的,所以通常你將有兩個(或更多)防護層:在一個作家,一個在閱讀器。在一個內核上執行的防火牆不需要影響任何其他內核。當然,通常不能保證這一點,只是希望理智的體系結構不會不當地串行化多核執行。
+0

我明白了,謝謝。我很困惑那個'sync cache'的東西。思想內存柵欄意味着所有內核都會被通知某些緩存行必須失效。 – GreenScape 2014-09-13 12:54:29

1

如果您有八個內核,並且每個內核都在做不同的事情,那麼這些內核不會訪問相同的內存,並且不會在緩存行中擁有相同的內存。

如果核心#1使用的存儲柵欄,但核心#1訪問,那麼其他核心將無法在所有的減緩沒有其他內核訪問的內存。但是,如果內核#1寫入位置X,使用內存圍欄,則內核#2嘗試讀取相同的位置X,內存圍欄將確保內核#2丟棄位置X的值(如果它處於緩存,並從RAM中讀取數據,獲得與#1核心寫入的數據相同的數據。這當然需要時間,但這就是那裏的記憶柵欄。

(而不是從RAM讀取,如果核心共享緩存部分,則數據將被從緩存中讀取。)

5

一般來說,內存圍欄用於訂購當地操作。就拿這個僞彙編代碼:

load A 
load B 

很多CPU的不保證B是後確實裝,B可能是在被加載到緩存早前因其它一些內存負載的高速緩存行。如果您引入柵欄,

load A 
readFence 
load B 

您有保證B在A之後從內存加載。如果B在緩存中但比A舊,它將被重新加載。

設有專賣店的情況也是一樣的相反。隨着

store A 
store B 

某些CPU可能決定寫B到存儲他們寫A.再次之前,可能需要在兩個指令之間的籬笆執行操作的順序。是否需要內存圍欄總是取決於體系結構。


通常,使用內存柵欄成對:

  • 如果一個線程想要發佈的對象,首要的是製造對象,然後將其寫入指針之前執行寫柵欄該對象進入公衆所知的位置。

  • 想要接收對象的線程從公開的內存位置讀取指針,然後執行讀取柵欄以確保基於該指針的所有進一步讀取實際上爲發佈線程預期的值。

如果缺少任何圍欄,讀取器可能會在初始化之前讀取該對象的一個​​或多個數據成員的值。瘋狂隨之而來。

+0

您尚未解決問題。爲什麼這是最高的投票答案? – 2014-09-13 16:39:49

+0

嗯,我不能告訴你。但我的確是間接地解決了這個問題:對OP的誤解似乎是記憶柵欄是某種全球性的操作。那就是爲什麼我詳細說明了內存隔離的實際工作原理以及爲什麼他們純粹是本地操作。我還展示瞭如何使用一對這些本地操作來實現全局數據一致性。沒有直接的答案,這是真的,但我希望有用的。 – cmaster 2014-09-13 19:04:14