authors: Jason Lowe-Power

gem5 Ruby 互连网络的更多详细信息在 这里

Garnet2.0: 用于异构 SoC 的片上网络模型

Garnet2.0 是 gem5 内部的一个详细互连网络模型。它正在积极开发中,更多功能的补丁将定期推送到 gem5。正在开发的(不属于 repo 的)其他 garnet 相关补丁和工具支持可以在 佐治亚理工学院的 Garnet 页面 找到

Garnet2.0 建立在最初的 Garnet 模型之上,该模型发布于 2009 年

如果您对 Garnet 的使用有助于发表论文,请引用以下论文:

    @inproceedings{garnet,
      title={GARNET: A detailed on-chip network model inside a full-system simulator},
      author={Agarwal, Niket and Krishna, Tushar and Peh, Li-Shiuan and Jha, Niraj K},
      booktitle={Performance Analysis of Systems and Software, 2009. ISPASS 2009. IEEE International Symposium on},
      pages={33--42},
      year={2009},
      organization={IEEE}
    }

Garnet2.0 提供了一个片上网络路由器的周期精确微架构实现。它利用了 gem5 的 ruby 内存系统模型提供的 拓扑路由 基础设施。默认路由器是最先进的 1 周期流水线。支持通过在拓扑中指定,在任何路由器中添加任意周期数的额外延迟。

Garnet2.0 也可以通过在路由器和链路中设置适当的延迟来模拟片外互连网络。

调用

可以通过添加 –network=garnet2.0 来启用 garnet 网络。

配置

Garnet2.0 使用 Network.py 中的通用网络参数:

其他参数在 garnet2.0/GarnetNetwork.py 中指定:

拓扑

Garnet2.0 利用 gem5 的 ruby 内存系统模型提供的 拓扑 基础设施。可以模拟任何异构拓扑。拓扑文件中的每个路由器都可以给定一个独立的延迟,覆盖默认值。此外,每个链路有 2 个可选参数:src_outport 和 dst_inport,它们是包含每个链路的源路由器和目标路由器的输出和输入端口名称的字符串。这些可以在 garnet2.0 内部用于实现自定义路由算法,如下所述。例如,在 Mesh 中,西向东的链路将 src_outport 设置为 “west”,将 dst_inport 设置为 “east”。

路由

Garnet2.0 利用 gem5 的 ruby 内存系统模型提供的 路由 基础设施。默认路由算法是具有最短路径的确定性基于表的路由算法。链路权重可用于优先选择某些链路而不是其他链路。有关路由表如何填充的详细信息,请参见 src/mem/ruby/network/Topology.cc。

自定义路由: 为了模拟自定义路由算法(比如自适应算法),我们提供了一个框架,用 src_outport 和 dst_inport 方向命名每个链路,并在 garnet 内部使用这些来实现路由算法。例如,在 Mesh 中,West-first 可以通过沿着“西”输出端口链路发送 flit 来实现,直到 flit 不再有任何 X- 跳数剩余,然后随机(或基于下一个路由器 VC 可用性)选择剩余链路之一。参见 src/mem/ruby/network/garnet2.0/RoutingUnit.cc 中 outportComputeXY() 是如何实现的。类似地,可以实现 outportComputeCustom(),并通过在命令行中添加 –routing-algorithm=2 来调用。

组播消息: 模拟的网络在网络内部没有硬件多播支持。多播消息在网络接口处被分解为多个单播消息。

流控制

设计中使用了虚拟通道流控制。每个 VC 可以容纳一个数据包。设计中有两种 VC - 控制和数据。每个中的缓冲区深度可以从 GarnetNetwork.py 独立控制。默认值是 1-flit 深的控制 VC,和 4-flit 深的数据 VC。控制数据包的默认大小是 1-flit,数据数据包是 5-flit。

路由器微架构

garnet2.0 路由器执行以下操作:

  1. 缓冲区写入 (BW): 传入的 flit 被缓冲在其 VC 中。
  2. 路由计算 (RC) 缓冲的 flit 计算其输出端口,此信息存储在其 VC 中。
  3. 交换机分配 (SA): 所有缓冲的 flit 尝试为下一个周期预留交换机端口。[分配以 可分离 的方式发生:首先,每个输入使用输入仲裁器选择一个放置交换机请求的输入 VC。然后,每个输出端口通过输出仲裁器解决冲突]。有序虚拟网络中的所有仲裁器都是 排队 的,以维持点对点排序。所有其他仲裁器都是 轮询 的。
  4. VC 选择 (VS): SA 的获胜者从其输出端口选择一个空闲 VC(如果是 HEAD/HEAD_TAIL flit)。
  5. 交换机遍历 (ST): 赢得 SA 的 flit 遍历交叉开关交换机。
  6. 链路遍历 (LT): 来自交叉开关的 flit 遍历链路以到达下一个路由器。

在默认设计中,BW、RC、SA、VS 和 ST 都发生在 1 个周期内。LT 发生在下一个周期。

多周期路由器: 可以通过在拓扑文件中指定每个路由器的延迟,或更改 src/mem/ruby/network/BasicRouter.py 中的默认路由器延迟来模拟多周期路由器。这是通过使缓冲的 flit 在路由器中等待 (latency-1) 个周期才有资格进行 SA 来实现的。

缓冲区管理

每个路由器输入端口有 number_of_virtual_networks 个 Vnet,每个 Vnet 有 vcs_per_vnet 个 VC。控制 Vnet 中的 VC 深度为 buffers_per_ctrl_vc (默认 = 1),数据 Vnet 中的 VC 深度为 buffers_per_data_vc (默认 = 4)。信用用于传递有关空闲 VC 和每个 VC 内缓冲区数量的信息。

网络遍历的生命周期

使用合成流量运行 Garnet2.0

Garnet2.0 可以以独立方式运行并馈送合成流量。详细信息在此处描述:Garnet 合成流量