有关多核一致性的理解和思考
快速鏈接:
.
👉👉👉 個人博客筆記導讀目錄(全部) 👈👈👈
一些質疑
網上的好多篇博文,一提Cache的多核一致性就必然提到MESI、MOESI ,然后就開始講MESI、MOESI維護性原理?試問一下,您是真的不理解MES嗎?您真的需要學習MESI?你不理解的是架構對吧,而不是學什么鬼協議!
既然您要學了MESI,那么這里也提出幾個問題:
(1)、ARM架構中真的使用MESI了嗎?
(2)、MESI是一個協議? 是誰來維護的?總得有個硬件實現這個協議吧,是在ARM Core中? CCI-400中?SCU中?DSU中?
(3)、MESI的四種狀態,分別記錄在哪里的?
怎樣去維護多核一致性
然后,是有三種機制可以保持一致性:
- 禁用緩存是最簡單的機制,但可能會顯著降低 CPU 性能。為了獲得最高性能,處理器通過管道以高頻率運行,并從提供極低延遲的緩存中運行。緩存多次訪問的數據可顯著提高性能并降低 DRAM 訪問和功耗。將數據標記為“非緩存”可能會影響性能和功耗。
- 軟件管理的一致性是數據共享問題的傳統解決方案。在這里,軟件(通常是設備驅動程序)必須清除或刷新緩存中的臟數據,并使舊數據無效,以便與系統中的其他處理器或主設備共享。這需要處理器周期、總線帶寬和功率。
- 硬件管理的一致性提供了一種簡化軟件的替代方案。使用此解決方案,任何標記為“共享”的緩存數據將始終自動更新。該共享域中的所有處理器和總線主控器看到的值完全相同。
燃鵝,我們使用的卻是第三種 硬件管理的一致性, 意思就是:做為一名軟件工程師,我們啥也不用管了,有人幫我們干活,雖然如此,但我們還是希望理解下硬件原理。
再講原理之前,我們先補充一個場景:
假設在某一操作系統中運行了一個線程,該線程不停著操作0x4000_0000地址處內存(所以我們當然期望,它總是命中著),由于系統調度,這一次該線程可能跑在cpu0上,下一次也許就跑在cpu1上了,再下一次也許就是cpu4上了(其實這種行為也叫做CPU migration)
或者舉個這樣的場景也行:
在Linux Kernel系統中,定義了一個全局性的變量,然后多個內核線程(多個CPU)都會訪問該變量.
在以上的場景中,都存在一塊內存(如0x4000_0000地址處內存)被不同的ARM CORE來訪問,這樣就會出現了該數據在main-memory、SCU-0的L2 cache、SCU-1的L2 cache、8個Core的L1 cache不一致的情況。
既然出現了數據在內存和不同的cache中的不一致的情況,那么就需要解決這個問題(也叫維護一致性),那么怎么維護的呢,上面也說了“使用 硬件管理的一致性”,下面就以直接寫答案的方式,告訴你硬件是怎樣維護一致性的。
我們先看一張老的圖(bit.LITTLE架構的)吧
- core1、core1、SCU-0的cache的一致性,是由SCU-0來維護的(至于這里是不是遵守了MESI協議,答案:YES)
- SCU-0、SCU-1、main-memory的一致性,是由于CCI-400來維護的(至于這里是不是遵守了MESI協議,答案:我也不知道)
再看一張比較新的圖(DynamIQ架構的)吧 - core 0的L2 cache、core 1的L2 cache、DSU-0 L3 cache的一致性 由DSU-0來維護(至于這里是不是遵守了MESI協議,答案: YES)
- DSU-0 L3 cache、DSU-1 L3 cache、Mali的L2 cache、system cache、main-memory的一致性是由于CCI-550來維護的(至于這里是不是遵守了MESI協議,答案:我也不知道)
MESI、MOESI 的介紹
既然您一味著堅持要學習MESI、MOESI,那么咱也不能不介紹對不,緊跟著大佬們步伐,網上抄一抄(注意:那不叫抄,那叫借鑒)
首先是Modified Exclusive Shared Invalid (MESI) 協議中定義了4個狀態:
| Modified (M) | 這行數據有效,數據已被修改,和內存中的數據不一致,數據只存在于該高速緩存中 |
| Exclusive (E) | 這行數據有效,數據和內存中數據一致,數據只存在于該高速緩存中 |
| Shared (S) | 這行數據有效,數據和內存中數據一致,多個高速緩存有這行數據的副本 |
| Invalid (I) | 這行數據無效 |
其次,在ARM的很多core中,定義了第五種狀態Shared Modified,這種稱之為MOESI協議. 而ARM使用的則是MOESI的變體(啥叫變體,咋變的,變的哪些,文當它沒有說)
然后我們通過數據流圖的方式,觀看下MESI這四種狀態的情況:
MESI狀態之間的切換:
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
總結
看完以上信息,我們再次總結一下,我們學習cache一致性,我們最大的困惑或瓶頸是啥,是不理解MESI嗎?應該還是對架構的理解和認知。學習MESI,不如去學習DSU、CCI-550原理吧。
總結
以上是生活随笔為你收集整理的有关多核一致性的理解和思考的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: `Caused by: java.lan
- 下一篇: cache/TLB里分别都有什么?