三種Cache寫入方式原理簡介
在386以上檔次的微機中,為了提高系統效率,普遍采用Cache(高速緩沖存儲器),現在的系統甚至可以擁有多級Cache。Cache實際上是位于CPU與DRAM主存儲器之間少量超高速的靜態存儲器(SRAM),通常的大小為8KB~512KB。
對Cache的工作原理可以進行如下描述:具有Cache的計算機,當CPU需要進行存儲器存取時,首先檢查所需數據是否在Cache中。如果存在,則可以直接存取其中的數據而不必插入任何等待狀態,這是最佳情況,稱為高速命中。當CPU所需信息不在Cache中時,則需切換存取主儲器,由于速度較慢,需 要插入等待,這種情況稱高速未命中。在CPU存取主存儲器的時候,按照最優化原則將存儲信息同時寫入到Cache中以保證下次可能的高速命中。因此,同一數據可能同時存儲在主存儲器和Cache中;同樣,按照優化算法,可以淘汰Cache中的一些不常使用的數據。
所以,提高高速命中率的最好方法是盡量使Cache存放CPU最近一直在使用的指令與數據,當 Cache 裝滿后,可將相對長期不用的數據刪除,提高 Cache的使用效率。為保持 Cache 中數據與主存儲器中數據的一致性,避免CPU在讀寫過程中,將Cache中的新數據遺失,造成錯誤的讀數據,確保Cache 中更新過程的數據不會因覆蓋而消失,必須將 Cache 中的數據更新及時準確地反映到主存儲器中,這是一個寫入過程,通常采用的處理方法有:直寫式、緩沖直寫式與回寫式三種。
1.直寫式系統: CPU對Cache寫入時,將數據同時寫入到主存儲器中,這樣可保證Cache中的內容與主存儲器的內容完全一致。這種方式比較直觀,而且簡單、可靠,但由于每次對Cache更新時都要對主存儲器進行寫操作,而這必須通過系統總線來完成,因此總線工作頻繁,系統運行速度就會受到影響。
2.緩沖直寫式系統:為解決直寫式系統對總線速度的影響問題,在主存儲器的數據寫入時增加緩沖器區。當要寫入主存儲器的數據被緩沖器鎖存后,CPU 便可執行下一個周期的操作,不必等待數據寫入主存儲器 。 這相對于給主存儲器增加了一個單向單次高速緩存。比如,在寫入周期之后可以緊接著一個數據已存在于Cache中的讀取周期,這樣就可避免直寫式系統造成的 操作延時。但這個緩沖器只能存儲一次寫入的數據,當連續兩次寫操作發生時,CPU仍需等待。
3.回寫式系統:以前的兩種寫入方式系統,都是在 寫Cache的同時,對主存儲器進行寫操作。實際上這不僅是對總線帶寬的占用,浪費了寶貴的執行時間,而且對于有的情況是不必要的,可以通過增加額外的標準來判斷是否有必要更新數據。回寫式系統就是通過在Cache中的每一數據塊的標志字段中加入一更新位,解決主存儲器不必要的寫操作。比如,若Cache 中的數據曾被CPU更新過但還未同時更新主存儲器,則該更新位被置1。每次CPU將一塊新內容寫入Cache時,首先,檢查Cache中該數據塊的更新 位,若更新位為0,則將數據直接寫入Cache;反之,若更新位為1,則先將 Cache 中的該項內容寫入到主存儲器中相應的位置,再將新數據寫回到Cache中。
與直寫式系統相比,回寫式系統可省下一些不必要的立即回寫操作,而在許多情況下這是很頻繁出現的。即使一個Cache被更新,若未被新的數據所取代,則 沒有必要立刻進行主存儲器的寫操作。也就是說,實際寫入主存儲器的次數,可能少于CPU實際所執行的寫入周期的次數,但回寫式系統的結構較復雜, Cache也必須用額外的容量用來存儲標志。
由于回寫系統的高效率,現代的Cache大多采取這種方式進行操作。
?
由上面的介紹可以看出,寫透(上述直寫式)和寫回(上述回寫式)有著截然不同的操作,在不同的場合,不同的內存塊使用不同的回寫策略(如果你的系統可以實現的話)要比使用一種策略要高效得多。具體一點,對于反復存取的內存塊置成寫回,而把一次寫入而很長時間以后再使用的內存置為寫透,可以大大提高 cache的效率。
第一點很容易理解,第二點就需要琢磨一下了,由于寫透的操作是,當緩存有該地址的數據時同時更新緩存和主存,當緩存沒有該地址數據直接寫主存,忽略緩存。當該地址的數據很長時間后才被使用到,那么在使用的時候該數據肯定不在cache中(被替換了),所以不如直接寫入主存來得直接;
相反,如果使用寫回操作,當cache中有該地址數據,需要更新該數據,設置dirty位,很長時間后再使用該數據或被替換的時候才將其刷進主存,這有占了茅坑不拉屎的嫌疑;而當cache沒有該地址數據時,情況更糟糕,首先需要將相應的主存數據(一個cache line)導入cache,再更新數據,設置dirty位,再等待被刷回內存,這種情況不僅占用了cache的空間,還多一次從主存中導入數據的過程,同樣占據總線,開銷很大。至于為什么要先從主存中導入數據,是因為cache往主存回寫數據時是按照一個cache line 單位來寫的,但被更新的數據可能沒有一個cache line這么多,所以為了保證數據一致性,必須先把數據導入cache,更新后再刷回來。
對于很多視頻解碼來說,幀寫入過程是一個一次性的動作,只有在下一次作為參考幀時才會被使用到,所以幀緩沖內存可以設置為寫透操作,而下一次使用它的時候很可能是作為參考幀來使用,而作為參考幀不需要反復的存取,只需一次讀操作就可以了,所以效率并不會因為不經過cache而降低。實驗證明該方法可以使mpeg4 sp解碼提高20-30%的效率。
?
?
相似的內容cache操作的小技巧還有prefetch操作,prefetch操作是將主存的數據導入cache而期間cpu不需要等待,繼續下一 條指令的執行,如果下一條指令也是總線的操作,那么就必須等待prefetch完成以后再開始。所以,在使用該指令時,在prefetch指令后面插入盡 可能大于一次緩存不命中所需要的clock數對應的指令,那么prefetch與其后面的指令可以并行執行,從而省去了等待的過程,相當于抵消緩存不命中 的損失。當然,如果插入的指令太多而cache太小,有可能prefetch的數據進入cache后又被替換掉了,所以,這需要自己去評估。
?