L1快取

L1快取

高速緩衝存儲器(Cache)簡稱快存,是為了解決CPU和主存之間速度匹配問題而設定的,由於快存技術難度和製造成本較高,計算機系統中一般採用多級快存。L1快取,即一級快取(Level 1 Cache),也簡稱L1 Cache,位於CPU核心的旁邊,是與CPU結合最為緊密的CPU快取,通常訪問只需要幾個周期,通常是幾十個KB大小。

基本介紹

  • 中文名:L1快取
  • 外文名:Level 1 Cache
  • 學科:計算機
  • 別名:一級快取
  • 目的:實現CPU快速存取
  • 領域:計算機系統
簡介,CPU快取,程式局部性原理,讀取命中率,寫操作,回寫策略,按寫分配與不按寫分配,置換策略,

簡介

一級快取(Level 1 Cache)簡稱L1 Cache,位於CPU核心的旁邊,是與CPU結合最為緊密的CPU快取,也是歷史上最早出現的CPU快取。由於一級快取的技術難度和製造成本最高,提高容量所帶來的技術難度增加和成本增加非常大,所帶來的性能提升卻不明顯,性價比很低,而且現有的一級快取的命中率已經很高,所以一級快取是所有快取中容量最小的,比二級快取要小得多。一般來說,一級快取可以分為一級數據快取(Data Cache,D-Cache)和一級指令快取(Instruction Cache,I-Cache)。二者分別用來存放數據以及對執行這些數據的指令進行即時解碼。大多數CPU的一級數據快取和一級指令快取具有相同的容量,例如AMD的Athlon XP就具有64KB的一級數據快取和64KB的一級指令快取,其一級快取就以64KB來表示,其餘的CPU的一級快取表示方法以此類推。L1快取實現的理論依據是程式局部性原理

CPU快取

在計算機系統中,CPU高速快取(英語:CPU Cache,)是用於減少處理器訪問記憶體所需平均時間的部件。在金字塔式存儲體系中它位於自頂向下的第二層,僅次於CPU暫存器。其容量遠小於記憶體,但速度卻可以接近處理器的頻率。當處理器發出記憶體訪問請求時,會先查看快取內是否有請求數據。如果存在(命中),則不經訪問記憶體直接返回該數據;如果不存在(失效),則要先把記憶體中的相應數據載入快取,再將其返回處理器。
快取之所以有效,主要是因為程式運行時對記憶體的訪問呈現局部性(Locality)特徵。這種局部性既包括空間局部性(Spatial Locality),也包括時間局部性(Temporal Locality)。有效利用這種局部性,快取可以達到極高的命中率。
在處理器看來,快取是一個透明部件。因此,程式設計師通常無法直接干預對快取的操作。但是,確實可以根據快取的特點對程式代碼實施特定最佳化,從而更好地利用快取。

程式局部性原理

早在 1968 年,Denning.P 就曾指出:程式在執行時將呈現出局部性規律,即在一較短的時間內,程式的執行僅局限於某個部分;相應地,它所訪問的存儲空間也局限於某個區域。他提出了下述幾個論點:
(1) 程式執行時,除了少部分的轉移和過程調用指令外,在大多數情況下仍是順序執行的。該論點也在後來的許多學者對高級程式設計語言(如 FORTRAN 語言、PASCAL 語言)及 C 語言規律的研究中被證實。
(2) 過程調用將會使程式的執行軌跡由一部分區域轉至另一部分區域,但經研究看出,過程調用的深度在大多數情況下都不超過 5。這就是說,程式將會在一段時間內都局限在這些過程的範圍內運行。
(3) 程式中存在許多循環結構,這些雖然只由少數指令構成,但是它們將多次執行。
(4) 程式中還包括許多對數據結構的處理,如對數組進行操作,它們往往都局限於很小的範圍內。
局限性還表現在下述兩個方面:
(1) 時間局限性。如果程式中的某條指令一旦執行,則不久以後該指令可能再次執行;如果某數據被訪問過,則不久以後該數據可能再次被訪問。產生時間局限性的典型原因是由於在程式中存在著大量的循環操作。
(2) 空間局限性。一旦程式訪問了某個存儲單元,在不久之後,其附近的存儲單元也將被訪問,即程式在一段時間內所訪問的地址,可能集中在一定的範圍之內,其典型情況便是程式的順序執行。

讀取命中率

CPU在Cache中找到有用的數據被稱為命中,當Cache中沒有CPU所需的數據時(這時稱為未命中),CPU才訪問記憶體。從理論上講,在一顆擁有2級Cache的CPU中,讀取L1 Cache的命中率為80%。也就是說CPU從L1 Cache中找到的有用數據占數據總量的80%,剩下的20%從L2 Cache讀取。在一些高端領域的CPU(像Intel的Itanium)中,我們常聽到L3 Cache,它是為讀取L2 Cache後未命中的數據設計的—種Cache。
為了保證CPU訪問時有較高的命中率Cache中的內容應該按一定的算法替換,其計數器清零過程可以把一些頻繁調用後再不需要的數據淘汰出Cache,提高Cache的利用率。快取技術的發展。

寫操作

回寫策略

為了和下級存儲(如記憶體)保持數據一致性,就必須把數據更新適時傳播下去。這種傳播通過回寫來完成。一般有兩種回寫策略:寫回(Write back)和寫通(Write through)。
寫回是指,僅當一個快取塊需要被替換回記憶體時,才將其內容寫入記憶體。如果快取命中,則總是不用更新記憶體。為了減少記憶體寫操作,快取塊通常還設有一個髒位(dirty bit),用以標識該塊在被載入之後是否發生過更新。如果一個快取塊在被置換回記憶體之前從未被寫入過,則可以免去回寫操作。寫回的優點是節省了大量的寫操作。這主要是因為,對一個數據塊內不同單元的更新僅需一次寫操作即可完成。這種記憶體頻寬上的節省進一步降低了能耗,因此頗適用於嵌入式系統。
寫通是指,每當快取接收到寫數據指令,都直接將數據寫回到記憶體。如果此數據地址也在快取中,則必須同時更新快取。由於這種設計會引發造成大量寫記憶體操作,有必要設定一個緩衝來減少硬體衝突。這個緩衝稱作寫緩衝器(Write buffer),通常不超過4個快取塊大小。不過,出於同樣的目的,寫緩衝器也可以用於寫回型快取。寫通較寫回易於實現,並且能更簡單地維持數據一致性。

按寫分配與不按寫分配

當發生寫失效時,快取可有兩種處理策略,分別稱為按寫分配(Write allocate)和不按寫分配(No-write allocate)。按寫分配是指,先如處理讀失效一樣,將所需數據讀入快取,然後再將數據寫到被讀入的單元。不按寫分配則總是直接將數據寫回記憶體。設計快取時可以使用回寫策略和分配策略的任意組合。對於不同組合,發生數據寫操作時的行為也有所不同。

置換策略

對於組相聯快取,當一個組的全部快取塊都被占滿後,如果再次發生快取失效,就必須選擇一個快取塊來替換掉。存在多種策略決定哪個塊被替換。
顯然,最理想的替換塊應當是距下一次被訪問最晚的那個。這種理想策略無法真正實現,但它為設計其他策略提供了方向。
先進先出算法(FIFO)替換掉進入組內時間最長的快取塊。最久未使用算法(LRU)則跟蹤各個快取塊的使用狀況,並根據統計比較出哪個塊已經最長時間未被訪問。對於2路以上相聯,這個算法的時間代價會非常高。
對最久未使用算法的一個近似是非最近使用(NMRU)。這個算法僅記錄哪一個快取塊是最近被使用的。在替換時,會隨機替換掉任何一個其他的塊。故稱非最近使用。相比於LRU,這種算法僅需硬體為每一個快取塊增加一個使用位(use bit)即可。此外,也可使用純粹的隨機替換法。測試表明完全隨機替換的性能近似於LRU。

相關詞條

熱門詞條

聯絡我們