gem5学习(25):用于异构SoC的片上网络模型——Garnet2.0

目录

一、Invocation

二、Configuration

三、Topology

四、Routing

五、Flow Control

六、Router Microarchitecture

七、Buffer Management

八、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不仅适用于芯片内部的网络模拟,还可以扩展到模拟片外的互连网络。通过调整路由器和链路的延迟,可以模拟片外网络中的传输延迟和信号传播延迟等特性。

相关文件:

  • src/mem/ruby/network/Network.py
  • src/mem/ruby/network/garnet2.0/GarnetNetwork.py
  • src/mem/ruby/network/Topology.cc

一、Invocation

Garnet网络可以通过添加参数“--network=garnet2.0”来实现。

二、Configuration

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

  • number_of_virtual_networks: 这是最大虚拟网络的数量。实际活动虚拟网络的数量由协议确定。
  • control_msg_size: 控制消息的大小,以字节为单位。默认为8。
  • Network.cc中的m_data_msg_size设置为块大小(以字节为单位)+ control_msg_size。

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

  • ni_flit_size: flit的大小,以字节为单位。Flit是从一个路由器发送到另一个路由器的信息的粒度。默认为16(=> 128位)。[1使用16作为默认值可以确保控制消息适应1个flit内,数据消息适应5个flits内]。Garnet要求ni_flit_size与network/BasicLink.py中的bandwidth_factor(带宽因子)相同,因为它不模拟网络内的可变带宽,这意味着ni_flit_size应与网络中的链路宽度相匹配。也可以通过命令行参数“--link-width-bits”来设置ni_flit_size的值。
  • vcs_per_vnet: 每个虚拟网络的虚拟通道(VC)数量。默认为4。也可以通过命令行参数“--vcs-per-vnet”进行设置。
  • buffers_per_data_vc: 数据消息类别中每个VC的flit缓冲区数量。由于数据消息占据5个flits,所以该值可以在1到5之间。默认为4,这意味着每个数据VC具有4个flit缓冲区。
  • buffers_per_ctrl_vc: 控制消息类别中每个VC的flit缓冲区数量。由于控制消息占据1个flit,并且一个VC一次只能容纳一条消息,所以该值必须为1。默认为1,这意味着每个控制VC具有4个flit缓冲区。
  • routing_algorithm:
    • 0: 基于权重的表(默认值);
    • 1: XY;
    • 2: 自定义。

三、Topology

Garnet2.0是建立在gem5的ruby内存系统模型之上的,利用其提供的拓扑基础设施。

Garnet2.0可以对任意异构的拓扑结构进行建模。

在拓扑文件中,每个路由器都可以被分配一个独立的延迟值,以覆盖默认值。此外,每个链路还有两个可选参数:src_outport和dst_inport,它们是源路由器和目标路由器的输出和输入端口的名称字符串。这些参数可以在garnet2.0内部用于实现自定义的路由算法(例如,在一个网格(Mesh)拓扑中,从西向东的链路的src_outport设置为"west",dst_inport设置为"east")。

以下是一些与网络组件相关的说明:

  • GarnetNetwork:这是顶层对象,用于实例化所有的网络接口(NetworkInterface)、路由器(Router)和链路(NetworkLink)。在Topology.cc中调用方法以添加"外部链路"(external links)连接网络接口和路由器,以及添加"内部链路"(internal links)连接路由器之间。
  • NetworkInterface:每个网络接口(NI)通过一侧的MsgBuffer接口与一个一致性控制器连接,另一侧连接到路由器。每个协议消息都被放入一个包含一个flit控制消息或多个(默认为5个)flit数据消息的缓冲区,并注入到路由器中。多个网络接口可以连接到同一个路由器,例如,在网格(Mesh)拓扑中,缓存和目录控制器通过各自的网络接口连接到同一个路由器。
  • Router:路由器负责输出链路的仲裁和路由器之间的流量控制。
  • NetworkLink:网络链路承载flit,可以分为三种类型:EXT_OUT_(路由器到网络接口),EXT_IN_(网络接口到路由器)和INT_(内部路由器到路由器)。
  • CreditLink:信用链路在路由器之间携带虚拟通道(VC)/缓冲区的信用,用于流量控制。

四、Routing

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):需要注意的是,模拟的网络不支持硬件内部的多播消息。多播消息会在网络接口处被分解为多个单播消息进行传输和处理。

五、Flow Control

虚拟通道流量控制是在该设计中使用的一种技术。它将通信通道划分为多个虚拟通道,每个虚拟通道可以独立地容纳一个数据包。

在设计中,存在两种类型的虚拟通道,即控制通道和数据通道。控制通道用于传输控制信息,而数据通道用于传输实际的数据。

每个虚拟通道都有一个与之关联的缓冲区,用于存储待传输的数据包。这些缓冲区的深度可以在GarnetNetwork.py文件中进行独立的控制。默认情况下,控制通道的缓冲区深度为1个flit(流片片段),而数据通道的缓冲区深度为4个flit。

除了缓冲区深度之外,数据包的大小也是虚拟通道流量控制中的一个重要参数。在该设计中,控制包的默认大小为1个flit,而数据包的默认大小为5个flit。

六、Router Microarchitecture

在Garnet2.0路由器中,传入的flit经历以下操作:

  1. 缓冲写入(Buffer Write,BW):传入的flit被存储在其所属的虚拟通道(VC)中进行缓冲。

  2. 路由计算(Route Compute,RC):缓冲的flit计算出它应该发送到的输出端口,并将这个信息存储在其VC中。

  3. 交换机分配(Switch Allocation,SA):所有缓冲的flit尝试在下一个周期中为交换机端口预留位置。这个分配过程是可分离的,首先每个输入端使用输入仲裁器选择一个输入VC,并发出一个交换机请求。然后,每个输出端通过输出仲裁器解决冲突,确定哪些请求可以成功分配。在有序虚拟网络中,所有的仲裁器都以队列方式工作,以维持点对点的顺序。对于其他类型的网络,仲裁器采用轮询方式。

  4. VC选择(VC Selection,VS):在交换机分配过程中胜出的flit从其所属的输出端口中选择一个空闲的虚拟通道(VC),如果该flit是一个头部(HEAD)或头尾(HEAD_TAIL)flit。

  5. 交换机遍历(Switch Traversal,ST):在交换机分配成功后,胜出的flit通过交换机进行遍历,从输入端口转发到输出端口。

  6. 链路遍历(Link Traversal,LT):经过交换机遍历后,flit通过链路传输到达下一个路由器。

在默认设计中,缓冲写入(BW)、路由计算(RC)、交换机分配(SA)、VC选择(VS)和交换机遍历(ST)都在同一个周期内完成。链路遍历(LT)则在下一个周期中进行。

注意:如果需要模拟多周期路由器(Multi-cycle Router),可以在拓扑文件中指定每个路由器的延迟,或者修改src/mem/ruby/network/BasicRouter.py中的默认路由器延迟。这样做会使缓冲的flit在路由器中等待(延迟-1)个周期,然后才能参与交换机分配过程。

七、Buffer Management

在每个路由器的输入端口中,存在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进行传输。这样可以避免拥塞和资源竞争,以提高网络性能和可靠性。

八、Lifecycle of a Network Traversal

组件之间的交互过程:

  • NetworkInterface.cc::wakeup()
    • 每个网络接口(NI)一端连接着一个一致性协议控制器,另一端连接着一个路由器。
    • 接收来自虚拟网络的一致性协议缓冲区的消息,并将其转换为网络数据包发送到网络中【Garnet2.0在此时添加了捕获网络跟踪的功能(正在开发中)】。
    • 从网络接收flit,提取协议消息,并将其发送到相应虚拟网络的一致性协议缓冲区。
    • 与所连接的路由器一起管理流量控制(即信用)。
    • NI的消费flit/credit输出链路将在全局事件队列中放置,并设置时间戳为下一个周期。事件队列调用消费者的wakeup函数。
  • NetworkLink.cc::wakeup()
    • 从NI/路由器接收flit,并在m_latency个周期的延迟后将其发送到NI/路由器。
    • 每个链路的默认延迟值可以从命令行设置(参见configs/network/Network.py)。
    • 可以在拓扑文件中覆盖每个链路的延迟值。
    • 链路的消费者(NI/路由器)将在全局事件队列中放置,并设置时间戳为m_latency个周期后。事件队列调用消费者的wakeup函数。
  • Router.cc::wakeup()
    • 循环遍历所有的输入单元(InputUnit)并调用它们的wakeup函数。
    • 循环遍历所有的输出单元(OutputUnit)并调用它们的wakeup函数。
    • 调用SwitchAllocator的wakeup函数。
    • 调用CrossbarSwitch的wakeup函数。
    • 当路由器的任何模块【InputUnit(输入单元)、OutputUnit(输出单元)、SwitchAllocator(交换分配器)、CrossbarSwitch(交叉开关)】在本周期内有准备好的flit/credit时,会调用路由器的wakeup函数。
  • InputUnit.cc::wakeup()
    • 如果来自上游路由器的输入flit在本周期准备好,则读取它。
    • 对于头部(HEAD)/头尾(HEAD_TAIL)flit,执行路由计算,并更新虚拟通道(VC)中的路由。
    • 将flit缓冲m_latency-1个周期,并标记为从那个周期起对SwitchAllocation有效。
      • 每个路由器的默认延迟可以从命令行设置(参见configs/network/Network.py)。
      • 可以在拓扑文件中设置每个路由器的延迟(即流水线阶段数)。
  • OutputUnit.cc::wakeup()
    • 如果来自下游路由器的输入credit在本周期准备好,则读取它。
    • 增加相应输出VC状态中的credit。
    • 如果credit携带is_free_signal为true,则将输出VC标记为空闲状态。
  • SwitchAllocator.cc::wakeup()
    • 注意:SwitchAllocator执行VC仲裁和选择。
    • SA-I(或SA-i):循环遍历每个输入端口的所有输入VC,并以轮换的方式选择一个。
      • 对于头部(HEAD)/头尾(HEAD_TAIL)flit,选择一个输入虚拟通道(VC),该输入VC连接的输出端口至少有一个空闲的输出虚拟通道(VC)。
      • 对于BODY/TAIL flit,只选择其输出VC中有credit的输入VC。
    • 为该VC放置一个对输出端口的请求。
    • SA-II(或SA-o):循环遍历所有输出端口,并以轮换的方式,在每个输出端口上选择一个合适的输入VC,并将该VC标记为获胜者。
      • 对于头部(HEAD)/头尾(HEAD_TAIL)flit,执行输出VC分配(outvc allocation),即从输出端口选择一个空闲VC。
      • 对于BODY/TAIL flit,在输出VC中减少一个credit。
    • 从输入VC读取flit,并将其发送到CrossbarSwitch中。
    • 在网络通信中,路由器之间通过发送信号来管理虚拟通道(VC)的流量控制。增加credit的信号是一种用于向上游路由器发送的信号,用于表示该输入虚拟通道(VC)中的可用资源。
      • 对于头尾(HEAD_TAIL)/尾部(TAIL)flit,在credit中标记is_free_signal为true。
      • 输入单元将credit通过credit链路发送给上游路由器。
  • CrossbarSwitch.cc::wakeup()
    • 循环遍历所有输入端口,并将获胜的flit发送到其输出端口的输出链路上。
    • 路由器的消费flit输出链路将在全局事件队列中放置,并设置时间戳为下一个周期。事件队列调用消费者的wakeup函数。
  • NetworkLink.cc::wakeup()
    • 从NI/路由器接收flit,并在m_latency个周期的延迟后将其发送到NI/路由器。
    • 每个链路的默认延迟值可以从命令行设置(参见configs/network/Network.py)。
    • 可以在拓扑文件中覆盖每个链路的延迟值。
    • 链路的消费者(NI/路由器)将在全局事件队列中放置,并设置时间戳为m_latency个周期后。事件队列调用消费者的wakeup函数。

九、Running Garnet2.0 with Synthetic Traffic

(使用合成流量运行Garnet2.0)

Garnet2.0可以独立运行,并通过合成流量进行测试:Garnet合成流量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/700141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Python制作进度条有多少种方法?看这一篇文章就够了!

前言 偶然间刷到一个视频,说到:当程序正在运算时,会有一个较长时间的空白期,谁也不知道程序运行的进度如何,不如给他加个进度条。 于是我今个就搜寻一下,Python版的进度条都可以怎么写! 送书…

多线程和并发

线程 进程:在操作系统中运行的程序,一个进程可以包含多个线程 程序就是指令和数据的有序集合,静态概念 进程就是执行程序的一次执行过程,动态概念系统资源分配的单元 一个进程中包含多个线程,一个进程至少包含一个线…

大蟒蛇(Python)笔记(总结,摘要,概括)——第9章 类

目录 9.1 创建和使用类 9.1.1 创建Dog类 9.1.2 根据类创建实例 9.2 使用类和实例 9.2.1 Car类 9.2.2 给属性指定默认值 9.2.3 修改属性的值 9.3 继承 9.3.1 子类的_init_()方法 9.3.2 给子类定义属性和方法 9.3.3 重写父类中的方法 9.3.4 将实例用作属性 9.3.5 模拟实物 9.…

现货黄金中短线投资该怎么做?

要明确什么是现货黄金的中短线投资,中短线投资是指在短期内(一般为几天至几周)对现货黄金进行买卖操作,以期获得收益的投资方式。相较于长线投资,中短线投资的风险相对较大,但同时收益也更为可观。那么&…

深入探究 JVM 频繁 Full GC 的排查过程

1. 引言 在当今软件开发领域,Java语言以其跨平台性、面向对象、高性能等特点成为了广泛应用的首选之一。而Java应用程序的核心执行环境就是Java虚拟机(JVM),它负责将Java字节码翻译成机器码并执行,是Java程序运行的基…

二手货wordpress企业网站主题模板

二手车wordpress主题模板 简洁的二手车wordpress主题模板,适合做二手车业务的公司官方网站使用。 https://www.jianzhanpress.com/?p3473 wordpress二手物资回收主题 绿色wordpress二手物资回收主题,用于二手物资回收公司WP建站使用。 https://www.…

自动化行业文件数据\资料防泄密软件——天锐绿盾|@德人合科技

天锐绿盾是一款自动化行业文件数据防泄密软件,由德人合科技提供。该软件采用动态加解密技术,能够有效防止公司内部数据泄密,同时支持各种文件格式加密,如CAD、OFFICE、PDF、图纸等。 PC端:https://isite.baidu.com/sit…

git如何保留提交记录的情况下迁移

Git仓库迁移方案 在日常的工作场景中,我们有时候会遇到需要更换Git仓库地址的需求。或者是从一个git仓库托管工具换到另一个git仓库托管工具。这个时候有两种方案: 方案一:不保留历史提交记录 如果你不需要保留原有的历史提交记录&#xf…

Linux RocketMQ 安装及卸载(附控制台搭建)

一、前言 在安装 RocketMQ 前需要确保 JDK 已安装并正确配置环境变量 二、下载安装 1.下载 下载 | RocketMQ 2.安装 # 打开存放目录 cd /usr/local # 创建目录 mkdir rocketMQ # 进入目录 cd rocketMQ # 把下载的压缩包上传到 rocketMQ 目录中 # 解压 $ unzip rocketmq-all-…

备战蓝桥杯 Day12(二维费用背包+分组背包)

二进制分解多重背包 269:【例9.13】庆功会 【题目描述】 为了庆贺班级在校运动会上取得全校第一名成绩,班主任决定开一场庆功会,为此拨款购买奖品犒劳运动员。期望拨款金额能购买最大价值的奖品,可以补充他们的精力和体力。 #inc…

高级RAG:揭秘PDF解析

原文地址:https://pub.towardsai.net/advanced-rag-02-unveiling-pdf-parsing-b84ae866344e 2024 年 2 月 3 日 附加内容:揭秘PDF解析:如何从科学pdf论文中提取公式 对于RAG,从文档中提取信息是一个不可避免的场景。确保从源头…

Flutter学习6 - Dart 类与对象

1、面向对象编程(Object-Oriented Programming, OOP)三大特征 (1)封装 封装是指将对象的状态(属性)和行为(方法)封装在一起,对外部隐藏对象的内部细节,只提…

#LLM入门|Prompt#1.1 第一部分_面向开发者的LLM入门教程_简介

Prompt工程:解锁大语言模型潜能的关键技巧 随着大语言模型(LLM)的兴起,Prompt工程已成为开发者利用LLM构建功能强大应用的关键技能。在这个新时代,Prompt不仅是指导LLM的输入形式,更是塑造其能力上限与下限…

Python 在Word中创建表格并填入数据、图片

在Word中,表格是一个强大的工具,它可以帮助你更好地组织、呈现和分析信息。本文将介绍如何使用Python在Word中创建表格并填入数据、图片,以及设置表格样式等。 Python Word库: 要使用Python在Word中创建或操作表格,需…

OpenCV 4基础篇| OpenCV图像基本操作

目录 1. 图像读取1.1 cv2.imread() 不能读取中文路径和中文名称1.2 cv2.imdecode() 可以读取中文路径和中文名称 2. 图像的显示2.1 openCV显示图像 cv2.imshow()2.2 matplotlib显示图像 plt.imshow() 3. 图像的保存 cv2.imwrite()4. 图像的复制4.1 img.copy()4.2 np.copy()4.3 …

【C++STL】STL容器详解

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

RabbitMQ 网络分区处置策略配置

概述 集群成员之间的网络连接故障会影响客户端操作的数据一致性和可用性&#xff08;如CAP定理&#xff09;。 由于不同的应用程序对一致性有不同的要求 并且可以容忍不同程度的不可用&#xff0c;可以使用不同的分区处理策略。 检测网络分区 节点确定其对等节点是否关闭&am…

个性化纹身设计,Midjourney带你探索独一无二的艺术之美

hello,大家好&#xff0c;欢迎回来。 在当今社会&#xff0c;纹身已经变得非常常见。 在寻求与众不同的个性化纹身时&#xff0c;你是否曾经为了找不到独特的设计而苦恼&#xff1f; 现在&#xff0c;Midjourney将为你打开一扇全新的艺术之门&#xff0c;引领你探索纹身设计…

高通 Android 12 Settings不显示版本号问题

1、最近项目遇到一个奇葩问题&#xff0c;编译系统版本号不见了&#xff1f; 2、一开始我想着可能是自己代码没有make clean结果编译几个小时&#xff0c;然后烧录固件发现还是未生效。 3、然后这时候我又去看git log review最近修改也没有太大发现&#xff08;待定&#xff…

docker安装flink

docker安装flink 5.1、拉取flink镜像&#xff0c;创建网络 docker pull flink docker network create flink-network5.2、创建 jobmanager # 创建 JobManager docker run \-itd \--namejobmanager \--publish 8081:8081 \--network flink-network \--env FLINK_PROPERTIES&…