1. 程式人生 > >[儲存器] 簡述影響 Cache 命中率的因素

[儲存器] 簡述影響 Cache 命中率的因素

簡述影響 Cache 命中率的因素

摘要: 儲存器是計算機的核心部件之一。由於 CPU 和主存在速度上的存在著巨大差 異 現代計算機都在 CPU 和主存之間設定一個高速、 小容量的緩衝儲存器 cache。 Cache 最重要的技術指標是它的命中率。

本文簡單討論了影響 Cache 命中率的幾 個因素。

關鍵字:cache 容量塊大小替換演算法對映方式。

一、引言 在計算機技術發展過程中,主儲存器存取速度一直比中央處理器操作速度慢 得多 使中央處理器的高速處理能力不能充分發揮整個計算機系統的工作效率 受到影響。有很多方法可用來緩和中央處理器和主儲存器之間速度不匹配的矛 盾

如採用多個通用暫存器、多儲存體交叉存取等在儲存層次上採用高速緩衝 儲存器也是常用的方法之一。很多大、中型計算機以及新近的一些小型機、微型 機也都採用高速緩衝儲存器。 高速緩衝儲存器的容量一般只有主儲存器的幾百分之一但它的存取速度能 與中央處理器相匹配。 根據程式區域性性原理正在使用的主儲存器某一單元鄰近 的那些單元將被用到的可能性很大。因而當中央處理器存取主儲存器某一單元 時 計算機硬體就自動地將包括該單元在內的那一組單元內容調入高速緩衝儲存 器 中央處理器即將存取的主儲存器單元很可能就在剛剛調入到高速緩衝儲存器 的那一組單元內。於是中央處理器就可以直接對高速緩衝儲存器進行存取。在 整個處理過程中
 如果中央處理器絕大多數存取主儲存器的操作能為存取高速緩 衝儲存器所代替 計算機系統處理速度就能顯著提高。 高速緩衝儲存器最重要的 技術指標是它的命中率。

二、簡述影響 cache 命中率的因素

1、Cache 容量對命中率的影響 Cache 的命中率隨它的容量的增加而提高它們之間的關係曲線如圖所示。在 Cache 容 量比較小的時候命中率提高得非常快但根據邊際效應遞減原理隨著 Cache 容量的增加 命中率提高的速度逐漸降低。當 Cache 的容量增加到無窮大時命中率可望達到 100%但 是這在實際是做不到的。 在一般情況下圖中的關係曲線可以近似地表示為 H=1-S-0.5。因此

當 Cache 的容量 達到一定值之後再增加 Cache 容量命中率的提高很少。 Cache 命中率 H 與容量 S 的關係

2、Cache 塊大小對命中率的影響 當 Cache 的容量一定時 在採用組相聯映象和變換方式的 Cache 中 塊的大小對命中率 的影響非常敏感。我們可以從下面的 Cache 映象邏輯表示式分析: 設 Cache 的總量為 S組數為 M組內塊數為 N塊大小為 A。所以有: S = M*N*A 由上式可知在 Cache 的容量 S 和 Cache 組內塊數 N(也可換成是組數 M)固定不變時 Cache 塊大小與組數成反比。 因此當 Cache 的塊容量很小組的數目就多主存中的某一塊可以映象到 Cache 中的 塊數就少所以此時Cache 的命中率低。 隨著塊大小的增加 由於程式的空間區域性性起主要作用 同一塊中資料的利用率比較高。 因此Cache 的命中率開始升高。但如果塊變得過大的話會減少裝入 Cache 的總行數 而且也會使得離所訪問的位置較遠的塊被再次使用的概率變小。因此這種增加趨勢在某 一個“最佳塊大小”處使 Cache 命中率達到最大值。在這一點以後命中率隨著塊大小的 增加反而減小。因為實際上當塊的容量變得比較大時(此時還是在組相聯映象中並沒有 蛻變成全相聯映象)進入 Cache 中的許多資料可能根本用不上。而且隨著塊大小的增 加程式時間區域性性的作用就會逐漸減弱。最後當塊大小等於整個 Cache 的容量時(此 時主存塊應該是按成組的方式被調入 Cache)命中率將趨近於零。 所以根據 Cache 塊的容量由小到大的變化

     (1) 對於給定的 Cache 容量當塊大小增加時命中率開始時處於上升趨勢後來反而 會下降。

     (2) Cache 容量越大會使命中率達到最高的拐點的塊大小增大。 在這裡 導致命中率先上升後下降的原因在於增加塊大小產生雙重作用。 一方面會減少 強制性失效因為程式區域性性原理增加塊大小增加了利用空間區域性性的機會;另一方面 在容量一定情況下 增加塊大小會減少總的塊數目 會增加衝突失效 在 Cache 容量較小時 還可能增加容量失效。剛開始增加塊大小時由於塊大小還不是很大上述第一種作用超過 第二種作用使命中率上升。當塊大小增加到一定程度時第二種作用會超過第一種作用 使命中率下降。 綜上所述塊的大小對 Cache 命中率的影響是顯而易見的;而 Cache 命中率對整個 Cache 儲存系統的存取效率的影響又是至關重要的。所以對於系統體系結構的設計人員 甚至是軟體開發人員來說關於塊大小的最佳選擇都是值得研究的。

3、Cache 中與主存對映方式對命中率的影響

     3-1.全相聯方式 地址映象規則:主存的任意一塊可以映象到 Cache 中的任意一塊 (1) 主存與快取分成相同大小的資料塊。 (2) 主存的某一資料塊可以裝入快取的任意一塊空間中。 全相聯方式的對應關係如圖所示。如果 Cache 的塊數為 Cb主存的塊數為 Mb則映象關係 共有 Cb×Mb 種。 應用全相聯的方式命中率比較高Cache 儲存空間利用率高。但是訪問相關儲存器時每次 都要與全部內容比較速度低成本高因而應用少。

     3-2.直接相聯方式 地址映象規則: 主儲存器中一塊只能映象到 Cache 的一個特定的塊中。 (1) 主存與快取分成相同大小的資料塊。 (2) 主存容量應是快取容量的整數倍將主存空間按快取的容量分成區主存中每 一區的塊數與快取的總塊數相等。 (3) 主存中某區的一塊存入快取時只能存入快取中塊號相同的位置。 圖示出了直接相聯映象規則。 可見主存中各區內相同塊號的資料塊都可以分別調入 快取中塊號相同的地址中但同時只能有一個區的塊存入快取。由於主、快取塊號相同因 此目錄登記時只記錄調入塊的區號即可。 應用直接相聯的方式地址映象方式簡單資料訪問時只需檢查區號是否相等即可因 而可以得到比較快的訪問速度硬體裝置簡單。 但是使得替換操作頻繁命中率比較低。

      3-3.組相聯映象方式 組相聯的映象規則: (1) 主存和 Cache 按同樣大小劃分成塊。 (2) 主存和 Cache 按同樣大小劃分成組。 (3) 主存容量是快取容量的整數倍將主存空間按緩衝區的大小分成區主存 中每一區的組數與快取的組數相同。 (4) 當主存的資料調入快取時主存與快取的組號應相等也就是各區中的某 一塊只能存入快取的同組號的空間內但組內各塊地址之間則可以任意存放 即 從主存的組到 Cache 的組之間採用直接映象方式; 在兩個對應的組內部採用全相聯 映象方式。 應用組相聯的方式塊的衝突概率比較低塊的利用率大幅度提高塊失效率明顯降低。 但是實現難度和造價要比直接映象方式高。

4、Cache 的替換演算法對命中率的影響 當新的主存塊需要調入 Cache 並且它的可用空間位置又被佔滿時需要替換掉 Cache 的資料這就產生了替換策略(演算法)問題。根據程式區域性性規律可知:程式在執行中總 是頻繁地使用那些最近被使用過的指令和資料。這就提供了替換策略的理論依據。 替換演算法目標就是使 Cache 獲得最高的命中率。Cache 替換演算法是影響代理快取系統性 能的一個重要因素一個好的 Cache 替換演算法可以產生較高的命中率。

常用演算法如下:

(1)隨機法(RAND 法) 隨機替換演算法就是用隨機數發生器產生一個要替換的塊號 將該塊替換出去 此演算法簡 單、易於實現而且它不考慮 Cache 塊過去、現在及將來的使用情況但是沒有利用上層存 儲器使用的“歷史資訊”、沒有根據訪存的區域性性原理故不能提高 Cache 的命中率命中 率較低。

(2)先進先出法(FIFO 法) 先進先出(First-In-First-OutFIFO)演算法。就是將最先進入 Cache 的資訊塊替換出 去。FIFO 演算法按調入 Cache 的先後決定淘汰的順序選擇最早調入 Cache 的字塊進行替換 它不需要記錄各字塊的使用情況比較容易實現系統開銷小其缺點是可能會把一些需要 經常使用的程式塊(如迴圈程式)也作為最早進入 Cache 的塊替換掉而且沒有根據訪存的 區域性性原理故不能提高 Cache 的命中率。因為最早調入的資訊可能以後還要用到或者經 常要用到如迴圈程式。此法簡單、方便利用了主存的“歷史資訊” 但並不能說最先 進入的就不經常使用其缺點是不能正確反映程式區域性性原理命中率不高可能出現一種 異常現象。

(3)近期最少使用法(LRU 法) 近期最少使用 (Least Recently Used LRU) 演算法。 這種方法是將近期最少使用的 Cache 中的資訊塊替換出去。 該演算法較先進先出演算法要好一些。 但此法也不能保證過去不常用將來 也不常用。 LRU 法是依據各塊使用的情況總是選擇那個最近最少使用的塊被替換。這種方法雖然 比較好地反映了程式區域性性規律但是這種替換方法需要隨時記錄 Cache 中各塊的使用情 況以便確定哪個塊是近期最少使用的塊。LRU 演算法相對合理但實現起來比較複雜系統 開銷較大。 通常需要對每一塊設定一個稱為計數器的硬體或軟體模組用以記錄其被使用的 情況。

結論: 在 Cache 容量較小的情況下隨機策略相對較好而隨著 Cache 容量的增加最近最少 使用(LRU)和先進先出(FIFO)策略的效果較好。所以一般的計算機預設的採用 LRU 替換策 略。 由於主存中的塊比 Cache 中的要多 所以當要從主存調入一個塊到 Cache 中時 會出現 該快所映像到的一組 Cache 塊已被佔用的情況。這是需要強制其中的一塊移出 Cache以接 納新的 Cache 塊。這就需要替換策略選擇替換的塊。 替換策略主要是在對 Cache 塊進行淘汰時 如何選擇要替換的塊的策略。 目前主要又三 種替換策略:最近最少使用(LRU)策略、先進先出(FIFO)策略、隨機(RANDOM)策略。這三種 替換策略各有優劣。 好的替換策略會將使用率高的 Cache 塊更長時間的駐留在 Cache 中 從 而降低 Cache 失效率提高 Cache 效能。