寫入配置與不寫入配置的差異:寫入未命中時的動作、流量、搭配方式比較

寫入配置與不寫入配置,是決定寫入發生快取未命中時,是否把該快取行放入快取的策略。寫入配置會先從下一層載入快取行,再於快取中寫入。不寫入配置則不載入快取行,直接把寫入送往下一層。這與決定寫入命中時何時傳到下一層的寫回、寫透(write-through)是不同的軸線,但一般會將寫入配置與寫回搭配,不寫入配置與寫透搭配。

項目寫入配置不寫入配置
寫入未命中時的動作從下一層載入整條快取行放入快取,再寫入其中不動快取,直接把寫入送往下一層
快取行的載入需要。在多核心系統中,這是為取得獨占所有權而讀取(RFO),會先使其他核心的副本失效再寫入。因此儲存未命中在記憶體匯流排上看起來就像讀取不需要。只把要寫入的資料送往下一層
常搭配的寫入方式寫回。之後對已載入快取行的寫入會命中,不需與記憶體通訊即可吸收,因此能回收最初載入的成本寫透。寫入反正都會傳到下一層,即使載入快取行也無法減少寫入的流量
與下一層之間的流量對同一行多次寫入,或寫入後又讀回資料時,流量較少每次未命中的寫入都會送往下一層。但不會產生多餘的載入
只寫入的大量資料(清除記憶體、輸出資料)只為了覆寫而先載入快取行,之後又寫回,流量約變為 2 倍。還會把有用的資料逐出快取既不載入也不污染快取,因此適合這類資料
寫入後立刻讀取快取行在快取中,因此會命中快取行不在快取中,因此會未命中而重新載入
實作上的技巧對只寫入的資料,使用不經過快取、把寫入集中後直接送往主記憶體的非暫存儲存(串流儲存)。部分 ISA 也有不讀取舊內容、直接將整條快取行清為零的指令以寫入緩衝區隱藏寫入的延遲。緩衝區也常把對同一行的多次寫入合併成一次傳輸
使用場合在寫回快取中很常見。CPU 的 L1~L3 快取大多是寫回方式在寫透快取中很常見。例如背後有寫回 L2 的小型 L1 快取,或簡單的嵌入式處理器

數值為具代表性的大致參考值,會因世代或產品而異。

適用於什麼情況

寫入配置
寫入的資料很快又會被讀寫時。適合像更新陣列元素的迴圈這類具有時間局部性的寫入。
不寫入配置
要大量寫入一次寫入後暫時不會讀回的資料時。可省去無謂的載入,讓快取留給有用的資料。
程式上的技巧
即使是寫入配置的快取,對只寫入的大型緩衝區使用非暫存儲存,也能避免載入。但寫入的資料不會留在快取中,若馬上讀回反而會變慢。

常見問題

寫入配置與不寫入配置的差異是什麼?

寫入未命中時,寫入配置會先將快取行載入快取,再寫入快取。不寫入配置則不載入快取行,直接寫入下一層。

寫透方式一定使用不寫入配置嗎?

不一定。寫入命中時如何傳遞(寫回或寫透),與未命中時是否載入快取行,是各自獨立的選擇。不過一般而言,寫透方式會與不寫入配置搭配,寫回方式會與寫入配置搭配。在寫透快取中,儲存命中時會更新快取中的副本,同時也寫入下一層;未命中時通常不載入快取行,直接送往下一層。

為什麼對只寫入的資料,寫入配置會變慢?

因為只會被覆寫的快取行,也要先從主記憶體載入。載入加上之後的寫回,使流量約變為 2 倍,還會把會重複使用的其他資料逐出快取。使用非暫存儲存就能避免這次載入。

理解度檢測

寫入時發生快取未命中,不載入該快取行而直接寫入下一層階層的方式為下列何者?

  1. A寫入配置(write-allocate)
  2. B寫回(write-back)
  3. C不寫入配置(no-write-allocate)
查看答案與解析

正確答案:C. 不寫入配置(no-write-allocate)

寫入未命中時不載入快取行、直接寫入下一層階層的方式是不寫入配置,多與直寫方式搭配使用。對於寫過一次就不會再讀回的資料,可以省去多餘的載入。寫入配置則相反,是先載入快取行再寫入的方式,在寫入的資料馬上又會被使用的情況下有利,因此多與寫回方式搭配使用。寫回是決定寫入命中時如何處理的方式,與未命中時是否載入屬於不同的軸線。

寫出一次寫入後暫時不會再讀回的大量資料時,使用不經過快取的儲存(非時間性儲存,non-temporal store)的主要優點為下列何者?

  1. A寫入的資料會長時間留在快取中,之後讀取時會變快
  2. B不會讓不重複使用的資料佔滿快取
  3. C寫入順序不再受保證,因此更容易發現程式的錯誤
查看答案與解析

正確答案:B. 不會讓不重複使用的資料佔滿快取

一般的寫入會因寫入配置而先從主記憶體載入快取行再寫入,所以即使是只寫入的資料也會產生載入的傳輸,並把其他會重複使用的資料逐出。非時間性儲存會將寫入集中、直接送往主記憶體,不污染快取,也省去不必要的載入。寫入的資料不會留在快取中,因此若立刻讀回反而會變慢。順序處理方式的改變是副作用,不是優點。

在對同一條快取行多次寫入的處理中,寫回方式比直寫方式更有利的主要理由為下列何者?

  1. A因為寫入在快取內完成,逐出時只要對主記憶體寫入一次即可
  2. B因為每次寫入主記憶體也會是最新的,所以逐出時不需要處理
  3. C因為快取與主記憶體的內容始終一致,所以不需要一致性管理
查看答案與解析

正確答案:A. 因為寫入在快取內完成,逐出時只要對主記憶體寫入一次即可

在寫回方式中,對同一條快取行的多次寫入只在快取內完成,逐出時只需將髒的快取行寫回一次。因此能大幅減少對主記憶體的傳輸量與耗電。每次寫入時主記憶體也保持最新是直寫方式的性質,對同一條快取行多次寫入時,每次都會產生傳輸。快取與主記憶體始終一致也是直寫的性質,在寫回中有不一致的期間。

  1. 在快取的寫入方式中,關於寫回(write-back)方式的說明,下列何者正確?
  2. 在直寫(write-through)快取中,設置寫入緩衝器(write buffer)的主要目的為下列何者?
  3. 在寫回(write-back)快取中,附加於各快取行的髒位元(dirty bit)的作用,下列何者正確?

前往記憶體階層與效能的練習題

相關名詞的解說

寫入配置(Write-allocate)
寫入時發生快取失誤,先將該行載入快取再進行寫入的方式。多與寫回方式組合使用。不載入而直接寫到下層的方式稱為非寫入配置。
寫穿(Write-through)
寫入快取的同時,也寫入下層(主記憶體等)的方式。下層始終保持最新,但寫入的通訊量多,因此與寫入緩衝區組合使用。
快取行
快取與下層之間讀寫資料的單位。也稱為快取區塊。多數CPU為64位元組,位址的低位元表示行內的位置(位移)。
快取記憶體
設置在 CPU 附近的高速、小容量記憶體。保存常用資料,以緩和與主記憶體之間的速度差。主要由 SRAM 製成。
時間局部性
曾經存取過的資料或指令,在不久之後容易再次被存取的性質。例如在迴圈中重複使用的變數,是快取有效的原因之一。
快取一致性
在多核心 CPU 中,各核心的快取內有相同位址的資料時,維持其內容一致性的機制。當某個核心改寫時,藉由讓其他核心的舊副本失效等方式來實現。

相關的比較