L1,L2,L3 Cache究竟在哪裡?

L1,L2,L3 Cache究竟在哪裡?

很多人有個疑問,為什麼Intel系列CPU在2005年後可以力壓AMD十多年?優秀的Cache設計和卓越的微架構是主要的原因。大多數高層程序員認為 Cache 是透明的,CPU可以很聰明地安排他們書寫的程序,不需要關心數據是在內存中還是在Cache裡。 他們也許是對的,大部分時間Cache都可以安靜的工作。但對於操作系統、編譯軟件、固件工程師和硬件工程師來說,Cache則需要我們特別關照。現在越來越多的數據庫軟件和人工智能引擎也對Cache越來越敏感,需要針對性地優化。Cache設計和相關知識從而不再是陽春白雪,你也許某一天就會需要了解它。

本系列希望通過將Cache相關領域知識點拆解成大家關心的幾個問題,來串起相關內容。這些問題包括:

  1. Cache究竟在哪裡?Cache是怎麼組織和工作的?
  2. 什麼是n-ways Set-Associative Cache?
  3. 什麼是Cache Coloring (Page Coloring)? 什麼是Inclusive Cache或者Exclusive Cache?
  4. Cache line淘汰算法有哪些?
  5. Cache為什麼有那麼多級?為什麼一級比一級大?是不是Cache越大越好?
  6. Cache的一致性是怎麼保證的?Cache的屬性是誰設定的,怎麼設定的?

下面是本系列的第一篇。

什麼是Cache?

Cache Memory也被稱為Cache,是存儲器子系統的組成部分,存放著程序經常使用的指令和數據,這就是Cache的傳統定義。從廣義的角度上看,Cache是快設備為了緩解訪問慢設備延時的預留的Buffer,從而可以在掩蓋訪問延時的同時,儘可能地提高數據傳輸率。 快和慢是一個相對概念,與微架構(Microarchitecture)中的 L1/L2/L3 Cache相比, DDR內存是一個慢速設備;在磁盤 I/O 系統中,DDR卻是快速設備,在磁盤 I/O 系統中,仍在使用DDR內存作為磁介質的Cache。在一個微架構中,除了有L1/L2/L3 Cache之外,用於虛實地址轉換的各級TLB, MOB( Memory Ordering Buffers)、在指令流水線中的ROB,Register File和BTB等等也是一種Cache。我們這裡的Cache,是狹義 Cache,是CPU流水線和主存儲器的 L1/L2/L3 Cache。

Cache在哪裡呢?

也許很多人會不假思索的說:“在CPU內核裡。”Not so fast!它也有可能在主板上!我們先來了解一下Cache的歷史。

  • PC-AT/XT和286時代:沒有Cache,CPU和內存都很慢,CPU直接訪問內存。
  • 386時代:CPU速度開始和內存速度不匹配了。為了能夠加速內存訪問,芯片組增加了對快速內存的支持,這也是在電腦上第一次出現Cache(儘管IBM 360 model系統上已經出現很久了),也是L1(一級Cache)的雛形。這個Cache是可選的,低端主板並沒有它,從而性能受到很大影響。而高級主板則帶有64KB,甚至高端大氣上檔次的128KB Cache,在當時也是可以笑傲江湖了。當時的Cache都是Write-Through,即Cache內容的更新都會立刻寫回內存中。
  • 486時代:Intel在CPU裡面加入了8KB的L1 Cache,當時也叫做內部Cache。它在當時是Unified Cache,就是不分代碼和數據,都存在一起。原先在386上面的Cache,變成了L2,也被叫做外部Cache。大小從128KB到256KB不等。這時增加了Write-back的Cache屬性,即Cache內容更改後不立刻更新內存,而是在Cache miss的時候再更新,避免了不必要的更新。
L1,L2,L3 Cache究竟在哪裡?

  • 586/Pentium-1時代:L1 Cache被一分為二,分為Code和data,各自8KB。這是因為code和data的更新策略並不相同,而且因為CISC的變長指令,code cache要做特殊優化。與此同時L2還被放在主板上。後期Intel推出了Pentium Pro ('80686'),L2被放入到CPU的Package上:
L1,L2,L3 Cache究竟在哪裡?

  • 奔騰2/3:變化不大,L2還在CPU Die外面,只是容量大了不少。
L1,L2,L3 Cache究竟在哪裡?

  • 奔騰4/奔騰D:L2被放入到了Die裡面。這就和現在的L1和L2很相像了,問題來了,多內核呢?第一代奔騰D雙核中,L1和L2被兩個Die各自佔據。Netburst的Pentium 4 Extreme Edition高端版甚至加入L3。但在後期與HT一起隨著Netburst架構被放棄。Core/Core2:巨大的變化發生在L2,L2變成多核共享模式:
L1,L2,L3 Cache究竟在哪裡?

  • 現在:L3被加入到CPU Die中,它在邏輯上是共享模式。而L2則被每個Core單獨佔據。這時L2也常被指做MLC(Middle Level Cache),而L3也被叫做LLC(Last Level Cache):
L1,L2,L3 Cache究竟在哪裡?

  • Haswell/Broadwell:在Iris系列中,一塊高速DRAM被放入Package中,叫做eDRAM。
L1,L2,L3 Cache究竟在哪裡?

它在平時可以做顯存。也可以被設定為L4緩存:

L1,L2,L3 Cache究竟在哪裡?

Cache速度比內存速度快多少?

大家都知道內存都是DRAM,但對Cache是怎麼組成就所知不多了。Cache是由CAM(Content Addressable Memory )為主體的tag和SRAM組成的。我們今後在系列文章中會詳細介紹CAM的組成,這裡簡單比較一下DRAM和SRAM。DRAM組成很簡單:

L1,L2,L3 Cache究竟在哪裡?

DRAM

只有一個晶體管和一個電容。而SRAM就複雜多了,一個簡化的例子:

L1,L2,L3 Cache究竟在哪裡?

SRAM

需要6個晶體管。一個簡單的比較如下:

L1,L2,L3 Cache究竟在哪裡?

那麼速度差距多大呢?各級Cache的延遲差距很大,如下圖:

L1,L2,L3 Cache究竟在哪裡?

可以看到延遲最低的是Registers和MOB(Memory Ordering Buffers),L1的延遲和CPU core在一個數量級之內(注意這裡並不能簡單的認為L1就是3個Cycle,因為有pre-fetch),而DRAM延遲是它的60多倍。

結論

說Cache在CPU的Die裡面在現在絕大多數情況下都是正確的。最新Intel的optane內存會讓普通DRAM作為cache,而自己作為真正內存,從而組成兩級memory( L2 memory),為這個結構平添了一些變數。細心的讀者也許會發現,Cache演變總的來說級數在增加,新加入的層級在位置上總是出現在外層,逐漸向內部靠近。Cache的設計是CPU設計的重要內容之一,我們會在今後的文章中為大家詳細介紹。

後記

  • 如何知道自己CPU的L2、L3的容量多大呢?當然可以用CPU-z,但其實可以有個更加簡單的辦法,在命令行輸入:
wmic cpu get L2CacheSize,L3CacheSize

我的筆記本得到這個結果:

L1,L2,L3 Cache究竟在哪裡?

  • 想體驗一下不要Cache的極限慢速嗎?很多BIOS都有設置,可以關掉cache:
L1,L2,L3 Cache究竟在哪裡?


分享到:


相關文章: