GEM5教程-互联网络
- 一、如何调用网络
- 1、简单的网络
- 2、Garnet 网络
- 二、拓扑结构
- 1、相关的文件
- 2、拓扑描述
- 3、在每个拓扑中,每个链路和每个路由器都可以独立地传递一个覆盖默认值的参数(在BasicLink.py和BasicRouter.py中):
- 三、路由
- 1、基于表的路由(默认)
- 2、自定义路由算法
- 四、流量控制与路由器微体系结构
- 1、简单网络
- 2、Garnet
- 3、Garnet2.0
- GEM5系列教程索引
一、如何调用网络
1、简单的网络
./build/ALPHA/gem5.debug \
configs/example/ruby_random_test.py \
--num-cpus=16 \
--num-dirs=16 \
--network=simple
--topology=Mesh_XY \
--mesh-rows=4
默认网络很简单,默认拓扑是crossbar
。
2、Garnet 网络
./build/ALPHA/gem5.debug \
configs/example/ruby_random_test.py \
--num-cpus=16 \
--num-dirs=16 \
--network=garnet2.0 \
--topology=Mesh_XY \
--mesh-rows=4
二、拓扑结构
不同控制器之间的连接是通过python文件指定的。所有外部链路(控制器和路由器之间)都是双向的。所有内部链路(路由器之间)都是单向的——这允许每个链路上的每个方向权重偏向路由决策。
1、相关的文件
src/mem/ruby/network/topologies/Crossbar.py
src/mem/ruby/network/topologies/CrossbarGarnet.py
src/mem/ruby/network/topologies/Mesh_XY.py
src/mem/ruby/network/topologies/Mesh_westfirst.py
src/mem/ruby/network/topologies/MeshDirCorners_XY.py
src/mem/ruby/network/topologies/Pt2Pt.py
src/mem/ruby/network/Network.py
src/mem/ruby/network/BasicLink.py
src/mem/ruby/network/BasicRouter.py
2、拓扑描述
(1)Crossbar
:每个控制器(L1/L2/目录)都连接到一个简单的交换机。每个交换机都连接到一个中央交换机(模拟横杆)。这可以通过–topology=Crossbar从命令行调用。
(2)CrossbarGarnet
:每个控制器(L1/L2/目录)通过一个garnet路由器(内部模拟crossbar和分配器)连接到每个其他控制器。这可以通过–topology=CrossbarGarnet从命令行调用。
(3)Mesh_*
:此拓扑要求目录数等于CPU数。路由器/交换机的数量等于系统中CPU的数量。每个路由器/交换机连接到一个L1、一个L2(如果存在)和一个目录。网格中的行数必须由–mesh-rows指定。此参数还可以创建非对称网格。
Mesh_XY
:XY路线脉冲。所有x向链路的权重均为
1,而所有y向链路的权重均为2。这将强制所有邮件在使用Y-links之前首先使用X-links。它可以通过–topology=Mesh_XY从命令行调用
Mesh_westfirst
:西路路由。所有西向链路的权重均为1,所有其他链路的权重均为2。这将强制所有邮件在使用其他链接之前,首先使用西向链接。它可以通过–topology=Mesh_westfirst从命令行调用
(4)
MeshDirCorners_XY
:此拓扑要求目录数等于4。路由器/交换机的数量等于系统中CPU的数量。每个路由器/交换机连接到一个L1,一个L2(如果存在)。每个角落路由器/交换机连接到一个目录。它可以通过–topology=MeshDirCorners_XY从命令行调用。网格中的行数必须由–mesh-rows指定。采用XY路由算法。
(5)
Pt2Pt:每个控制器(L1/L2/目录)通过直接链接连接到每个其他控制器。这可以通过–topology=Pt2Pt从命令行调用。
3、在每个拓扑中,每个链路和每个路由器都可以独立地传递一个覆盖默认值的参数(在BasicLink.py和BasicRouter.py中):
(1)
链接参数:
延迟
:链接内的遍历延迟。
权值
:与此链接关联的权重。此参数由路由表在决定路由时使用,如下路由中所述。
带宽因数
:仅用于简单网络以字节为单位指定链接宽度。这转化为带宽乘数(simple/SimpleLink.cc),单个链路带宽变为带宽乘数x端点带宽(在SimpleNetwork.py中指定)。在garnet中,带宽由GarnetNetwork.py中的ni_flit_size指定)
(2)
内部链接参数:
src_outport
:源路由器的输出端口的名称字符串。
dst_inport
:目标路由器上输入端口的名称字符串。
路由器可以使用这两个参数在garent2.0中实现自定义路由算法(参见路由)。
(3)
路由器参数:
延迟
:每个路由器的延迟。仅由garent2.0支持。
三、路由
1、基于表的路由(默认)
基于拓扑结构,最短路径图遍历用于填充每个路由器/交换机的路由表。这是在src/mem/ruby/network/Topology.cc中完成的。默认的路由算法是基于表的,并尝试选择具有最少链接遍历次数的路由。可以在拓扑文件中为链接赋予权重,以对不同的路由算法建模。例如,在Mesh_XY.py和MeshDirCorners_XY.py中,Y方向链接的权重为2,而X方向链接的权重为1,从而产生XY遍历。在Mesh_westfirst.py中,西方链接的权重为1,所有其他链接的权重为2。在garnet2.0中,路由算法在具有相同权重的链路之间随机选择。在简单的网络中,它静态地在具有相等权重的链路之间进行选择。
2、自定义路由算法
在garent2.0中,我们提供了实现自定义(包括自适应)路由算法的额外支持(请参见src/mem/ruby/network/garent2.0/RoutingUnit.cc中的outportComputeXY())。链路的src_outport和dst_inport字段可用于为每个链路提供自定义名称(例如,如果是网格,则为方向),并且这些字段可在garnet内部用于实现任何路由算法。可以通过设置–routing algorithm=2从命令行中选择自定义路由算法。请参阅configs/network/Network.py和src/mem/ruby/network/garnet2.0/GarnetNetwork.py
四、流量控制与路由器微体系结构
Ruby支持Simple和Garnet两种网络模型,它们分别权衡了详细建模和仿真速度。
1、简单网络
简单网络的细节在GEM5教程-简单网络
的专题中。
2、Garnet
原始的(2009) Garnet 网络的细节GEM5教程-Garnet
的专题中。代码库不再支持此设计。
3、Garnet2.0
新的(2016)Garnet2.0网络详情在GEM5教程-Garnet2.0
专题中。
GEM5系列教程索引
GEM5教程–gem5开始之旅(一)
GEM5教程–修改和拓展gem5(三)
GEM5教程–修改和拓展gem5(四)
GEM5教程-Garnet