有关多核一致性的理解和思考
快速鏈接:
.
👉👉👉 個(gè)人博客筆記導(dǎo)讀目錄(全部) 👈👈👈
一些質(zhì)疑
網(wǎng)上的好多篇博文,一提Cache的多核一致性就必然提到MESI、MOESI ,然后就開始講MESI、MOESI維護(hù)性原理?試問一下,您是真的不理解MES嗎?您真的需要學(xué)習(xí)MESI?你不理解的是架構(gòu)對(duì)吧,而不是學(xué)什么鬼協(xié)議!
既然您要學(xué)了MESI,那么這里也提出幾個(gè)問題:
(1)、ARM架構(gòu)中真的使用MESI了嗎?
(2)、MESI是一個(gè)協(xié)議? 是誰來維護(hù)的?總得有個(gè)硬件實(shí)現(xiàn)這個(gè)協(xié)議吧,是在ARM Core中? CCI-400中?SCU中?DSU中?
(3)、MESI的四種狀態(tài),分別記錄在哪里的?
怎樣去維護(hù)多核一致性
然后,是有三種機(jī)制可以保持一致性:
- 禁用緩存是最簡(jiǎn)單的機(jī)制,但可能會(huì)顯著降低 CPU 性能。為了獲得最高性能,處理器通過管道以高頻率運(yùn)行,并從提供極低延遲的緩存中運(yùn)行。緩存多次訪問的數(shù)據(jù)可顯著提高性能并降低 DRAM 訪問和功耗。將數(shù)據(jù)標(biāo)記為“非緩存”可能會(huì)影響性能和功耗。
- 軟件管理的一致性是數(shù)據(jù)共享問題的傳統(tǒng)解決方案。在這里,軟件(通常是設(shè)備驅(qū)動(dòng)程序)必須清除或刷新緩存中的臟數(shù)據(jù),并使舊數(shù)據(jù)無效,以便與系統(tǒng)中的其他處理器或主設(shè)備共享。這需要處理器周期、總線帶寬和功率。
- 硬件管理的一致性提供了一種簡(jiǎn)化軟件的替代方案。使用此解決方案,任何標(biāo)記為“共享”的緩存數(shù)據(jù)將始終自動(dòng)更新。該共享域中的所有處理器和總線主控器看到的值完全相同。
燃鵝,我們使用的卻是第三種 硬件管理的一致性, 意思就是:做為一名軟件工程師,我們啥也不用管了,有人幫我們干活,雖然如此,但我們還是希望理解下硬件原理。
再講原理之前,我們先補(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ì)訪問該變量.
在以上的場(chǎng)景中,都存在一塊內(nèi)存(如0x4000_0000地址處內(nèi)存)被不同的ARM CORE來訪問,這樣就會(huì)出現(xiàn)了該數(shù)據(jù)在main-memory、SCU-0的L2 cache、SCU-1的L2 cache、8個(gè)Core的L1 cache不一致的情況。
既然出現(xiàn)了數(shù)據(jù)在內(nèi)存和不同的cache中的不一致的情況,那么就需要解決這個(gè)問題(也叫維護(hù)一致性),那么怎么維護(hù)的呢,上面也說了“使用 硬件管理的一致性”,下面就以直接寫答案的方式,告訴你硬件是怎樣維護(hù)一致性的。
我們先看一張老的圖(bit.LITTLE架構(gòu)的)吧
- core1、core1、SCU-0的cache的一致性,是由SCU-0來維護(hù)的(至于這里是不是遵守了MESI協(xié)議,答案:YES)
- SCU-0、SCU-1、main-memory的一致性,是由于CCI-400來維護(hù)的(至于這里是不是遵守了MESI協(xié)議,答案:我也不知道)
再看一張比較新的圖(DynamIQ架構(gòu)的)吧 - core 0的L2 cache、core 1的L2 cache、DSU-0 L3 cache的一致性 由DSU-0來維護(hù)(至于這里是不是遵守了MESI協(xié)議,答案: YES)
- DSU-0 L3 cache、DSU-1 L3 cache、Mali的L2 cache、system cache、main-memory的一致性是由于CCI-550來維護(hù)的(至于這里是不是遵守了MESI協(xié)議,答案:我也不知道)
MESI、MOESI 的介紹
既然您一味著堅(jiān)持要學(xué)習(xí)MESI、MOESI,那么咱也不能不介紹對(duì)不,緊跟著大佬們步伐,網(wǎng)上抄一抄(注意:那不叫抄,那叫借鑒)
首先是Modified Exclusive Shared Invalid (MESI) 協(xié)議中定義了4個(gè)狀態(tài):
| 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ù)無效 |
其次,在ARM的很多core中,定義了第五種狀態(tài)Shared Modified,這種稱之為MOESI協(xié)議. 而ARM使用的則是MOESI的變體(啥叫變體,咋變的,變的哪些,文當(dāng)它沒有說)
然后我們通過數(shù)據(jù)流圖的方式,觀看下MESI這四種狀態(tài)的情況:
MESI狀態(tài)之間的切換:
Events:
RH = Read Hit
RMS = Read miss, shared
RME = Read miss, exclusive
WH = Write hit
WM = Write miss
SHR = Snoop hit on read
SHI = Snoop hit on invalidate
LRU = LRU replacement
Bus Transactions:
Push = Write cache line back to memory
Invalidate = Broadcast invalidate
Read = Read cache line from memory
總結(jié)
看完以上信息,我們?cè)俅慰偨Y(jié)一下,我們學(xué)習(xí)cache一致性,我們最大的困惑或瓶頸是啥,是不理解MESI嗎?應(yīng)該還是對(duì)架構(gòu)的理解和認(rèn)知。學(xué)習(xí)MESI,不如去學(xué)習(xí)DSU、CCI-550原理吧。
總結(jié)
以上是生活随笔為你收集整理的有关多核一致性的理解和思考的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: `Caused by: java.lan
- 下一篇: cache/TLB里分别都有什么?