gem5中NoC的Garnet2.0

gem5作爲multicore的一個仿真軟件,在各大高手的努力下,也有了NoC的部分。好像早就有了,就是最近我纔用到,才注意到。

我在gem5中看到的就是garnet2.0了,他是在ruby下的NoC模型。

基本的使用方法是

--ruby --network=garnet2.0 --topology=XXX --num-dir=XXX   XXX是需要自己填的

查看具體參數的話--ruby -help

如果使用FS的話,編譯gem5需要指定使用PROTOCOL,選項的話在/gem5/config/ruby/中,例子如下

PROTOCOL=MOESI_hammer

他功能還是挺全的,可以選擇clock,topology,latency,buffers,routing-algorithm等。

有一個課程,有條件的可以參加,像我沒有條件的,就只能看看PPT和佈置的作業自己學習了。

Garnet2.0中的NoC由如下幾個部分組成:

  • GarnetNetwork
  • GarnetIntlink
  • GarnetExtlink
  • GarnetRouter
  • GarnetNetworkInterfac

各個部分的連接是在/gem5/config/ruby/Ruby.py中

 

1、文件查看梳理

具體的源碼在/gem5/src/mem/ruby中

 

先看network中的文件,賊尷尬

Topology.cc/hh:

在頭文件中,定義了Topology的Class。包括了link,switch等。

createLInks函數創建各個switch的最短連接

  1. 首先找到最大的switch_id,注意這裏的switch不僅是路由器,還包括controller,所以最大的switch_id + 1 就是所有的節點加路由器。比如network_test,如果是4*4的Mesh,每個節點有一個L1和direcotry,則0-31是controller的src,32-63是controller的dest,64-79爲路由器,所以總共是80個switch。
  2. 權重矩陣、latency矩陣、inter_switch矩陣的大小都設爲switch數目*switch數目。初始化時,遍歷每個m_link_map,把其中的源和目的的權重找到,賦給相應的weight[src][dest]。
  3. 接下來調用shortest_path函數,尋找任意兩個節點(包括路由和controller)之間的最短路徑。即根據權重矩陣,更新延時矩陣和中間路由矩陣,返回最短距離矩陣。權重矩陣不變
  4. 接着遍歷權重矩陣,找到所有權重矩陣中非INFINITE_LATENVY的元素,即有鏈路,則得到以鏈路起點爲起點,終點爲下一跳的初始一Hop,所能達到的目的地的集合。形成了一種類似反向的路由表。
  5. 最後正式建立起鏈路,使用makeLink函數,把路由表的入口(即這個鏈路能夠到達的目的地的集合)也傳進鏈路的屬性中。

BasicLink.cc/hh,BasicRouter.cc/hh,MessageBuffer.cc/hh

看名稱就知道設置了基礎的Link、Router,Buffer的類,就不多說了。Buffer還有一些函數。

Network.cc/hh

這個是將上述通用的部件組合在一起,並進行了初始化。有一個函數是addressToNodeID,這個是map了每個節點的地址。

 

上面的是通用的配置,因爲我主要用的是Garnet2.0,所以還得看garnet2.0文件夾下面的代碼。這就比較困難了,因爲我NoC的基礎也不是很好,哎。

看代碼先看README,

先說說readme,readme中也有了一些解釋。

大概就是所有的當scheduleevent之後就會在規定時間調用各種wakeup函數,使整個流程完成。

然後是其他的文件。

未完待續

 

 

 

2、增加Topology

首先在/gem5/config/ruby/topologies中有很多的topology可以選擇。

我們可以仿照着寫,一個topology有如下的部分組成

  • nodes:節點,也是controller,比如每個CPU,memory,DMA都算做一個node,初始化中就構造了
  • routers:路由器,由Router函數構造
  • link:連接,分爲ext_link(外部連接)和int_link(內部連接)。外部連接是router連接controller的,內部連接是routers之間的連接。分別由函數Extlink和Intlink構建

函數返回一個topology對象,其屬性包括routers以及extlink和inlink,都是對象數組。此MakeTopology函數的主要任務是構建路由器以及各種節點與路由器之間、路由器與路由器之間的連線。

3、增加routing-algorithm

/gem5/configs/network/Network.py

這裏是輸出的參數選擇,在“--routing-algotithm”中增加自己的算法

/gem5/src/men/ruby/network/garnet2.0/RoutingUnit.cc/hh

這個文件具體定義routing-algorithm

函數outportCompute是選擇算法的函數,默認是使用路由表

在switch中選擇routing_algorithm,使用對應的lookupxxxxx函數

接下來就看看lookupxxx函數,比如lookupRoutingTable函數

  1. 讀取之前配置的routingtable,找到所有可能的輸出鏈路候選
  2. 遍歷所以的鏈接,選擇權重最小的鏈路
  3. 如果權重最小鏈路只有一個則選擇他,有多個則隨機選擇

可以按照這個來寫自己的routing_algorithm,注意是輸入和輸出。

 

 

 

 

 

參考:

http://synergy.ece.gatech.edu/tools/garnet/

http://www.gem5.org/Garnet2.0

Extending Gem5-Garnet for Efficient and Accurate Trace-driven NoC Simulation

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