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

你可能感兴趣的:(gem5,Gem5,NoC,Garnet2.0)