這是來自于‘jlforrest’的一位讀者的提問,我認(rèn)為值得更詳細(xì)的解答。以下是他的問題:
● 我理解緩存,但不明白為什么需要多層緩存而不是直接用一層大的。換句話說,如果一級(jí)緩存是32K,二級(jí)256K,三級(jí)2M,為什么不用32K+256k+2M的一級(jí)緩存?
簡(jiǎn)短的回答是不同的緩存級(jí)別適用于不同的目的和限制,在設(shè)計(jì)上完全不同。經(jīng)驗(yàn)上,隨著緩存級(jí)別的增加,緩存變得更大,更慢,密度更高,每單位存儲(chǔ)消耗的電能更少,能處理更多的任務(wù)。
CPU的緩存有什么作用?
高速緩存是處理核心(包括CPU與GPU)或者外部?jī)?chǔ)存設(shè)備與主內(nèi)存區(qū)間的一個(gè)緩沖儲(chǔ)存區(qū),所以稱為緩存
在CPU,GPU等處理核心上,核心計(jì)算的臨時(shí)中間數(shù)據(jù)和大量需求的數(shù)據(jù)都優(yōu)先儲(chǔ)存在緩存里,舉個(gè)例子:CPU計(jì)算一個(gè)1+1+1的值時(shí),第一次計(jì)算前兩個(gè)數(shù)的和的結(jié)果2就儲(chǔ)存在CPU緩存里,再把結(jié)果拿來進(jìn)行第二次計(jì)算,當(dāng)然,現(xiàn)在的處理器算這個(gè)數(shù)據(jù)不用這么做,只是面對(duì)大量數(shù)據(jù)計(jì)算的時(shí)候需要這么做
在更大量的計(jì)算里,處理器會(huì)按數(shù)據(jù)的優(yōu)先級(jí)從低到高分別儲(chǔ)存在一級(jí),二級(jí),三級(jí)緩存中,再?zèng)]有空間就會(huì)放進(jìn)內(nèi)存中,處理器讀取數(shù)據(jù)也是從一級(jí)緩存開始,直到內(nèi)存中,如果內(nèi)存還沒有數(shù)據(jù)就去硬盤光盤等外部?jī)?chǔ)存設(shè)備找,一級(jí)緩存速度最快,二級(jí),三級(jí)次之
在外部?jī)?chǔ)存設(shè)備中,比如硬盤和光驅(qū)的緩存主要是提高傳輸速率,增加硬件壽命,你可以從硬盤一個(gè)分區(qū)復(fù)制一堆小文件到另一個(gè)分區(qū),你可以發(fā)現(xiàn),復(fù)制相同容量的文件速度是大文件快于小文件,因?yàn)槊總€(gè)小文件都要進(jìn)行文件的建立,數(shù)據(jù)寫入與結(jié)束寫入等過程會(huì)耗費(fèi)很多時(shí)間
在處理器或者內(nèi)存向硬盤或者光驅(qū)(刻錄機(jī))寫入的數(shù)據(jù)都是小文件或者數(shù)據(jù)而且并不連續(xù),他們都先放在硬盤緩存里,到整個(gè)文件結(jié)束或者到緩存區(qū)容量極限時(shí)再一次性寫入硬盤,這樣可以減少硬盤的讀寫次數(shù),并且以此寫入的速度更快~
cpu緩存現(xiàn)在都分兩個(gè)級(jí)別,一及緩存稱L1 cache,二級(jí)緩存稱為L(zhǎng)2 cache.
當(dāng)然對(duì)于不同cpu,兩及緩存的作用是不同的。但總體來說,緩存是儲(chǔ)存cpu急需處理的數(shù)據(jù)的地方,當(dāng)cpu要處理東西的時(shí)候,緩存中就開始儲(chǔ)存這些數(shù)據(jù),由于緩存速度非常之高,所以,cpu讀取這些數(shù)據(jù)的速度就相當(dāng)快。
由于緩存容量相當(dāng)小,但是當(dāng)緩存中的數(shù)據(jù)處理完了又沒有來得及重新添滿的時(shí)候,或者是緩存中的數(shù)據(jù)不是cpu馬上要處理的數(shù)據(jù)的時(shí)候,cpu就只有跳過緩存,直接村內(nèi)存讀取,內(nèi)存的速度要相對(duì)慢得多,所以這個(gè)時(shí)候cpu整體的速度就下降了。
當(dāng)然,AMD和intel在緩存上的結(jié)構(gòu)完全不同,這個(gè)造成了為什么intel的主流處理器的L2 cache緩存在2-4Mb,而AMD的L2 cache只有256kb-512kb.這個(gè)我們就要說到他們L1 cache的區(qū)別了。
intel的L1中不儲(chǔ)存cpu要處理的實(shí)際數(shù)據(jù),他儲(chǔ)存的都是L2中數(shù)據(jù)的目錄,也就是intel的cpu要處理數(shù)據(jù)的時(shí)候先要訪問L1,為的是了解他要儲(chǔ)存的實(shí)際數(shù)據(jù)在L2中具體的位置。這個(gè)大大減少了cpu尋找L2數(shù)據(jù)的時(shí)間。比喻起來,intel的L2是一個(gè)倉(cāng)庫(kù),L1關(guān)于就是這個(gè)倉(cāng)庫(kù)中儲(chǔ)存東西具體位置的目錄。
AMD完全不同,L1中就儲(chǔ)存實(shí)際數(shù)據(jù),L2也儲(chǔ)存實(shí)際數(shù)據(jù),當(dāng)L1中的數(shù)據(jù)用完了的時(shí)候,或者L1不能裝的過大的數(shù)據(jù)的時(shí)候,cpu就直接處理L2中的數(shù)據(jù)。比喻起來,AMD的L1是個(gè)小倉(cāng)庫(kù),L2是個(gè)大倉(cāng)庫(kù)。
然后是為什么他們對(duì)L2需求不同。
AMD的很好理解,他cpu處理數(shù)據(jù)的時(shí)候是有續(xù)處理的,先處理L1,處理完了再處理L2,數(shù)據(jù)一個(gè)接一個(gè)。
intel采取的是則是亂處理方式,cpu不會(huì)衣順序處理數(shù)據(jù),而是隨即挑選數(shù)據(jù)來處理,當(dāng)他隨便挑選的數(shù)據(jù)在L2中時(shí),他就讀取L1了解數(shù)據(jù)在L2的位置,然后處理這個(gè)數(shù)據(jù),但是當(dāng)數(shù)據(jù)不在L2中時(shí),就讀取內(nèi)存。
這個(gè)造就了他們L2大小不同,intel的處理方式像是一個(gè)人隨機(jī)的在扔飛標(biāo),飛標(biāo)落在標(biāo)盤每個(gè)地方的幾率是相同的,標(biāo)盤內(nèi)的紅心就是L2的數(shù)據(jù),標(biāo)盤的其他地方是內(nèi)存。前面說了,L2中數(shù)據(jù)是高速的,只有處理L2的,才能更快,否則要慢很多。所以,一個(gè)隨機(jī)扔飛標(biāo)的人為了讓飛標(biāo)落在紅心的幾率更大,最好的辦法就是加大紅心的面積,也就是L2.因此為了提高cpu的速度,intel需要很大的紅心,也就是L2.
AMD則不同,他是一個(gè)接一個(gè)處理的,不是隨機(jī)的扔飛標(biāo),他要考慮的只是L1和L2中單個(gè)數(shù)據(jù)的大小,因?yàn)閏pu要處理的數(shù)據(jù)幾乎都在0-2Mb之間,0-128kb的占了50%,128-256kb占了25%,256-512的占了24%,大于512kb的只占了1%.
因此,512kb就能滿足cpu幾乎所有的需求了,只有處理那些1%的大于512kb的數(shù)據(jù)的時(shí)候AMD才會(huì)訪問內(nèi)存。因此AMD需求很小的L2.
為了把這個(gè)問題講得更直觀,我打算用一個(gè)有點(diǎn)奇怪但很精巧的類比:
緩存的故事
假設(shè)你是一位六十年代的白領(lǐng),在巨大的辦公樓里工作,沒有電腦,你需要閱讀大量的文件并且交叉檢索這些文檔。
你有一個(gè)辦公桌(L1 緩存)。桌上的文件是你正在手頭處理的資料,還有一些是你最近看過的或者你準(zhǔn)備閱讀的。通常我們需要閱讀文件的每一頁(對(duì)應(yīng)于存儲(chǔ)單元的一個(gè)字節(jié)),但除非它們?cè)谵k公桌上,文件都是作為一個(gè)整體。即只想看某一頁的內(nèi)容,我們也必須把整份文件抓過來。
辦公室里還有文件柜(L2 緩存)。這些文件柜里存放的是你最近處理過,但目前沒有在使用的文件。辦公桌上的文件在用完后,通常也會(huì)放回文件柜。從文件柜里拿文件就不是順手拈來了——你需要走過去,打開相應(yīng)的抽屜,還要查目錄卡片,才能找到想要的文件——不過這也還比較快了。
有些時(shí)候,其他人也需要查看你的文件柜里的文件。勤雜工會(huì)推著一輛推車(環(huán)路公共汽車)在各個(gè)辦公室轉(zhuǎn)。如果有人在自己的文件柜沒有找到相應(yīng)的資料,他會(huì)寫一個(gè)紙條交給勤雜工。為簡(jiǎn)化起見,假設(shè)這位勤雜工知道所有的東西放哪兒。所以當(dāng)他來到你的辦公室的時(shí)候,他會(huì)檢查你的文件柜里是否有其他人需要的文件,如果有,就把這些文件抽出來放到車上。當(dāng)他轉(zhuǎn)到別的辦公室,就會(huì)把找到的文件放在文件柜里,并留下收條。
有時(shí)候,這些文件并不在文件柜里,而是在辦公桌上。那就不可以直接拿了,需要征詢主人的意見,如果不行,大家就要商量如何協(xié)調(diào)。有大量冗長(zhǎng)的詳盡的合作指引來處理這類情況(至少要一起開會(huì))。
文件柜經(jīng)常會(huì)滿,這時(shí)就不能放新的文件,需要先騰地方,把一些很久都沒用到的文件拿出來。勤雜工會(huì)把這些文件放到地下室里(L3 緩存)。地下室里的文件被密集地堆放到紙箱里或者文件架上,交給文檔管理員處理,其他人都不會(huì)下去,也不會(huì)了解文檔的存放細(xì)節(jié)。
當(dāng)勤雜工來到地下室,會(huì)把一堆不需要的文件放到‘in’框里,同時(shí)他也會(huì)留下一堆紙條,寫著在樓上文件柜里找不到的文件名。文檔管理員會(huì)拿著這些紙條,找到對(duì)應(yīng)的文件,把它們放到‘out’ 框里。下次勤雜工下來的時(shí)候,就可以把‘out’框里的文件拿走,交給需要的人。
現(xiàn)在的問題是,文件還是太多,地下室也放不下,而且辦公大樓的租金都很貴,所以通常公司都會(huì)在離市區(qū)較遠(yuǎn)的地方租一個(gè)倉(cāng)庫(kù)來存放歸檔文件(對(duì)應(yīng)于DRAM內(nèi)存)。文檔管理員會(huì)記錄哪些文件放在地下室,哪些文件放在倉(cāng)庫(kù)。這樣,當(dāng)需要拿文件時(shí),管理員就知道哪些是能在地下室找到,哪些要到倉(cāng)庫(kù)里拿。每天有一兩次,會(huì)有一輛貨車開到倉(cāng)庫(kù)去拿需要的文件,同時(shí)把一些地下室的舊文件運(yùn)過去。
對(duì)勤雜工而言,他并不關(guān)心這些細(xì)節(jié),這些都是文檔管理員在處理。他需要做的就是把紙條放到‘in’框里,從‘out’框里取出文件。
回到最初的問題
那么,這個(gè)類比的意義何在?簡(jiǎn)短而言,一個(gè)具體的模型比模糊的概念更能清晰地闡明物流的意義。實(shí)際上,物流對(duì)設(shè)計(jì)芯片的意義和運(yùn)作一個(gè)高效的辦公文件處理系統(tǒng)是一樣的。
最初的問題是‘為什么不用一個(gè)大的緩存,而是用幾層小的緩存?’。 也就是說,如果一個(gè)4核芯片配置32K一級(jí)緩存,256K二級(jí)緩存和2M三級(jí)緩存,為什么不能用一個(gè)3M的大緩存?
在類比里,類似于問與其給4個(gè)人每人分一個(gè)1.5米寬的辦公桌,為什么不給這4個(gè)人一個(gè)150米寬的大辦公桌?
關(guān)鍵在于,放辦公桌上的目的就是要能觸手可及。如果辦公桌太大,就沒有意義了。難道還需要走50米去拿文件? 對(duì)一級(jí)緩存也是同理,如果太大,存取速度會(huì)變慢,而且會(huì)消耗更多的電力。所以一級(jí)緩存既要足夠大到能起作用,又要小到能夠快速存取。
另外一點(diǎn),一級(jí)緩存處理的存取類型和其他緩存不同。有L1的數(shù)據(jù)緩存,也有L1指令緩存。Intel的CPU還有另外的指令緩存,uOp緩存,既叫L1并發(fā)指令緩存也叫L0指令緩存。
L1數(shù)據(jù)緩存通常只處理1到8個(gè)字節(jié)的數(shù)據(jù),但高層級(jí)的緩存并不處理單獨(dú)的字節(jié)。在我們的類比里,所有不辦公桌上的資料都是以文件為單位(對(duì)應(yīng)于catch line)。 在內(nèi)存中也一樣,高層級(jí)緩存通常是批發(fā)處理數(shù)據(jù),以緩存行為單位(cache line)。
L1指令緩存和數(shù)據(jù)緩存完全不同,就內(nèi)核而言,它是只讀的。(指令內(nèi)存的寫入通常是用非直接的方式,先把指令放入高層的緩存,再載入一級(jí)指令緩存)。由于這個(gè)原因,指令緩存和數(shù)據(jù)緩存通常是分隔的。使用通用的L1緩存意味著把互相沖突的設(shè)計(jì)原則糅合在一起,妥協(xié)的結(jié)果就是任何一個(gè)目的都達(dá)不到。而且用通用的L1緩存處理指令和數(shù)據(jù)負(fù)載也會(huì)很大。
另外,作為程序員,我們通常不關(guān)心內(nèi)存帶寬。例如,每個(gè)時(shí)鐘周期,i7的CPU的內(nèi)核能從L1緩存中讀取16字節(jié)的指令,而且會(huì)不斷地循環(huán)讀取。如果是3GHZ,每個(gè)核可以讀50GB指令/秒。實(shí)際上,通常L1指令緩存的能力都足夠大,很少需要L2緩存參與處理。但如果是通用緩存,就需要預(yù)估指令和數(shù)據(jù)的高并發(fā)情況。(想象一下在L1緩存中用memcopy拷貝幾K數(shù)據(jù)的情況)
順便提一句,如果都在L1緩存,CPU能在一個(gè)時(shí)鐘周期完成許多存取操作?!瓾aswell’或者之后的3GHZ的i7內(nèi)核可以處理超過300GB的指令和數(shù)據(jù), 如果搭配合理的話。這樣的處理能力綽綽有余,但你仍然需要考慮數(shù)據(jù)和指令同時(shí)出現(xiàn)峰值的情況。
L1緩存在設(shè)計(jì)上就是越快越好,以應(yīng)對(duì)峰值情況。只有L1緩存處理不了,才會(huì)轉(zhuǎn)給更高層的緩存,但速度會(huì)降低。因?yàn)楦邔泳彺娓P(guān)心電力效率和存儲(chǔ)密度。
第三點(diǎn),共享。在上面的比喻中,獨(dú)立辦公桌,亦或L1緩存是私有的,如果在你的辦公桌上,你只管拿就好了,不需要詢問其他人。
這很關(guān)鍵。如果4個(gè)人共享一個(gè)大辦公桌,你就不能隨便拿文件,因?yàn)榱硗馊齻€(gè)人可能正在使用。(即使他們只是在閱讀其他文件時(shí)順便參考一下你想使用的文件)。任何時(shí)候,你想要拿什么東西,你需要先叫一聲,‘有人在用嗎?’如果別人在你前面,你就必須等待?;蛘咝枰粋€(gè)排隊(duì)系統(tǒng),當(dāng)存在資源沖突的時(shí)候,每個(gè)人需要拿張票排隊(duì)等候,或者其它的什么機(jī)制,具體實(shí)現(xiàn)細(xì)節(jié)并不重要,但是所有的事情你都需要和其他人協(xié)調(diào)。
對(duì)多核共享緩存的情況也是這樣。你不能在不通知?jiǎng)e人的情況下隨意動(dòng)那些數(shù)據(jù),所有對(duì)共享緩存的操作都必須協(xié)調(diào)進(jìn)行。
這就是為什么我們要使用私有的L1緩存。L1緩存就是你的辦公桌,你可以隨便使用桌上的文件。L2緩存處理大部分的協(xié)同操作。大部分時(shí)間,工作者(CPU內(nèi)核)坐在辦公桌前,勤雜工會(huì)走過來,把需求列表拿走,同時(shí)把之前你想找的文件放倒文件柜里。整個(gè)過程不會(huì)打斷你的工作(CPU)。
僅僅當(dāng)你和勤雜工都需要拿文件柜里的同一份文件,或者別人想用你辦公桌上的文件,這時(shí)就需要停下手頭工作,進(jìn)行交談。
簡(jiǎn)單而言,L1緩存的工作就是優(yōu)先為CPU內(nèi)核服務(wù)。因?yàn)槭撬接械?,所以基本不需要協(xié)調(diào)工作。L2緩存也是私有的,但是它的工作重心還包括在不打擾內(nèi)核工作的情況下,處理大量的緩存間的數(shù)據(jù)通信。
L3緩存是共享資源,需要全局協(xié)調(diào)。在上面的類比中,工作者只有從勤雜工的推車?yán)锬玫轿募?,這就是一個(gè)阻塞點(diǎn)。我們只能希望L1和L2緩存足夠大以便這類阻塞點(diǎn)不會(huì)成為性能瓶頸。
附加說明
本篇文章涵蓋了當(dāng)前臺(tái)式機(jī)(筆記本)CPU的緩存架構(gòu):分開的L1/L1 D 緩存,每核統(tǒng)一的L2緩存,共享的L3緩存。
不是每個(gè)系統(tǒng)都象這樣。一些系統(tǒng)并不區(qū)分指令緩存和數(shù)據(jù)緩存;另外一些則把指令和數(shù)據(jù)在所有的緩存級(jí)全部分開。很多L2緩存是多核共享的,L2緩存就象是連接多個(gè)內(nèi)核的公共汽車。還有一些系統(tǒng)有L3和L4緩存。我也沒有提到使用多CPU套接字的系統(tǒng)。
我提到環(huán)路公共汽車是因?yàn)檫@是一個(gè)很好的類比。環(huán)路公共汽車很常見。有些時(shí)候,環(huán)路汽車是個(gè)麻煩(尤其是只需要把兩三個(gè)街區(qū)連起來);有時(shí)候,環(huán)路公共汽車需要和交叉系統(tǒng)連接起來(就象在辦公室,每個(gè)樓層用推車,不同樓層則用電梯)。
作為軟件工程師,我們自然而然地會(huì)假設(shè)模塊A和模塊B可以魔術(shù)般地連接,數(shù)據(jù)則可隨意地從一端流向另一端。內(nèi)存的實(shí)際工作機(jī)制其實(shí)非常復(fù)雜,但抽象出來呈現(xiàn)給程序員的只是一組大平面的字節(jié)排列。
硬件并不象這樣工作。各個(gè)部件之間并不能魔法般地自動(dòng)連接。模塊A和模塊B并非抽象概念,而是具體的物理設(shè)備,實(shí)際上可以看作是非常小的機(jī)器,在硅片上占有實(shí)際的物理空間。芯片都有平面圖,是真正的2D地圖。如果你想連接A和B,就需要一條實(shí)際的導(dǎo)線來連接。 導(dǎo)線也占空間,而且需要消耗電力(越遠(yuǎn)消耗越多)。用一大捆線連接A和B意味著物理上這一塊區(qū)域會(huì)阻礙其他區(qū)域的連接。(當(dāng)然,芯片可以使用多層連接,如果你有興趣,可以搜索‘routing congestion’)。 在芯片里移動(dòng)數(shù)據(jù)實(shí)際上是一個(gè)物流問題,并且超級(jí)復(fù)雜。
所以盡管辦公室的故事只是半開玩笑的類比,‘誰需要和誰談’、‘這個(gè)系統(tǒng)的幾何構(gòu)造如何——是有意義的布局嗎?’這些問題其實(shí)對(duì)系統(tǒng)設(shè)計(jì)和硬件相關(guān)并有巨大的影響。 利用空間的隱喻來概念化實(shí)際情況是十分有效的。
-
cpu
+關(guān)注
關(guān)注
68文章
10825瀏覽量
211155 -
緩存
+關(guān)注
關(guān)注
1文章
233瀏覽量
26649
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論