[儲存器] 簡述影響 Cache 命中率的因素
簡述影響 Cache 命中率的因素
摘要: 儲存器是計算機的核心部件之一。由於 CPU 和主存在速度上的存在著巨大差 異, 現代計算機都在 CPU 和主存之間設定一個高速、 小容量的緩衝儲存器 cache。 Cache 最重要的技術指標是它的命中率。
本文簡單討論了影響 Cache 命中率的幾 個因素。
關鍵字:cache 容量,塊大小,替換演算法,對映方式。
一、引言 在計算機技術發展過程中,主儲存器存取速度一直比中央處理器操作速度慢 得多, 使中央處理器的高速處理能力不能充分發揮,整個計算機系統的工作效率 受到影響。有很多方法可用來緩和中央處理器和主儲存器之間速度不匹配的矛 盾,
二、簡述影響 cache 命中率的因素
1、Cache 容量對命中率的影響 Cache 的命中率隨它的容量的增加而提高,它們之間的關係曲線如圖所示。在 Cache 容 量比較小的時候,命中率提高得非常快,但根據邊際效應遞減原理隨著 Cache 容量的增加, 命中率提高的速度逐漸降低。當 Cache 的容量增加到無窮大時,命中率可望達到 100%,但 是這在實際是做不到的。 在一般情況下,圖中的關係曲線可以近似地表示為 H=1-S-0.5。因此,
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-Out,FIFO)演算法。就是將最先進入 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 效能。