多级cache之间的替换(缓存)策略
引流關鍵詞:緩存,高速緩存,cache, CCI,CMN,CCI-550,CCI-500,DSU,SCU,L1,L2,L3,system cache, Non-cacheable,Cacheable, non-shareable,inner-shareable,outer-shareable, optee、ATF、TF-A、Trustzone、optee3.14、MMU、VMSA、cache、TLB、arm、armv8、armv9、TEE、安全、內存管理、頁表…
快速鏈接:
.
👉👉👉 個人博客筆記導讀目錄(全部) 👈👈👈
目錄
- 1、DynamIQ架構中L1 cache的替換策略(以cortex-A710為例)
- 2、core cache的替換策略(以cortex-A710為例)
- 2.1、L1 data cache 遵從MESI協議
- 2.2、L1 instruction cache 沒有遵從MESI協議
- 2.3、MESI協議的介紹
- 3、cluster cache 之間的替換策略
- 4、總結
- 參考
思考:
1、L1 cache的替換策略是什么,L2和L3的呢
2、哪些的替換策略是由硬件決定的(定死的,軟件不可更改的),哪些的替換策略是軟件可以配置的?
3、在經典的 DynamIQ架構 中,數據是什么時候存在L1 cache,什么時候存進L2 cache,什么時候又存進L3 cache,以及他們的替換策略是怎樣的? 比如什么時候數據只在L1? 什么時候數據只在L2? 什么時候數據只在L3? 還有一些組合,比如什么時候數組同時在L1和L3,而L2沒有? 這一切的規則是怎樣定義的?
說明:
本文討論經典的DynamIQ的cache架構,忽略 big.LITTLE的cache架構
1、DynamIQ架構中L1 cache的替換策略(以cortex-A710為例)
我們先看一下DynamIQ架構中的cache中新增的幾個概念:
- (1) Strictly inclusive: 所有存在L1 cache中的數據,必然也存在L2 cache中
- (2) Weakly inclusive: 當miss的時候,數據會被同時緩存到L1和L2,但在之后,L2中的數據可能會被替換
- (3) Fully exclusive: 當miss的時候,數據只會緩存到L1
其實inclusive/exclusive屬性描述的正是是 L1和L2之間的替換策略,這部分是硬件定死的,軟件不可更改的。
我們再去查閱 ARMV9 cortex-A710 trm手冊,查看該core的cache類型,得知:
- L1 I-cache和L2之間是 weakly inclusive的
- L1 D-cache和L2之間是 strictly inclusive的
也就是說:
- 當發生D-cache發生miss時,數據緩存到L1 D-cache的時候,也會被緩存到L2 Cache中,當L2 Cache被替換時,L1 D-cache也會跟著被替換
- 當發生I-cache發生miss時,數據緩存到L1 I-cache的時候,也會被緩存到L2 Cache中,當L2 Cache被替換時,L1 I- cache不會被替換
再次總結 : L1 和 L2之間的cache的替換策略,I-cache和D-cache可以是不同的策略,每一個core都有每一個core的做法,請查閱你使用core的手冊。
2、core cache的替換策略(以cortex-A710為例)
為了能夠將DynamIQ架構和bit.LITTLE架構的cache放在一起介紹,我們將DynamIQ架構中的L1/L2 cache看做成一個單元統稱Core cache,bit.LITTLE架構中的L1 Cache也稱之為core cache.
DynamIQ架構中DSU中的L3 cache稱之為cluster cache,bit.LITTLE架構中SCU中的L2 cache也稱之為cluster cache。
2.1、L1 data cache 遵從MESI協議
在L1 data cache TAG中,有記錄MESI相關比特, 然后將一個core內的cache看做是一個整體,core與core之間的緩存一致性,就由DSU執行MESI協議來維護
2.2、L1 instruction cache 沒有遵從MESI協議
因為對于Instruction cache來說,都是只讀的,cpu不會改寫I-cache中的數據,所以也就不需要硬件維護多核之間緩存的不一致
2.3、MESI協議的介紹
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
3、cluster cache 之間的替換策略
說實話,core cache / cluster cache / 這個名字可能不好,感覺叫private cache 和 share cache也會更好,我也不知道官方一般使用哪個,反正我們能理解其意思即可吧。
那么他們之間的替換策略是怎樣的呢?
我們知道MMU的頁表中的表項中,管理者每一塊內存的屬性,其實就是cache屬性,也就是緩存策略。
其中就有cacheable和shareable、Inner和Outer的概念。如下是針對 DynamIQ 架構做出的總結,注意哦,僅僅是針對 DynamIQ 架構的cache。
-
如果將block的內存屬性配置成Non-cacheable,那么數據就不會被緩存到cache,那么所有observer看到的內存是一致的,也就說此時也相當于Outer Shareable。
其實官方文檔,也有這一句的描述:
在B2.7.2章節 “Data accesses to memory locations are coherent for all observers in the system, and correspondingly are treated as being Outer Shareable” -
如果將block的內存屬性配置成write-through cacheable 或 write-back cacheable,那么數據會被緩存cache中。write-through和write-back是緩存策略。
-
如果將block的內存屬性配置成 non-shareable, 那么core0訪問該內存時,數據緩存的到Core0的L1 D-cache / L2 cache (將L1/L2看做一個整體,直接說數據會緩存到core0的private cache更好),不會緩存到其它cache中。
-
如果將block的內存屬性配置成 inner-shareable, 那么core0訪問該內存時,數據只會緩存到core 0的L1 D-cache / L2 cache和 DSU L3 cache,不會緩存到System Cache中(當然如果有system cache的話 ) , (注意這里MESI協議其作用了)此時core0的cache TAG中的MESI狀態是E, 接著如果這個時候core1也去讀該數據,那么數據也會被緩存core1的L1 D-cache / L2 cache 和DSU0的L3 cache(白字黑字,絕不瞎說,請參見文末的[1] DSU TRM片段), 此時core0和core1的MESI狀態都是S
-
如果將block的內存屬性配置成 outer-shareable, 那么core0訪問該內存時,數據會緩存到core 0的L1 D-cache / L2 cache 、cluster0的DSU L3 cache 、 System Cache中, core0的MESI狀態為E。如果core1再去讀的話,則也會緩存到core1的L1 D-cache / L2 cache,此時core0和core1的MESI都是S。這個時候,如果core7也去讀的話,數據還會被緩存到cluster1的DSU L3 cache. 至于DSU0和DSU1之間的一致性,非MESI維護,具體怎么維護的請看DSU手冊,本文不展開討論。
| non-shareable | 數據不會緩存到cache (對于觀察則而言,又相當于outer-shareable) | core0訪問該內存時,數據緩存的到Core0的L1 D-cache / L2 cache (將L1/L2看做一個整體,直接說數據會緩存到core0的private cache更好),不會緩存到其它cache中 | 同左側 |
| inner-shareable | 數據不會緩存到cache (對于觀察則而言,又相當于outer-shareable) | core0訪問該內存時,數據只會緩存到core 0的L1 D-cache / L2 cache和 DSU L3 cache,不會緩存到System Cache中(當然如果有system cache的話 ) , (注意這里MESI協議其作用了)此時core0的cache TAG中的MESI狀態是E, 接著如果這個時候core1也去讀該數據,那么數據也會被緩存core1的L1 D-cache / L2 cache 和DSU0的L3 cache, 此時core0和core1的MESI狀態都是S | 同左側 |
| outer-shareable | 數據不會緩存到cache (對于觀察則而言,又相當于outer-shareable) | core0訪問該內存時,數據會緩存到core 0的L1 D-cache / L2 cache 、cluster0的DSU L3 cache 、 System Cache中, core0的MESI狀態為E。如果core1再去讀的話,則也會緩存到core1的L1 D-cache / L2 cache,此時core0和core1的MESI都是S 思考:那么此時core7去讀取會怎樣? | 同左側 |
4、總結
- dynamIQ 架構中 L1和L2之間的替換策略,是由core的inclusive/exclusive的硬件特性決定的,軟無法更改
- core cache之間的替換策略,是由SCU(或DSU)執行的MESI協議中定義的,軟件也無法更改。
- cluster cache之間的替換策略,是由于MMU頁表中的內存屬性定義的(innor/outer/cacheable/shareable),軟件可以修改
參考
- [1] DSU TRM片段
總結
以上是生活随笔為你收集整理的多级cache之间的替换(缓存)策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 04-多核多cluster多系统之间缓存
- 下一篇: A53 cache的架构解读