應(yīng)用

技術(shù)

物聯(lián)網(wǎng)世界 >> 物聯(lián)網(wǎng)新聞 >> 物聯(lián)網(wǎng)熱點新聞
企業(yè)注冊個人注冊登錄

無處不在的緩存,究竟有何作用?

2020-09-02 09:12 與非網(wǎng)

導(dǎo)讀:緩存到底是什么?

從廉價筆記本電腦到價值一百萬美元的服務(wù)器,任何一臺計算機(jī)中CPU都有一個叫做“緩存”的東西。當(dāng)然緩存的級別往往有所不同。

緩存很重要,不然也不會無處不在。但是緩存到底有什么作用,為什么是不同級別的呢?

而且 12 路路組相連到底意味著什么?

緩存到底是什么?

TL 和 DR 很小,但卻非??觳⑽挥贑PU的邏輯單元旁邊。當(dāng)然,我們需要了解更多有關(guān)緩存的信息。

讓我們從一個虛構(gòu)的,神奇的存儲系統(tǒng)開始說起。這個存儲系統(tǒng)速度極快,可以一次處理無限的數(shù)據(jù),并始終保持?jǐn)?shù)據(jù)安全。對它來說甚至不存在任何需要遠(yuǎn)程操作的東西,但是如果的確存在,處理器的設(shè)計將更加簡單。CPU僅需要具有用于加法,乘法等的邏輯單元,以及用于處理數(shù)據(jù)傳輸?shù)南到y(tǒng)。這是因為我們的理論存儲系統(tǒng)可以立即發(fā)送和接收所需的所有編號;沒有一個邏輯單元會等待數(shù)據(jù)處理。

但是,眾所周知,實際上不存在任何上述魔術(shù)般的存儲技術(shù)。反之,我們擁有硬盤驅(qū)動器或固態(tài)驅(qū)動器,即使其中最好的驅(qū)動器也無法遠(yuǎn)程處理典型 CPU 所需的所有數(shù)據(jù)傳輸。原因在于,現(xiàn)代 CPU 的運行速度非???- 它們僅需一個時鐘周期即可將兩個 64 位整數(shù)值相加,而對于以 4 GHz 運行的 CPU,則僅為 0.00000000025 秒或四分之一納秒。同時,旋轉(zhuǎn)硬盤驅(qū)動器僅需數(shù)千納秒即可在內(nèi)部磁盤上查找數(shù)據(jù),更不用說傳輸數(shù)據(jù)了,而固態(tài)驅(qū)動器仍需數(shù)十或數(shù)百納秒。

顯然,此類驅(qū)動器無法內(nèi)置在處理器中,因此這意味著兩者之間將存在物理隔離。這只會增加數(shù)據(jù)移動的時間,使情況變得更糟。因此,我們需要的是另一個數(shù)據(jù)存儲系統(tǒng),它位于處理器和主存儲之間。它需要比驅(qū)動器更快的速度,能夠同時處理大量數(shù)據(jù)傳輸,并且離處理器更近一些。

如今它已成為現(xiàn)實,叫做RAM。每個計算機(jī)系統(tǒng)都有一些用于上述目的的裝置。而幾乎所有這類存儲都是 DRAM(動態(tài)隨機(jī)存取存儲器),它能夠比任何驅(qū)動器更快地傳輸數(shù)據(jù)。但是,盡管 DRAM速度極快,但它無法存儲盡可能多的數(shù)據(jù)。

美光公司是 DRAM 的少數(shù)制造商之一,其中一些最大的 DDR4 存儲器芯片可容納 32 Gbit 或 4 GB 數(shù)據(jù)。最大的硬盤驅(qū)動器的容量是此容量的 4000 倍。因此,盡管我們提高了數(shù)據(jù)網(wǎng)絡(luò)的速度,但仍需要附加系統(tǒng)(硬件和軟件),以便確定應(yīng)將哪些數(shù)據(jù)保留在有限數(shù)量的 DRAM 中,以備 CPU 使用。或者至少可以將 DRAM 置于芯片封裝中(稱為嵌入式 DRAM)。不過,CPU 很小,所以您不能在其中塞太多。

絕大多數(shù) DRAM 位于處理器旁邊(插入主板)。在計算機(jī)系統(tǒng)中,它始終是最接近 CPU 的組件。然而,這還是不夠快。DRAM 仍需要約 100 納秒的時間才能找到數(shù)據(jù),但至少每秒可以傳輸數(shù)十億比特??磥砦覀冃枰硪患壌鎯ζ鳎拍苓M(jìn)入處理器單元和 DRAM 之間。

左級輸入:SRAM(靜態(tài)隨機(jī)存取存儲器)。在 DRAM 使用微觀電容器以電荷形式存儲數(shù)據(jù)的情況下,SRAM 使用晶體管做同樣的事情,并且它們的工作速度幾乎與處理器中的邏輯單元一樣快(大約比 DRAM 快 10 倍)。

當(dāng)然,SRAM 有一個缺點,那就是空間。

基于晶體管的內(nèi)存比 DRAM 占用更多的空間:對于相同大小的 4 GB DDR4 芯片,您將獲得不到 100 MB 的 SRAM。但是,由于它是通過與創(chuàng)建 CPU 相同的過程制成的,因此 SRAM 可以直接在處理器內(nèi)部構(gòu)建,并盡可能靠近邏輯單元。每增加一個環(huán)節(jié),我們就增加了數(shù)據(jù)移動的速度,從而增加了存儲量。我們可以繼續(xù)添加更多的環(huán)節(jié),每個環(huán)節(jié)更快但簡潔。

因此,我們對高速緩存下了一個更為專業(yè)的定義:它是全部位于處理器內(nèi)部的多個 SRAM 塊,通過以超快的速度發(fā)送和存儲數(shù)據(jù)來確保邏輯單元保持盡可能繁忙。

對這個定義滿意嗎?很好 - 因為從現(xiàn)在開始它將變得更加復(fù)雜!

高速緩存:多層停車場

如上所述,需要緩存是因為沒有一種神奇的存儲系統(tǒng)可以滿足處理器中邏輯單元的數(shù)據(jù)需求?,F(xiàn)代的 CPU 和圖形處理器包含許多 SRAM 塊,這些 SRAM 塊在內(nèi)部組織成一個層次結(jié)構(gòu),即一系列高速緩存,其順序如下:

在上圖中,CPU 由黑色虛線矩形表示。ALU(算術(shù)邏輯單元)在最左邊;這些是為處理器提供動力,處理芯片運算能力的結(jié)構(gòu)。從專業(yè)角度來講,它不是緩存,而最接近 ALU 的內(nèi)存級別是寄存器(它們組合在一起成為一個寄存器文件)。

其中的每一個都擁有一個數(shù)字,例如 64 位整數(shù)。該值本身可能是有關(guān)某物的一條數(shù)據(jù),一條特定指令的代碼或某些其他數(shù)據(jù)的內(nèi)存地址。

臺式機(jī) CPU 中的寄存器文件非常小 - 例如,在 Intel 的 Core i9-9900K 中,每個內(nèi)核中有兩個存儲區(qū),而一個整數(shù)存儲區(qū)僅包含 180 個 64 位寄存器。另一個寄存器文件,用于向量(數(shù)字的小數(shù)組),具有 168 個 256 位條目。因此,每個內(nèi)核的總寄存器文件略低于 7 kB。相比之下,Nvidia GeForce RTX 2080 Ti 的流式多處理器(GPU 等效于 CPU 內(nèi)核)中的寄存器文件大小為 256 kB。

寄存器是 SRAM,就像高速緩存一樣,但是它們和它們所服務(wù)的 ALU 一樣快,可以在一個時鐘周期內(nèi)輸入和輸出數(shù)據(jù)。但是它們的設(shè)計并不是要容納太多數(shù)據(jù)(僅存儲其中的一部分),這就是為什么附近總是存在一些更大的內(nèi)存塊的原因:這是 1 級緩存。

上圖是英特爾 Skylake 臺式機(jī)處理器設(shè)計的單核的放大照片。

可以在最左側(cè)看到 ALU 和寄存器文件(以綠色突出顯示)。圖片的頂部中間是白色的 1 級數(shù)據(jù)緩存。它容納的信息并不多,僅為 32 kB,但是與寄存器一樣,它非??拷壿媶卧?,并以與它們相同的速度運行。

另一個白色矩形表示 1 級指令高速緩存,大小也為 32 kB。顧名思義,該命令存儲了各種命令,這些命令可以分解成較小的所謂的微操作(通常標(biāo)記為μop),以供 ALU 執(zhí)行。它們也有一個緩存,您可以將其歸類為 0 級,因為它比 L1 緩存小(僅進(jìn)行 1,500 次操作)并且更近。

您可能想知道為什么這些 SRAM 塊這么小?為什么它們不是一兆字節(jié)大?。繑?shù)據(jù)和指令高速緩存一起占用的芯片空間幾乎與主要邏輯單元占用的空間相同,因此使其增大將增加芯片的整體尺寸。

但是它們僅保留幾 kB 的主要原因是,隨著內(nèi)存容量的增大,查找和檢索數(shù)據(jù)所需的時間也會增加。L1 高速緩存必須達(dá)到真正意義上的快,因此必須在大小和速度之間達(dá)成折衷 - 最多需要大約 5 個時鐘周期(較長的浮點值)才能從該高速緩存中獲取數(shù)據(jù),以備使用。

但是,如果這是處理器內(nèi)部唯一的緩存,則其性能將突然崩潰。這就是為什么它們都在內(nèi)核中內(nèi)置了另一級內(nèi)存的原因:二級緩存。這是一個通用的存儲塊,保存著指令和數(shù)據(jù)。

它總是比級別 1 大很多:AMD Zen 2 處理器的最大容量為 512 kB,因此可以保持較低級別的緩存的良好供應(yīng)。但是,這種額外的大小需要付出一定的代價,而與 1 級相比,從此緩存中查找和傳輸數(shù)據(jù)大約要花費兩倍的時間。

追溯到最初的 Intel Pentium 時代,Level 2 高速緩存是一個單獨的芯片,其位于小型插入式電路板上(例如RAMDIMM)或內(nèi)置在主板中。最終它像奔騰 III 和 AMD K6-III 處理器一樣,一直運用于 CPU 封裝本身,直到最終被集成到 CPU 裸片中。

由于多核芯片的興起,這項發(fā)展很快之后又有了另一個級別的緩存,以支持其他較低的級別。

上圖是 Intel Kaby Lake 芯片,其左中間有 4 個內(nèi)核(集成 GPU 占據(jù)了右側(cè)一半的裸片)。每個內(nèi)核都有其自己的“專用”組 1 級和 2 級緩存(白色和黃色高亮顯示),但它們也帶有第三組 SRAM 塊。

3 級高速緩存即使直接圍繞一個內(nèi)核也可以與其他內(nèi)核完全共享 - 每個都可以自由訪問另一個 L3 高速緩存的內(nèi)容。它 內(nèi)存更大(在 2 到 32 MB 之間),但也慢得多,平均超過 30 個周期(尤其是在內(nèi)核需要使用相距一定距離的緩存塊中的數(shù)據(jù)時)。

在下面,我們可以看到 AMD Zen 2 架構(gòu)中的單核:白色的 32 kB 1 級數(shù)據(jù)和指令緩存,黃色的 512 KB 2 級緩存和紅色的 4 MB 巨大塊 L3 緩存。

不只是一個數(shù)字:

高速緩存兩個環(huán)節(jié):其一是來提高性能通過加速向邏輯單元的數(shù)據(jù)傳輸,其二是保留常用指令和數(shù)據(jù)的副本。緩存中存儲的信息分為兩部分:數(shù)據(jù)本身以及它最初位于系統(tǒng)內(nèi)存 / 存儲中的位置。此地址稱為緩存標(biāo)簽。

當(dāng) CPU 運行要從內(nèi)存讀取數(shù)據(jù)或向內(nèi)存寫入數(shù)據(jù)的操作時,它首先檢查 1 級緩存中的變量。如果存在所需的數(shù)據(jù)(緩存命中),則幾乎可以立即訪問該數(shù)據(jù)。當(dāng)所需標(biāo)簽不在最低緩存級別中時,即緩存未命中。

因此,在 L1 高速緩存中會有一個新標(biāo)簽,其余的處理器體系結(jié)構(gòu)將接管,盡數(shù)瀏覽其他高速緩存級別(如有必要,一直返回主存儲驅(qū)動器)以查找該標(biāo)簽的數(shù)據(jù)。但是要在 L1 緩存中為該新標(biāo)簽騰出空間,必須將其他內(nèi)容始終引導(dǎo)到 L2 中。

這導(dǎo)致了幾乎恒定的數(shù)據(jù)改組,所有這些都只需要幾個時鐘周期即可實現(xiàn)。實現(xiàn)此目的的唯一方法是在 SRAM 周圍構(gòu)建一個復(fù)雜的結(jié)構(gòu),以處理數(shù)據(jù)管理。換句話說,如果一個 CPU 內(nèi)核僅由一個 ALU 組成,則 L1 緩存會簡單得多,但是由于 ALU 有數(shù)十個(其中許多將處理兩個指令線程),因此緩存需要多個連接來保持一切都在進(jìn)行中。

您可以使用免費程序(例如 CPU-Z)來檢查為自己的計算機(jī)供電的處理器的緩存信息。但是所有這些信息意味著什么?一個重要的元素是關(guān)聯(lián)的標(biāo)簽集。這與規(guī)則有關(guān),這些規(guī)則取決于由系統(tǒng)內(nèi)存中的數(shù)據(jù)塊復(fù)制到緩存的方式。

上面的緩存信息適用于 Intel Core i7-9700K。它的 1 級高速緩存每個都分成 64 個小塊,稱為集合,并且每個小塊進(jìn)一步劃分為高速緩存行(大小為 64 字節(jié))。集相關(guān)意味著將來自系統(tǒng)內(nèi)存的數(shù)據(jù)塊映射到一個特定集合中的高速緩存行上,而不是自由地在任何地方進(jìn)行映射。

8 向告訴我們,一個塊可以與一組中的 8 條緩存行關(guān)聯(lián)。關(guān)聯(lián)性級別越高(即“方式”越多),則當(dāng) CPU 搜尋數(shù)據(jù)時,命中高速緩存的機(jī)會就越大,并且減少由高速緩存未命中引起的損失。缺點是它增加了復(fù)雜性,增加了功耗,還可能降低性能,因為有更多的緩存行要處理一個數(shù)據(jù)塊。

高速緩存復(fù)雜性的另一方面在于如何在各個級別上保留數(shù)據(jù)。規(guī)則是在包含策略中設(shè)置的。例如,英特爾酷睿處理器具有完全包含的 L1 + L3 緩存。例如,這意味著第 1 級中的相同數(shù)據(jù)也可以在第 3 級中。這似乎在浪費寶貴的緩存空間,但是好處是,如果處理器在搜索低級標(biāo)簽時出錯,數(shù)據(jù)就會丟失,而不需要遍歷更高的級別來找到它。

在同一處理器中,L2 緩存是非包含性的:存儲在其中的任何數(shù)據(jù)都不會復(fù)制到任何其他級別。這樣可以節(jié)省空間,但確實會導(dǎo)致芯片的存儲系統(tǒng)必須搜索 L3 以找到丟失的標(biāo)簽(實際上總會比這個更大一些)。受害者緩存與此類似,但是它們習(xí)慣于存儲從較低級別推出的信息 - 例如,AMD 的 Zen 2 處理器使用 L3 受害者緩存,該緩存僅存儲來自 L2 的數(shù)據(jù)。

還有其他用于緩存的策略,例如何時將數(shù)據(jù)寫入緩存和主系統(tǒng)內(nèi)存。這些稱為寫策略,當(dāng)今大多數(shù) CPU 使用回寫式緩存。這意味著,當(dāng)將數(shù)據(jù)寫入高速緩存級別時,在使用其副本更新系統(tǒng)內(nèi)存之前會有一個延遲。在大多數(shù)情況下,只要數(shù)據(jù)保留在高速緩存中,此暫停就會一直運行。只有將其引導(dǎo)后,RAM 才會獲取信息。

對于處理器設(shè)計者而言,選擇高速緩存的數(shù)量,類型和策略都是為了平衡對更大處理器能力的需求與增加的復(fù)雜性和所需的芯片空間。如果有可能擁有 20 MB,1000 路完全關(guān)聯(lián)的 1 級高速緩存,而芯片又不大的離譜(并消耗相同的功率),那么我們都將擁有配備這種芯片的計算機(jī)!

在過去的十年中,當(dāng)今 CPU 中最低的緩存級別并沒有太大變化。但是,級別 3 緩存的大小仍在繼續(xù)增長。十年前,如果您幸運地?fù)碛幸慌_售價 999 美元的 Intel i7-980X,則可以獲得 12 MB 的內(nèi)存。如今,您只需花一半的錢就能得到 64 MB。

簡而言之,緩存是不可或缺的,也是尖端技術(shù)的體現(xiàn)之一。我們沒有研究過 CPU 和 GPU 中的其他緩存類型(例如轉(zhuǎn)換查找緩沖區(qū)或紋理緩存),但是由于它們都遵循我們在此介紹的簡單的級別結(jié)構(gòu)和模式,因此聽起來可能并不復(fù)雜。