GPGPU-Sim學習(代碼解讀)-如何實現Bypass L1D cache

來填坑了

最近幾年,國際上很多研究者開始關注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,分別是

  1. 1375行的bool ldst_unit::memory_cycle()函數
  2. 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了,但在寫回時仍將數據寫回到了緩存中,會造成衝突。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章