赞
踩
目录
八、Lifecycle of a Network Traversal
九、Running Garnet2.0 with Synthetic Traffic
官网教程:gem5: Garnet 2.0
Garnet2.0是gem5内部的一个详细互连网络模型,是在2009年发表的原始Garnet模型的基础上进行构建的。目前正在开发中,并将定期推送具有更多功能的补丁到gem5中。
其他与Garnet相关的额外补丁和工具支持(不属于存储库),可以在佐治亚理工学院的Garnet页面查看:garnet | Synergy Lab。
Garnet2.0是一个在芯片上网络路由器的周期精确微体系结构实现。它通过利用gem5的ruby内存系统模型提供的拓扑和路由基础设施来实现。默认情况下,Garnet2.0采用先进的1周期流水线作为路由器的设计。然而,通过在拓扑中指定任意数量的周期,可以在任何路由器中添加额外的延迟。
此外,Garnet2.0还可以通过在路由器和链路中设置适当的延迟来模拟片外互连网络。这使得Garnet2.0不仅适用于芯片内部的网络模拟,还可以扩展到模拟片外的互连网络。通过调整路由器和链路的延迟,可以模拟片外网络中的传输延迟和信号传播延迟等特性。
相关文件:
Garnet网络可以通过添加参数“--network=garnet2.0”来实现。
Garnet2.0使用了Network.py中的通用网络参数:
其他参数在garnet2.0/GarnetNetwork.py中指定:
Garnet2.0是建立在gem5的ruby内存系统模型之上的,利用其提供的拓扑基础设施。
Garnet2.0可以对任意异构的拓扑结构进行建模。
在拓扑文件中,每个路由器都可以被分配一个独立的延迟值,以覆盖默认值。此外,每个链路还有两个可选参数:src_outport和dst_inport,它们是源路由器和目标路由器的输出和输入端口的名称字符串。这些参数可以在garnet2.0内部用于实现自定义的路由算法(例如,在一个网格(Mesh)拓扑中,从西向东的链路的src_outport设置为"west",dst_inport设置为"east")。
以下是一些与网络组件相关的说明:
Garnet2.0是利用gem5的ruby内存系统模型提供路由基础设施的一个组件。
默认情况下,Garnet2.0使用基于确定性表格的最短路径路由算法作为默认的路由算法。该算法会根据预先定义的路由表来确定数据包应该沿着哪条路径进行转发。链路权重可以用于优先考虑某些链路,以便在路由选择时更加灵活。关于如何填充路由表的详细信息可以参考"src/mem/ruby/network/Topology.cc"文件。
自定义路由(Custom Routing):为了模拟自定义的路由算法,例如自适应路由,提供了一个框架来为每个链路命名源出口(src_outport)和目的入口(dst_inport),并在garnet内部使用它们来实现路由算法。例如,在网格(Mesh)拓扑结构中,可以通过将flit沿着“west”输出端口链路发送,直到flit不再具有任何X方向的跳数,然后随机选择剩余链路之一(或根据下一个路由器的VC可用性选择)(有关该实现方式的详细内容可以参考"src/mem/ruby/network/garnet2.0/RoutingUnit.cc"文件中的outportComputeXY()函数)。类似地,可以实现outportComputeCustom()函数,并通过在命令行中添加--routing-algorithm=2来调用。
多播消息(Multicast messages):需要注意的是,模拟的网络不支持硬件内部的多播消息。多播消息会在网络接口处被分解为多个单播消息进行传输和处理。
虚拟通道流量控制是在该设计中使用的一种技术。它将通信通道划分为多个虚拟通道,每个虚拟通道可以独立地容纳一个数据包。
在设计中,存在两种类型的虚拟通道,即控制通道和数据通道。控制通道用于传输控制信息,而数据通道用于传输实际的数据。
每个虚拟通道都有一个与之关联的缓冲区,用于存储待传输的数据包。这些缓冲区的深度可以在GarnetNetwork.py文件中进行独立的控制。默认情况下,控制通道的缓冲区深度为1个flit(流片片段),而数据通道的缓冲区深度为4个flit。
除了缓冲区深度之外,数据包的大小也是虚拟通道流量控制中的一个重要参数。在该设计中,控制包的默认大小为1个flit,而数据包的默认大小为5个flit。
在Garnet2.0路由器中,传入的flit经历以下操作:
缓冲写入(Buffer Write,BW):传入的flit被存储在其所属的虚拟通道(VC)中进行缓冲。
路由计算(Route Compute,RC):缓冲的flit计算出它应该发送到的输出端口,并将这个信息存储在其VC中。
交换机分配(Switch Allocation,SA):所有缓冲的flit尝试在下一个周期中为交换机端口预留位置。这个分配过程是可分离的,首先每个输入端使用输入仲裁器选择一个输入VC,并发出一个交换机请求。然后,每个输出端通过输出仲裁器解决冲突,确定哪些请求可以成功分配。在有序虚拟网络中,所有的仲裁器都以队列方式工作,以维持点对点的顺序。对于其他类型的网络,仲裁器采用轮询方式。
VC选择(VC Selection,VS):在交换机分配过程中胜出的flit从其所属的输出端口中选择一个空闲的虚拟通道(VC),如果该flit是一个头部(HEAD)或头尾(HEAD_TAIL)flit。
交换机遍历(Switch Traversal,ST):在交换机分配成功后,胜出的flit通过交换机进行遍历,从输入端口转发到输出端口。
链路遍历(Link Traversal,LT):经过交换机遍历后,flit通过链路传输到达下一个路由器。
在默认设计中,缓冲写入(BW)、路由计算(RC)、交换机分配(SA)、VC选择(VS)和交换机遍历(ST)都在同一个周期内完成。链路遍历(LT)则在下一个周期中进行。
注意:如果需要模拟多周期路由器(Multi-cycle Router),可以在拓扑文件中指定每个路由器的延迟,或者修改src/mem/ruby/network/BasicRouter.py中的默认路由器延迟。这样做会使缓冲的flit在路由器中等待(延迟-1)个周期,然后才能参与交换机分配过程。
在每个路由器的输入端口中,存在number_of_virtual_networks个虚拟网络(Vnets),每个虚拟网络包含vcs_per_vnet个虚拟通道(VC)。虚拟通道(VC)可以被认为是在同一输入端口上的不同逻辑通道,用于在路由器内部缓存和传输数据。
对于控制虚拟网络,每个VC具有buffers_per_ctrl_vc(默认为1)个缓冲深度。这意味着每个VC可以同时缓存1个控制消息。
对于数据虚拟网络,每个VC具有buffers_per_data_vc(默认为4)个缓冲深度。这意味着每个VC可以同时缓存4个数据包。
为了维护关于可用VC和每个VC内缓冲区数量的信息,使用信用(Credits)进行传递。Credits是一种表示可用资源的计数器,用于指示虚拟通道中可供使用的空闲VC数量以及每个VC中剩余的缓冲区数量。路由器通过在传输过程中更新Credits来跟踪可用资源的状态,并根据Credits的值进行决策,例如选择可用的VC进行传输。这样可以避免拥塞和资源竞争,以提高网络性能和可靠性。
组件之间的交互过程:
(使用合成流量运行Garnet2.0)
Garnet2.0可以独立运行,并通过合成流量进行测试:Garnet合成流量。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。