1.思考和質(zhì)疑
在一個(gè)大架構(gòu)大系統(tǒng)中,有哪些一致性需要維護(hù)?我們先看如下一張架構(gòu)圖。

然后請(qǐng)思考:
(1)、core0中的L1和L2 cache有一致性的要求嗎?緩存和替換策略是怎樣的?
(2)、core0 cache 和 core1 cache的一致性是誰(shuí)來(lái)維護(hù)?遵從MESI協(xié)議嗎?
(3)、core0 cache 和 core4 cache的是怎么維護(hù)一致性的呢?
(4)、custer0 L3 cache 和 cluster1 L3 cache的一致性是誰(shuí)來(lái)維護(hù)?遵從什么協(xié)議嗎?
(5)、custer0 L3 cache 和 GPU的L2一致性呢?遵從什么協(xié)議?
(6)、custer0 L3 cache 和 其它的I/O deviceMaster一致性呢?遵從什么協(xié)議?
(7)、DSU、ACE、CHI、CCI、CMN的概念?
網(wǎng)上的好多篇博文,一提Cache的多核一致性就必然提到 MESI、MOESI ,然后就開始講 MESI、MOESI維護(hù)性原理?試問(wèn)一下,您是真的不理解MESI嗎?您真的需要學(xué)習(xí)MESI?你不理解的是架構(gòu)吧,而不是學(xué)什么協(xié)議.既然要學(xué)習(xí)MESI,那么這里也繼續(xù)提出一些問(wèn)題:
(1)、ARM架構(gòu)中真的使用MESI了嗎?或者是哪一級(jí)cache使用了,哪一級(jí)cache沒(méi)有使用?
(2)、MESI是一個(gè)協(xié)議?是誰(shuí)來(lái)維護(hù)的?總得有個(gè)硬件實(shí)現(xiàn)這個(gè)協(xié)議吧,是在ARM Core實(shí)現(xiàn)?DSU實(shí)現(xiàn)?
(3)、MESI的四種狀態(tài),分別記錄在哪里的?
(4)、arm現(xiàn)在主流的core,到底使用的是MESI,還是MOESI?
2.怎樣去維護(hù)多核多系統(tǒng)緩存的一致性
有三種機(jī)制可以保持一致性:
禁用緩存是最簡(jiǎn)單的機(jī)制,但可能會(huì)顯著降低 CPU 性能。為了獲得最高性能,處理器通過(guò)管道以高頻率運(yùn)行,并從提供極低延遲的緩存中運(yùn)行。緩存多次訪問(wèn)的數(shù)據(jù)可顯著提高性能并降低 DRAM 訪問(wèn)和功耗。將數(shù)據(jù)標(biāo)記為“非緩存”可能會(huì)影響性能和功耗。
軟件管理的一致性是數(shù)據(jù)共享問(wèn)題的傳統(tǒng)解決方案。在這里,軟件(通常是設(shè)備驅(qū)動(dòng)程序)必須清除或刷新緩存中的臟數(shù)據(jù),并使舊數(shù)據(jù)無(wú)效,以便與系統(tǒng)中的其他處理器或主設(shè)備共享。這需要處理器周期、總線帶寬和功率。
硬件管理的一致性提供了一種簡(jiǎn)化軟件的替代方案。使用此解決方案,任何標(biāo)記為“共享”的緩存數(shù)據(jù)將始終自動(dòng)更新。該共享域中的所有處理器和總線主控器看到的值完全相同。
然而,我們?cè)贏RM架構(gòu)中,默認(rèn)使用的卻是第三種 硬件管理的一致性, 意思就是:做為一名軟件工程師,我們啥也不用管了,有人幫我們干活,雖然如此,但我們還是希望理解下硬件原理。
再講原理之前,我們先補(bǔ)充一個(gè)場(chǎng)景:假設(shè)在某一操作系統(tǒng)中運(yùn)行了一個(gè)線程,該線程不停著操作0x4000_0000地址處內(nèi)存(所以我們當(dāng)然期望,它總是命中著),由于系統(tǒng)調(diào)度,這一次該線程可能跑在cpu0上,下一次也許就跑在cpu1上了,再下一次也許就是cpu4上了(其實(shí)這種行為也叫做CPU migration)
或者舉個(gè)這樣的場(chǎng)景也行:在Linux Kernel系統(tǒng)中,定義了一個(gè)全局性的變量,然后多個(gè)內(nèi)核線程(多個(gè)CPU)都會(huì)訪問(wèn)該變量.
在以上的場(chǎng)景中,都存在一塊內(nèi)存(如0x4000_0000地址處內(nèi)存)被不同的ARM CORE來(lái)訪問(wèn),這樣就會(huì)出現(xiàn)了該數(shù)據(jù)在main-memory、cluster cache、core cache不一致的情況, 復(fù)雜點(diǎn)場(chǎng)景可能還會(huì)考慮cluster chache和other Master(如GPU) cache的一致性情況。
既然出現(xiàn)了數(shù)據(jù)在內(nèi)存和不同的cache中的不一致的情況,那么就需要解決這個(gè)問(wèn)題(也叫維護(hù)cache一致性),那么怎么維護(hù)的呢,上面也說(shuō)了“使用 硬件管理的一致性”,下面就以直接寫答案的方式,告訴你硬件是怎樣維護(hù)一致性的。
2.1 多核緩存一致性
同一個(gè)cluster中多core之間的緩存一致性由DSU(big.LITTLE叫SCU)來(lái)維護(hù),遵循MESI協(xié)議。

2.2 多Master之間的緩存一致性
在講述多Master之間的緩存一致性之前,我們先將Master分為以下幾類:
ACE Master : 如 big.LITTLE cluster 或 DSU cluster
CHI Master : 如 big.LITTLE cluster 或 DSU cluster
ACE-lite Master:如 GPU cluster
I/O Device Master : 如 DMA

以下是多Master之間的緩存一致性的結(jié)論:
首先,CHI/ACE總線都是支持MESI協(xié)議數(shù)據(jù)傳輸?shù)?/p>
Master與I/O Device Master之間沒(méi)有一致性,因?yàn)镮/O Device沒(méi)有鏈接到CCI/CMN緩存互聯(lián)總線上。
多個(gè)ACE/CHI Master之間的緩存一致性,是否遵循MESI,要具體情況具體分析,簡(jiǎn)而言之就是:(1) 如果兩個(gè)Master都支持帶MESI狀態(tài)位,支持帶有MESI信號(hào)的讀寫,那么這兩個(gè)Master緩存一致性是遵從MESI協(xié)議的 (2) 如果有一個(gè)Master不支持帶MESI狀態(tài)位,那么這個(gè)Master就無(wú)法支持帶有MESI信號(hào)的讀寫,那么這兩個(gè)Master緩存一致性是不遵從MESI協(xié)議的 (3) Master的MESI狀態(tài)位,是在該Master的cache的TAG中。
ACE/CHI Master和ACE-lite Master之間的緩存一致性,是不遵從MESI協(xié)議的。這主要是因?yàn)锳CE/CHI Master無(wú)法snoop ACE-lite Master的內(nèi)存,而ACE-lite Master卻可以snoop ACE/CHI Master的內(nèi)存,總得來(lái)說(shuō),這不是一個(gè)完整的MESI協(xié)議。
舉一個(gè)最常見的例子:兩個(gè)DSU cluster的L3 cache中的TAG中,是有MESI比特位的,這兩個(gè)DSU通過(guò)ACE/CHI 接口發(fā)起的讀寫是帶有MESI信號(hào)的,所以他們是支持MESI協(xié)議的。

再舉一個(gè)例子,一個(gè)DSU cluster 和一個(gè)接到SMMU上的DMA,此時(shí)正好對(duì)應(yīng)一個(gè)是ACE/CHI Master,一個(gè)ACE-lite Master,由于DMA/SMMU中并沒(méi)有MESI狀態(tài)位,他們也不會(huì)發(fā)起帶有MESI信號(hào)的讀寫,所以這兩個(gè)Master之間是不支持MESI協(xié)議的。

2.3dynamIQ架構(gòu)同一個(gè)core中的L1和L2 cache
dynamIQ架構(gòu)core中的L1和L2 cache不存在緩存一致性的問(wèn)題,但有分配和替換策略。
我們先看一下DynamIQ架構(gòu)中的cache中新增的幾個(gè)概念:
(1)Strictly inclusive: 所有存在L1 cache中的數(shù)據(jù),必然也存在L2 cache中
(2)Weakly inclusive: 當(dāng)miss的時(shí)候,數(shù)據(jù)會(huì)被同時(shí)緩存到L1和L2,但在之后,L2中的數(shù)據(jù)可能會(huì)被替換
(3)Fully exclusive: 當(dāng)miss的時(shí)候,數(shù)據(jù)只會(huì)緩存到L1
其實(shí)inclusive/exclusive屬性描述的正是是 L1和L2之間的替換策略,這部分是硬件定死的,軟件不可更改的。
我們?cè)僖?ARMV9 cortex-A710為例,查看其TRM手冊(cè),得知:

L1 I-cache和L2之間是 weakly inclusive的
L1 D-cache和L2之間是 strictly inclusive的
也就是說(shuō):
當(dāng)發(fā)生D-cache發(fā)生miss時(shí),數(shù)據(jù)緩存到L1 D-cache的時(shí)候,也會(huì)被緩存到L2 Cache中,當(dāng)L2 Cache被替換時(shí),L1 D-cache也會(huì)跟著被替換
當(dāng)發(fā)生I-cache發(fā)生miss時(shí),數(shù)據(jù)緩存到L1 I-cache的時(shí)候,也會(huì)被緩存到L2 Cache中,當(dāng)L2 Cache被替換時(shí),L1 I- cache不會(huì)被替換
所以總結(jié)一下就是 :L1 和 L2之間的cache的替換策略,針對(duì)I-cache和D-cache可以是不同的策略,每一個(gè)core都有每一個(gè)core的做法,這部分是硬件決定的,請(qǐng)查閱你使用core的TRM手冊(cè)。
3.MESI協(xié)議的介紹
本協(xié)議適用于:
big.LITTLE架構(gòu)中多核緩存一致性
dynamIQ架構(gòu)中多核緩存一致性
多cluster之間緩存一致性

其實(shí)也適用于:
不同cluster之間多核的緩存一致性

然后接下來(lái),我們開始學(xué)習(xí)MESI協(xié)議,注意著僅僅是一個(gè)協(xié)議 ,它既不是軟件也不是硬件,算上一個(gè)標(biāo)準(zhǔn)吧。首先是Modified Exclusive Shared Invalid (MESI) 協(xié)議中定義了4個(gè)狀態(tài):
| MESI State | Definition |
|---|---|
| Modified (M) | 這行數(shù)據(jù)有效,數(shù)據(jù)已被修改,和內(nèi)存中的數(shù)據(jù)不一致,數(shù)據(jù)只存在于該高速緩存中 |
| Exclusive (E) | 這行數(shù)據(jù)有效,數(shù)據(jù)和內(nèi)存中數(shù)據(jù)一致,數(shù)據(jù)只存在于該高速緩存中 |
| Shared (S) | 這行數(shù)據(jù)有效,數(shù)據(jù)和內(nèi)存中數(shù)據(jù)一致,多個(gè)高速緩存有這行數(shù)據(jù)的副本 |
| Invalid (I) | 這行數(shù)據(jù)無(wú)效 |
其次,在ARM的部分的core中,定義了第五種狀態(tài) SharedModified,這種稱之為 MOESI協(xié)議.我查詢大量的Core的TRM手冊(cè),信息如下:
使用MESI協(xié)議的core有:A710 A510 A78 A77 A76 A75 A72 A57 A55...
使用MOESI協(xié)議的core有:A7 A15 A53
發(fā)現(xiàn)問(wèn)題了沒(méi)?并不是網(wǎng)上主流博客所說(shuō),arm一般都用MOESI。請(qǐng)記住arm主流core在使用的是MESI。所以接下來(lái),我們也不會(huì)再介紹和學(xué)習(xí)MOESI了。
然后我們通過(guò)數(shù)據(jù)流圖的方式,觀看下MESI這四種狀態(tài)的情況:

MESI狀態(tài)之間的切換:

Events:RH = Read HitRMS = Read miss, sharedRME = Read miss, exclusiveWH = Write hitWM = Write missSHR = Snoop hit on readSHI = Snoop hit on invalidateLRU = LRU replacement
Bus Transactions:Push = Write cache line back to memoryInvalidate = Broadcast invalidateRead = Read cache line from memory
學(xué)到這里,我們對(duì)多核之間緩存一致性也有了大概的理解,我們也知道了MESI是干啥的了,那么我們繼續(xù)拋幾個(gè)問(wèn)題:(1)、為什么說(shuō)“多核之間的緩存一致性,遵從MESI協(xié)議,是DSU/SCU來(lái)維護(hù)”的?
其實(shí)吧,這也不是我說(shuō)的,這來(lái)自ARM官方文檔:
對(duì)于big.LITTLE架構(gòu),SCU是這樣描述的:

對(duì)于dynamIQ架構(gòu),DSU文檔中這樣描述的:

(2)、MESI的狀態(tài)位記錄在哪里的?以 ARMV9 cortex-A710為例,記錄在core cache的TAG中的BIT[1:0]中,即在TAG中。

對(duì)于big.LITTLE架構(gòu)SCU的L2 cache、dynamIQ架構(gòu)的DSU L3 cache中的TAG中,也都是有MESI比特位的,不過(guò)這一點(diǎn)在 armARMs和 trm文檔都是找不到的,不過(guò)在一些的PPT上是可以看到的。

4.ACE維護(hù)的緩存一致性
ACE master是接到 CCI 緩存互聯(lián)總線上的, 在 CCI Interconnect中,其實(shí)也是有一個(gè)Snoop Filter單元。ACE協(xié)議和Snoop filter單元一起來(lái)完成了ACE Master之間的緩存一致性。

snoop filter的主要作用:用于記錄存儲(chǔ)在ACE中的緩存。
Snoop Filter可以在未命中的情況下響應(yīng)偵聽事務(wù),并偵聽適當(dāng)?shù)闹骺刂挥性诿械那闆r下。Snoop Filter條目通過(guò)觀察來(lái)自 ACE 主節(jié)點(diǎn)的事務(wù)來(lái)維護(hù)以確定何時(shí)必須分配和取消分配條目。
Snoop Filter可以響應(yīng)多個(gè)一致性請(qǐng)求,而無(wú)需向所有master廣播ACE 接口。例如,如果地址不在任何緩存中,則Snoop Filter會(huì)以未命中和將請(qǐng)求定向到內(nèi)存。如果地址在處理器緩存中,則請(qǐng)求被視為命中,并且指向在其緩存中包含該地址的 ACE 端口。
以下也舉了一個(gè)多cluster之間緩存一致性的示例,A53 cluster讀取A57 cluster緩存一致性數(shù)據(jù)。

(1). Cortex-A53 cluster 發(fā)出 Coherent Read Request。
(2). CCI-400 將請(qǐng)求傳遞Request以窺探 Cortex-A57 cluster 緩存。
(3). 收到請(qǐng)求后,Cortex-A57 cluster會(huì)檢查其數(shù)據(jù)緩存的可用性并以所需信息進(jìn)行響應(yīng)。
(4). 如果請(qǐng)求的數(shù)據(jù)在緩存中,CCI-400 將數(shù)據(jù)從 Cortex-A57 cluster移動(dòng)到 Cortex-A53 cluster,從而導(dǎo)致 Cortex-A53 cluster中的緩存行填充。
5.軟件定義的緩存和替換策略
以上的multi cores、multi cluster、system之間的緩存策略或協(xié)議,都是由硬件決定,軟件改不了。那么我們軟件可以做什么呢?其實(shí),在軟件的MMU頁(yè)表的entry中的屬性位中,是可以定義該頁(yè)面內(nèi)存的緩存策略的。如果軟件定義了內(nèi)存位non-cacheable或non-shareable,那么以上的"硬件維護(hù)的一致性"將不會(huì)生效。接下來(lái)對(duì),軟件定義的緩存策略做了一個(gè)小小的總結(jié)。

總結(jié)了一下shareable、cacheable屬性對(duì)緩存策略的影響:
| Non-cacheable |
write-back cacheable |
write-through cacheable |
|
|---|---|---|---|
| non-shareable |
數(shù)據(jù)不會(huì)緩存到cache (對(duì)于觀察則而言,又相當(dāng)于outer-shareable) |
core訪問(wèn)該內(nèi)存時(shí),數(shù)據(jù)只緩存的到Core的 cache 中,不會(huì)緩存到其它c(diǎn)ache中 | 同左側(cè) |
| inner-shareable |
數(shù)據(jù)不會(huì)緩存到cache (對(duì)于觀察則而言,又相當(dāng)于outer-shareable) |
core訪問(wèn)該內(nèi)存時(shí),數(shù)據(jù)只會(huì)緩存到core的cache和 cluster的 cache中,該地址的TAG也不會(huì)存到snoop filter中,即不會(huì)被其它ACE Master snoop | 同左側(cè) |
| outer-shareable |
數(shù)據(jù)不會(huì)緩存到cache (對(duì)于觀察則而言,又相當(dāng)于outer-shareable) |
core訪問(wèn)該內(nèi)存時(shí),數(shù)據(jù)只會(huì)緩存到core的cache和 cluster的 cache中,該地址的TAG會(huì)存到snoop filter中,會(huì)被其它ACE Master snoop | 同左側(cè) |
6.動(dòng)圖示例
前置條件:dynamIQ架構(gòu)、L1 Data weakly inclusive、讀寫的內(nèi)存配置位outer-shareable/write-back cacheable
步驟:
(1)、core0 讀取了一行數(shù)據(jù),數(shù)據(jù)緩存到了core0的L1 Dcache、L2 cache
(2)、隨后core0的L2 中的數(shù)據(jù)是有可能會(huì)被替換出
(3)、core1 也讀取了該行數(shù)據(jù),數(shù)據(jù)緩存到了core1的L1 Dcache、L2 cache、L3 cache
(4)、隨后core1的L2 中的數(shù)據(jù)也是有可能會(huì)被替換出
(5)、core4 也讀取了該行數(shù)據(jù),數(shù)據(jù)緩存到了core4的L1 Dcache、L2 cache
(6)、隨后core4的L2 中的數(shù)據(jù)也是有可能會(huì)被替換出
(7)、至此,core0的L1、core1的L1、cluster0的L3、core4的L1 中都緩存了該數(shù)據(jù)。core0的L2、core1的L2、core4的L2 可能緩存了該行數(shù)據(jù)

審核編輯 :李倩
-
處理器
+關(guān)注
關(guān)注
68文章
20165瀏覽量
247823 -
協(xié)議
+關(guān)注
關(guān)注
2文章
616瀏覽量
40871 -
總線
+關(guān)注
關(guān)注
10文章
3019瀏覽量
91371
原文標(biāo)題:深入學(xué)起Cache系列 3 : 多核多Cluster多系統(tǒng)之間的緩存一致性
文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
如何解決數(shù)據(jù)庫(kù)與緩存一致性
請(qǐng)問(wèn)如何保證多片AD1278的通道之間相位一致性?
S32G274ardb2應(yīng)該進(jìn)行哪些設(shè)置來(lái)保持集群之間的緩存一致性?
速度不可測(cè)的異構(gòu)多智能體系統(tǒng)一致性分析
時(shí)延異構(gòu)多自主體系統(tǒng)的群一致性分析
Cache一致性協(xié)議優(yōu)化研究
如何使用異質(zhì)多智能體系統(tǒng)進(jìn)行滯后一致性跟蹤控制
自主駕駛系統(tǒng)將使用緩存一致性互連IP和非一致性互連IP
管理基于Cortex?-M7的MCU的高速緩存一致性
搞定緩存一致性驗(yàn)證,多核SoC設(shè)計(jì)就成功了一半
本周五|搞定緩存一致性驗(yàn)證,多核SoC設(shè)計(jì)就成功了一半
如何保證緩存一致性
Redis緩存與Mysql如何保證一致性?
異構(gòu)計(jì)算下緩存一致性的重要性

多核多Cluster多系統(tǒng)之間的緩存一致性
評(píng)論