最近在總結Cache相關的東西,看到Gem5裏面關於Cache相關的資料,覺得還是比較完整的. 其對cache的抽象是透過Ruby/C++/Python 來完成的,專門為Cache開發了一個描述語言SLICC,類似C++,Python語言編寫其Complier。基本的這些語法糖,就不談了,直說幹貨。
現在談談閱後感:
MSI Cache Controller和 MSI Directory Controller的特點:
S cache 不提供數據(可以提供,要看具體實作,只是這個實作為了簡單不支持)
M cache 的數據提供數據(無論是GetM/GetS,這個M是系統中唯一的最新數據,肯定要提供)
Gem5 MSI Example Cache protocol
![](https://img.jasve.com/2024-2/71b29b9c91b47acc14928f6b1e3461ae.webp)
![](https://img.jasve.com/2024-2/d8d5b14023d69b7d3f7ff3ce58e39d55.webp)
![](https://img.jasve.com/2024-2/99c3b665b6ce6d3ab04d5b761eabfb6c.webp)
![](https://img.jasve.com/2024-2/5a311db732b1d668579c864dd23235c6.webp)
![](https://img.jasve.com/2024-2/57ad267fcc86731d4aa0ae6bd7a699e0.webp)
![](https://img.jasve.com/2024-2/5bf424d4e0cb2b8a07f342b5ff6c1ff8.webp)
![](https://img.jasve.com/2024-2/28cf1ff6be120db9683964294994f826.webp)
![](https://img.jasve.com/2024-2/40dd1abb63c07101e732be13610a10db.webp)
Gem5 MSI Directory Implementation
![](https://img.jasve.com/2024-2/5db5e91ad02b71616baff0fd70464017.webp)
![](https://img.jasve.com/2024-2/8f739f40fc1b2c238e6cc43f2b9089f6.webp)
![](https://img.jasve.com/2024-2/0db4fd1e555c3d36c74f2fc3aacbee47.webp)
![](https://img.jasve.com/2024-2/ab499e2721a54d69c39a62be9b566ed6.webp)
![](https://img.jasve.com/2024-2/4e5ab0199714f2f3eb8149f6bbd8f3ff.webp)
小結
- 這個實作的簡單之處在於,S cache 不提供數據: HN中S 態,在收到RN GetM/GetS的時候,雖然知道up stream RN有數據(不考慮Silent),但是HN還是從Memory 裏面讀,不讓RN fwd S態數據。這個原因是HN要充當「管理"角色,RN fwd path的一定要讓HN知道的,不然一致性會出問題,Global Order不能保證。
- M 提供數據: HN中M態,存取許可權是Invalid的,最新數據在upsteam RN,
- 收到RN的 GetS, HN自己沒有辦法獨立完成,所以要Fwd給M態RN,RN 的數據提供Original RN,並且給HN(這是維護S態語意的需要,也是HN充當「管理角色」的需要)
- 收到RN的GetM,HN把目錄sharelist,ownerlist更新一下,HN不保證fwd是否完成,HN如果繼續FwdGetM/FwdGetS 到一個IM D,SM_D的RN上,此RN會Stall這個請求(和ACE不一樣,Fwd*是可以在RN阻塞的,就是因為clean的數據都是從Memory裏面取,不會形成Depency Cycle)
- 這個實作的簡單之處還在於,一致性請求只有GetM/GetS,沒有像ACE/CHI,那種ReadUnique/CLeanUnique/MakeUnique只有GetM
- 變I態,只有cache replacement 才會引入暫態。S態和M態如果不是replacement,收到inv/FwdGetM就直接變成I態.
- 不支持slient clean cacheline.
![](https://img.jasve.com/2024-2/4dcdd1b743a7417e6208078f72faa710.webp)
- I態toM態相關的暫態,收到Directory 的Data或者peer RN的data,已經peer RN的Inv_Ack
- M態toI態相關的暫態, 最新數據還在這裏,有人需要,還是要提供,說明RN此時的race已經失敗。
![](https://img.jasve.com/2024-2/3c12c9ff36cff01483cf143fa6e1c22d.webp)
![](https://img.jasve.com/2024-2/254885ecbf9198593ff57238ee70f343.webp)
![](https://img.jasve.com/2024-2/2d00895528a31c3aaca2c80fb41f96eb.webp)