加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • Cache的工作原理
    • Cache設(shè)計如何影響性能
    • 未來的創(chuàng)新
    • 緩存的發(fā)展
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

L1和L2 CPU Cache為何如此重要?

2021/09/24
2535
閱讀需 15 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

Cache(高速緩存)的發(fā)展是計算歷史上最重要的事件之一。幾乎所有的現(xiàn)代CPU內(nèi)核,從ARM Cortex-A5這樣的超低功耗芯片到最高端的Intel Core i9都使用cache。即使是更高端的微控制器也經(jīng)常有小型cache,或作為選項提供,即使是在超低功耗設(shè)計中,其性能優(yōu)勢也實在是不容忽視。

緩存的發(fā)明是為了解決一個重要問題。在計算機發(fā)展的早期幾十年里,主存非常慢,而且非常昂貴,但CPU也不是特別快。從20世紀(jì)80年代開始,這一差距開始迅速擴大。微處理器的時鐘速度突飛猛進,但內(nèi)存訪問時間卻沒有明顯改善。隨著這一差距的擴大,越來越明顯的是,需要一種新型的快速存儲來彌補這一差距。

 

雖然只到2000年,但20世紀(jì)80年代開始差異越來越大,導(dǎo)致了第一批CPU cache開發(fā)出來。

Cache的工作原理

CPU cache是小型內(nèi)存池,用于存儲CPU下一步最可能需要的信息。哪些信息加載到cache取決于復(fù)雜的算法和對編程代碼的某些假設(shè)。Cache系統(tǒng)的目標(biāo)是確保CPU在尋找下一位數(shù)據(jù)時,已經(jīng)將其加載到cache(也稱為‘cache hit’)。

另一方面,cache miss意味著CPU不得不去別處尋找數(shù)據(jù)。這就是L2 cache發(fā)揮作用的地方,雖然它比較慢,但卻更大。有些處理器使用inclusive cache設(shè)計(意味著存儲在L1 cache中的數(shù)據(jù)也會復(fù)制到L2 cache中),而其他處理器則是exclusive的(意味著這兩個cache從不共享數(shù)據(jù))。如果在L2 cache中找不到數(shù)據(jù),CPU就會繼續(xù)往下找L3(通常仍在芯片上),然后是L4(如果存在)和主內(nèi)存(DRAM)。

這張圖顯示了一個hit rate恒定的L1 cache與一個更大的L2 cache之間的關(guān)系。請注意,總hit rate隨著L2大小的增加而急劇上升。一個更大、更慢、更便宜的L2可以提供大型L1的所有優(yōu)勢,但沒有芯片尺寸和功耗的影響。大多數(shù)現(xiàn)代L1 cache的hit rate都遠(yuǎn)遠(yuǎn)高于這里顯示的理論上的50%,Intel和AMD的cache hit rate通常都在95%或更高。

下一個重要的點是set-associativity。每個CPU都包含一種特定類型的RAM,稱為tag RAM。Tag RAM是所有可以映射到任何給定cache塊的內(nèi)存位置的記錄。如果一個cache是完全關(guān)聯(lián)的,這意味著任何RAM數(shù)據(jù)塊都可以存儲在任何一塊cache中。這種系統(tǒng)的優(yōu)點是hit rate高,但搜索時間非常長,CPU必須在搜索主存之前查看整個cache以確定數(shù)據(jù)是否存在。

當(dāng)然,還有直接映射的cache。直接映射的cache是指每個cache塊可以包含一個且只有一個主存塊。這種類型的cache可以被快速搜索,但是由于它是1:1映射到內(nèi)存位置,因此hit rate很低。介于這兩個極端之間的是n-way associative cache。2-way associative cache(Piledriver的L1是2-way)意味著每個主內(nèi)存塊可以映射到兩個cache塊中的一個。8-way意味著每個主內(nèi)存塊可以映射到8個cache塊中的一個。Ryzen的L1指令cache是4-way associative,而L1數(shù)據(jù)cache是8-way set associative。

接下來的兩圖片顯示了hit rate是如何隨著set-associativity而提高的。請記住,像hit rate這樣的東西是非常特殊的,不同的應(yīng)用會有不同的hit rate。

為什么CPU的cache越來越大?那么,為什么首先要不斷增加更大的cache呢?因為每個額外的內(nèi)存池都會推遲訪問主內(nèi)存的需求,并且在特定情況下可以提高性能。

這張來自Anandtech的Haswell評論的圖表很有用,因為它說明了增加一個巨大的(128MB)L4 cache以及傳統(tǒng)的L1/L2/L3結(jié)構(gòu)對性能的影響。每個階梯代表一個新的cache級別。紅線是帶有L4的芯片。請注意,對于大文件,它的速度仍然幾乎是其他兩個Intel芯片的兩倍。

那么,將大量的片上資源用于cache似乎是合乎邏輯的。但事實證明,這樣做的邊際收益是遞減的。較大的cache既慢又貴。在每一位SRAM(6T)有六個晶體管,cache也很昂貴(就芯片尺寸而言,也就代表著成本)。過了某一點,把芯片的功率預(yù)算和晶體管數(shù)量花在更多的執(zhí)行單元、更好的分支預(yù)測或額外的內(nèi)核上會更有意義。下圖是Pentium M(Centrino/Dothan)芯片,整個芯片的左側(cè)被用于一個巨大的L2 Cache。在過去單線程CPU的時代就是這樣,現(xiàn)在我們有了多核芯片和GPU,在很多情況下,整個CPU中用于cache的比例較小。

Cache設(shè)計如何影響性能

增加CPU cache對性能的影響與其效率或hit rate直接相關(guān);反復(fù)的cache miss會對CPU性能產(chǎn)生災(zāi)難性的影響。下面的例子雖然被大大簡化了,但應(yīng)該可以說明這個問題。

想象一下,CPU必須連續(xù)100次從L1 cache加載數(shù)據(jù)。L1 cache的訪問延遲為1ns,hit rate為100%。因此,CPU需要100ns的時間來執(zhí)行這個操作。

現(xiàn)在,假設(shè)cache有99%的hit rate,但CPU第100次訪問實際需要的數(shù)據(jù)卻在L2中,有10-cycle(10ns)的訪問延遲。這意味著CPU需要花99ns的時間來執(zhí)行前99次讀取,10ns的時間來執(zhí)行第100次。Hit rate降低1%,卻讓CPU的速度降低了10%。

在現(xiàn)實世界中,L1 cache的hit rate通常在95%到97%之間,但在我們的簡單例子中,這兩個值對性能的影響不是2%,而是14%。請記住,我們假設(shè)丟失的數(shù)據(jù)總是在L2 cache中。如果數(shù)據(jù)已經(jīng)從cache中被驅(qū)逐位于主內(nèi)存中,訪問延遲為80-120ns,那么95%和97%的hit rate之間的性能差異可能會使執(zhí)行代碼所需的總時間翻倍。

這張die shot,芯片中間的重復(fù)結(jié)構(gòu)是20MB的共享L3 cache。

早在人們對AMD的Bulldozer系列與Intel的處理器進行比較時,cache設(shè)計和性能影響的話題就出現(xiàn)了很多。目前還不清楚Bulldozer低迷的性能有多少可以歸咎于其cache子系統(tǒng),除了有相對較高的延遲外,Bulldozer系列還受到大量cache爭用的影響。如下圖所示,每個Bulldozer/Piledriver/Streamroller模塊共享其L1指令cache。

當(dāng)兩個不同的線程在同一內(nèi)存空間中寫入和覆蓋數(shù)據(jù)時,cache會發(fā)生爭用現(xiàn)象。這損害了兩個線程的性能,每個核都被迫花時間把自己的首選數(shù)據(jù)寫進L1,而另一個核卻迅速覆蓋了這些信息。即使AMD將L1代碼cache增加到96KB,并使其成為3-way associative,AMD的舊版Steamroller仍然被這個問題所困擾。后來的Ryzen CPU沒有以這種方式共享cache,這個問題也就沒再發(fā)生。

這張圖顯示了Opteron 6276(原Bulldozer處理器)的hit rate在兩個核都處于活動狀態(tài)時是如何下降的,至少在一些測試中是這樣。然而,很明顯,cache的爭用并不是唯一的問題,即使在兩個處理器的hit rate相同的情況下,6276在歷史上也很難超過6174的表現(xiàn)。

今天,Zen 2沒有這類弱點,Zen和Zen 2的整體cache和內(nèi)存性能比老的Piledriver架構(gòu)好很多。

AMD最初的Ryzen首秀。Ryzen使用的cache系統(tǒng)與以前的AMD CPU非常不同。

現(xiàn)代CPU通常也有一個非常小的L0 cache,通常只有幾KB大小,用于存儲微操作。AMD和Intel都使用這種cache;Zen有一個2,048μOP的cache,而Zen 2有一個4,096μOP的cache。這些微小的cache pool的運作原理與L1和L2相同,但代表一個更小的內(nèi)存池,CPU可以以比L1更低的延遲訪問。通常情況下,公司會對這些能力進行相互調(diào)整。Zen 1和Zen+(Ryzen 1xxx、2xxx、3xxx APU)有一個64KB的L1指令cache,是4-way set associative的,還有一個2,048μOP L0 cache。Zen 2(Ryzen 3xxx desktop CPU,Ryzen Mobile 4xxx)有一個32KB的L1指令cache,是8-way set associative的,有一個4,096µOP的cache。將set associativity和µOP cache的大小增加一倍,使AMD能夠?qū)1 cache的大小減少一半。這類權(quán)衡在CPU設(shè)計中很常見。

未來的創(chuàng)新

最近,IBM推出了Telum微處理器,cache結(jié)構(gòu)很有趣且不尋常。Telum有一般的L1和L2,但CPU沒有物理L3,而是部署了一個虛擬L3。下一代CPU不是完全驅(qū)逐CPU認(rèn)為不再需要的L2數(shù)據(jù),而是將其驅(qū)逐到同一硅片上不同CPU的L2 cache中,并將其標(biāo)記為L3數(shù)據(jù)。每個核都有自己的32MB L2,整個芯片的虛擬L3是256MB。IBM甚至可以在多芯片系統(tǒng)中共享這種能力,創(chuàng)建一個虛擬的L4,總共有8192MB的數(shù)據(jù)存儲。

這種類型的虛擬cache系統(tǒng)是獨一無二的,它在x86方面沒有可對應(yīng),它是一個有趣的例子,說明是如何推動cache設(shè)計的極限。雖然AMD的V-Cache提供額外的L3,而不是L2,但我們完全沒有必要提及它。AMD 最近的成就以及有望在未來 Zen CPU 上出現(xiàn)的功能是大型 L3 cache,垂直安裝在現(xiàn)有小芯片頂部,并通過芯片內(nèi)硅通孔連接到它們。Cache在這一點上可能已經(jīng)有40年的歷史了,但是制造商和設(shè)計師仍然在尋找方法來改進并擴大其實用性的方法。

緩存的發(fā)展

隨著研究人員不斷去尋找從較小的cache中擠出更高性能的方法,cache的結(jié)構(gòu)和設(shè)計仍在進行微調(diào)。到目前為止,Intel和AMD還沒有大力推動更大的cache,也沒有把設(shè)計一直擴展到L4。有一些Intel的CPU帶有板載EDRAM,相當(dāng)于一個L4 cache,但這種方法并不常見。這就是為什么我們在上面使用Haswell的例子,盡管該CPU比較老。據(jù)推測,對于大多數(shù)使用情況來說,大型L4 cache的優(yōu)勢性價比并不高。

不管怎么說,cache設(shè)計、功耗和性能對未來處理器的性能至關(guān)重要,任何一家公司如果可以在當(dāng)前設(shè)計的基礎(chǔ)上取得實質(zhì)性改進都會獲得非常大的優(yōu)勢。

[參考文章]

How L1 and L2 Caches Work, and Why They're an Essential Part of Modern Chips — Joel Hruska

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

C.A.S.E.及大出行領(lǐng)域?qū)W習(xí)及知識分享。歡迎業(yè)內(nèi)朋友交流~!