“ 本文的參考文章是2022年HOT 34上Intel Rob Blakenship關(guān)于CXL緩存一致性的一篇介紹?!?/p>
馮諾依曼說(shuō),數(shù)據(jù)應(yīng)該存在這里,這里變成了存儲(chǔ)器;
馮諾依曼說(shuō),數(shù)據(jù)應(yīng)該在這里被計(jì)算,這里變成了CPU;
馮諾依曼沒(méi)有說(shuō),CPU太快而存儲(chǔ)太慢。CPU沒(méi)有辦法只能把一部分?jǐn)?shù)據(jù)留在身邊,慢慢地就成了各級(jí)緩存。每個(gè)CPU都留了一部分?jǐn)?shù)據(jù)在身邊,就得維護(hù)這些數(shù)據(jù)和內(nèi)存的一致性。
(有時(shí)間可以再聊聊拜占庭將軍問(wèn)題和共識(shí)機(jī)制,又要分布式的好,還有集中式的一致性,有點(diǎn)類似。)
1緩存/caching
緩存就是臨時(shí)把數(shù)據(jù)存在靠近數(shù)據(jù)要消費(fèi)的地方。
放數(shù)據(jù)的地方有不同的級(jí)別,不同級(jí)別的延時(shí)和帶寬都不一樣,因此就會(huì)有預(yù)取。更詳細(xì)的硬件預(yù)取器的文章可以參考以下幾篇拙作。
預(yù)取就是在數(shù)據(jù)真正需求之前把數(shù)據(jù)取回來(lái)。既然可以預(yù)取就說(shuō)明數(shù)據(jù)具有兩個(gè)性質(zhì):
空間局部性:一般來(lái)說(shuō)需求的數(shù)據(jù)在之前的數(shù)據(jù)附近
時(shí)間局部性:一般來(lái)說(shuō)需求的數(shù)據(jù)總是之前用過(guò)的
現(xiàn)代CPU一般都會(huì)有多級(jí)的緩存,并且他們都可以保持緩存一致。
L1:空間最小,延時(shí)最低,帶寬最高
L3:空間更大,延時(shí)更高,帶寬較低,并且支持多個(gè)數(shù)據(jù)需求來(lái)源
那么如何保證緩存一致性呢?
首先需要在更新緩存之前,確保使得其他人擁有的該緩存無(wú)效。
這可以通過(guò)軟件的手段,也可以通過(guò)硬件的手段。CXL使用硬件一致性。
CXL和CPU的緩存一致性協(xié)議相同,都是基于以下幾個(gè)狀態(tài):
Modified:該數(shù)據(jù)只被緩存到一個(gè)cache中,可讀可寫,但是還沒(méi)有更新到內(nèi)存中;
Exclusive:該數(shù)據(jù)只被緩存到一個(gè)cache中,可讀可寫,數(shù)據(jù)與內(nèi)存同步;
Shared:該數(shù)據(jù)被緩存到多個(gè)cache中,可讀,數(shù)據(jù)與內(nèi)存同步;
Invalid:該數(shù)據(jù)沒(méi)有被緩存;
2緩存的家 Home
內(nèi)存以64Byte為單位分好,這一份就是一個(gè)cacheline。
系統(tǒng)通過(guò)物理地址把這些單位都安排好,然后交給Home Agent來(lái)管理,有且僅有一個(gè)。
也就是說(shuō)一個(gè)cacheline,只有一個(gè)家,例如在兩路系統(tǒng)中,要么是CPU0,要么是CPU1。
比如說(shuō),你要讀一個(gè)cacheline,你會(huì)首先在本地的cache里找,如果沒(méi)有的話,你就會(huì)去找它的家。也就是Home Agent會(huì)去問(wèn)其他的CPU是不是有這個(gè)緩存。
如果你要寫一個(gè)cacheline,你也需要找它的家,獲取寫權(quán)限,然后讓Home Agent告訴其他的CPU放棄該cacheline,當(dāng)然在放棄之前,需要把最新的數(shù)據(jù)回寫給Home Agent。
Home Agent怎么問(wèn)其他CPU,或者修改cacheline的狀態(tài)呢?這個(gè)就是Snoop消息。
3CXL 緩存協(xié)議
為支持設(shè)備訪問(wèn)系統(tǒng)主存,cxl.cache有15個(gè)讀寫操作指令。
CXL3.0開(kāi)始,每一個(gè)端口可以最多支持16個(gè)緩存設(shè)備,而在此之前,只能支持一個(gè)。
在CPU和CXL設(shè)備之間,有兩個(gè)通訊方向,一個(gè)是H2D,一個(gè)是D2H。
顧名思義,host和device 的兩個(gè)方向。而每個(gè)方向分成三個(gè)通道/channel,分別為請(qǐng)求,響應(yīng)和數(shù)據(jù)通道。
4舉個(gè)栗子
Device首先發(fā)一個(gè)RdShared:Read Cacheline Share State。設(shè)備獲取了某個(gè)cacheline并且獲得S-state,然后host返回Go-S。表示Home Agent同意了這個(gè)請(qǐng)求,并且該設(shè)備的cacheline變成了Shared state。
看看就好,不能動(dòng)手。
這里的peer cache可以是各種鄰居:
CXL的鄰居設(shè)備;
本CPU中的cache;
遠(yuǎn)端CPU中的cache;
而這里的內(nèi)存控制器也可以是各種內(nèi)存:
本CPU的傳統(tǒng)DDR;
遠(yuǎn)端CPU的傳統(tǒng)DDR;
鄰居CXL設(shè)備上的CXL.mem;
CXL的15個(gè)request,就不再一一解釋,露個(gè)臉:
Reads: RdShared, RdCurr, RdOwn, RdAny
Read-0: RdownNoData, CLFlush, CacheFlushed
Writes: DirtyEvict, CleanEvict, CleanEvictNoData
Streaming Writes: ItoMWr, WrCur, WOWrInv, WrInv(F)
5內(nèi)存池化和共享
池化內(nèi)存和CXL switch是CXL增加的內(nèi)容,這使得從host到內(nèi)存的專屬分配成為共享內(nèi)存的一種方式。
CXL3增加了多個(gè)host共享內(nèi)存的支持,利用HDM-DB。
先寫到這里,緩存一致性的具體流程不再詳細(xì)解釋,細(xì)心一點(diǎn)的朋友可以多找?guī)讉€(gè)例子,按照?qǐng)D示和步驟對(duì)照一下。
審核編輯:湯梓紅
-
存儲(chǔ)器
+關(guān)注
關(guān)注
38文章
7528瀏覽量
164312 -
cpu
+關(guān)注
關(guān)注
68文章
10901瀏覽量
212903 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3052瀏覽量
74280 -
緩存
+關(guān)注
關(guān)注
1文章
241瀏覽量
26740
原文標(biāo)題:感謝CXL同志為維護(hù)緩存一致性做出的努力
文章出處:【微信號(hào):SDNLAB,微信公眾號(hào):SDNLAB】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論