應(yīng)用

技術(shù)

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

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

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

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

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

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

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

緩存到底是什么?

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

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

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

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

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

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

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

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

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

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

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

對(duì)這個(gè)定義滿意嗎?很好 - 因?yàn)閺默F(xiàn)在開始它將變得更加復(fù)雜!

高速緩存:多層停車場

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

8 向告訴我們,一個(gè)塊可以與一組中的 8 條緩存行關(guān)聯(lián)。關(guān)聯(lián)性級(jí)別越高(即“方式”越多),則當(dāng) CPU 搜尋數(shù)據(jù)時(shí),命中高速緩存的機(jī)會(huì)就越大,并且減少由高速緩存未命中引起的損失。缺點(diǎn)是它增加了復(fù)雜性,增加了功耗,還可能降低性能,因?yàn)橛懈嗟木彺嫘幸幚硪粋€(gè)數(shù)據(jù)塊。

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

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

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

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

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

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