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