來填坑了
最近幾年,國際上很多研究者開始關注GPGPU緩存調度的研究,其中bypass L1D cache便是其中的一個關注點,比如GPU上的CBWT(A類)算法,Doupled L1D(B類)算法和MRPB(A類),CPU上的PDP(A類)等。這篇博客的內容爲如何在GPGPU-Sim上實現bypass L1D cache的緩存請求。
GPGPU-Sim版本:v3.2.2
關注文件:shader.cc
在shader.cc文件中,有兩處關於bypass,分別是
- 1375行的bool ldst_unit::memory_cycle()函數
- 1795行的void ldst_unit::cycle()函數
在memory_cycle()函數內,即1388行之後bool bypassL1D = false;
添加我們想要的代碼,修改bypassL1D的值,即可實現bypass L1D cache緩存請求。
回答評論裏的問題:
1、請問1388行之後用來判斷是否bypass的程式碼是什麼意思阿~
答:舉個例子,我想讓ID=0核心的所有緩存指令全都bypass,那麼實現代碼如下:
bool bypassL1D = false;
if(m_core->get_sid() == 0)
inst.cache_op = CACHE_GLOBAL;
2、另外請問memory_cycle()以及cycle()的差別
答:memory_cycle()爲執行階段的bypass,cycle()爲寫回階段的bypass。
這就解釋了bypass爲何要inst.cache_op = CACHE_GLOBAL;
這樣實現。下面的實現是錯誤的,
bool bypassL1D = false;
if(m_core->get_sid() == 0)
bypassL1D = true;
因爲這樣只能保證執行階段將該指令bypass了,但在寫回時仍將數據寫回到了緩存中,會造成衝突。