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的最短連接
- 首先找到最大的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。
- 權重矩陣、latency矩陣、inter_switch矩陣的大小都設爲switch數目*switch數目。初始化時,遍歷每個m_link_map,把其中的源和目的的權重找到,賦給相應的weight[src][dest]。
- 接下來調用shortest_path函數,尋找任意兩個節點(包括路由和controller)之間的最短路徑。即根據權重矩陣,更新延時矩陣和中間路由矩陣,返回最短距離矩陣。權重矩陣不變
- 接着遍歷權重矩陣,找到所有權重矩陣中非INFINITE_LATENVY的元素,即有鏈路,則得到以鏈路起點爲起點,終點爲下一跳的初始一Hop,所能達到的目的地的集合。形成了一種類似反向的路由表。
- 最後正式建立起鏈路,使用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函數
- 讀取之前配置的routingtable,找到所有可能的輸出鏈路候選
- 遍歷所以的鏈接,選擇權重最小的鏈路
- 如果權重最小鏈路只有一個則選擇他,有多個則隨機選擇
可以按照這個來寫自己的routing_algorithm,注意是輸入和輸出。
參考:
http://synergy.ece.gatech.edu/tools/garnet/
Extending Gem5-Garnet for Efficient and Accurate Trace-driven NoC Simulation