Gem5 Garnet互连网络环境安装与程序测试

3 篇文章 0 订阅
1 篇文章 0 订阅

1. 背景

Gem5

Gem5模拟器是计算机系统体系结构研究的模块化平台,包括系统级体系结构和处理器微体系结构。Gem5最初是为学术界的计算机体系结构研究而设计的,但它已被学术界、研究行业和教学界用于计算机系统设计。

Gem5的官网:https://www.gem5.org/
Gem5的github:https://github.com/gem5/gem5

Garnet
Garnet是Gem5中的互连网络模型,会随着Gem5的更新而更新。目前最新版本Gem5所包含的Garnet版本是Garnet 3.0(划重点,后面会用到),也就是HeteroGarnet。

参考网址:https://www.gem5.org/2020/05/27/heterogarnet.html
参考视频:https://www.youtube.com/embed/AH9r44r2lHA

Heterogrante改进了广受欢迎的Garnet2.0网络模型,实现了对新兴互连系统的精确模拟。具体而言,Heterogrante增加了对时钟域孤岛(clock-domain islands)、支持多个频域的网络交叉点(network crossings)以及能够连接到多个物理链路的网络接口控制器的支持。它还通过引入新的可配置SerDes组件来支持可变带宽链路和路由器。

**Garnet的参考论文:**Bharadwaj S, Yin J, Beckmann B, et al. Kite: A family of heterogeneous interposer topologies enabled via accurate interconnect modeling[C]//2020 57th ACM/IEEE Design Automation Conference (DAC). IEEE, 2020: 1-6.


2. Garnet的网络教学资源

通过最近对软件定义晶上系统(Software Defined System on Wafer,SDSoW)、以及chiplet系统的研究,发现许多高水平论文均使用Garnet作为互连(Interconnection)系统的仿真软件。而Garnet的网络教学资源相对较少,且更新不够及时,现有的主要资源如下:

Gem5的官方文档:

地址:https://www.gem5.org/documentation/general_docs/ruby/garnet-2/

主要缺点:仍然处于Garnet2.0阶段,然而最新代码已经是Garnet3.0(Heterogrante),导致部分代码和现有文档不对应

佐治亚理工大学的NoC系列课程及实验:

课程链接:https://tusharkrishna.ece.gatech.edu/teaching/icn_s22/

实验链接:https://tusharkrishna.ece.gatech.edu/teaching/garnet_gt/

目前最新的是2022年春季的课程,有条件的可以学一下,里面有PPT和NoC实验,但是实验中的Gem5版本比较陈旧。


3. Gem5的下载、编译及运行

Gem5的相关依赖下载:

这部分参考Gem5的官方文档进行配置:

https://www.gem5.org/documentation/general_docs/building

以本机所在的Ubuntu 18.04为例,需要配置的依赖有(Gem5版本高于v21.0):

  • git : gem5 uses git for version control.
  • gcc: gcc is used to compiled gem5. Version >=7 must be used. We support up to gcc Version 11.
  • Clang: Clang can also be used. At present, we support Clang 6 to Clang 11 (inclusive).
  • SCons : gem5 uses SCons as its build environment. SCons 3.0 or greater must be used.
  • Python 3.6+ : gem5 relies on Python development libraries. gem5 can be compiled and run in environments using Python 3.6+.
  • protobuf 2.1+ (Optional): The protobuf library is used for trace generation and playback.
  • Boost (Optional): The Boost library is a set of general purpose C++ libraries. It is a necessary dependency if you wish to use the SystemC implementation.

可以在终端中进行安装:

sudo apt install build-essential git m4 scons zlib1g zlib1g-dev \
libprotobuf-dev protobuf-compiler libprotoc-dev libgoogle-perftools-dev \
python3-dev python libboost-all-dev pkg-config

此外,推荐安装pydot,这样能够在仿真时同步生成系统结构图,pydot的链接是https://pypi.org/project/pydot/#description

首先将pydot从上面的网址下载下来,而后解压后在目录内执行

sudo python setup.py install

在这里插入图片描述在这里插入图片描述
Gem5下载与编译:

从Gem5的Github上对项目进行clone:

git clone https://github.com/gem5/gem5.git

在这里插入图片描述
对Gem5进行编译,协议选择Garnet_standalone,j后面的参数推荐填写「本机的CPU核心数+1」。例如我的电脑是4核心的,那么j后面填写5。

scons build/NULL/gem5.opt PROTOCOL=Garnet_standalone -j 5

在这里插入图片描述
这里输入回车确定,然后进入编译流程,时间可能比较长
在这里插入图片描述
编译完成后的效果如下图所示
在这里插入图片描述
一些实用的小工具:

可以利用脚本文件自动收集所关注的参数,参考实验课程中的extract_network_stats.sh,其代码如下,可以自行复制保存到gem5的根目录中

echo > network_stats.txt
grep "packets_injected::total" m5out/stats.txt | sed 's/system.ruby.network.packets_injected::total\s*/packets_injected = /' >> network_stats.txt
grep "packets_received::total" m5out/stats.txt | sed 's/system.ruby.network.packets_received::total\s*/packets_received = /' >> network_stats.txt
grep "average_packet_queueing_latency" m5out/stats.txt | sed 's/system.ruby.network.average_packet_queueing_latency\s*/average_packet_queueing_latency = /' >> network_stats.txt
grep "average_packet_network_latency" m5out/stats.txt | sed 's/system.ruby.network.average_packet_network_latency\s*/average_packet_network_latency = /' >> network_stats.txt
grep "average_packet_latency" m5out/stats.txt | sed 's/system.ruby.network.average_packet_latency\s*/average_packet_latency = /' >> network_stats.txt
grep "flits_injected::total" m5out/stats.txt | sed 's/system.ruby.network.flits_injected::total\s*/flits_injected = /' >> network_stats.txt
grep "flits_received::total" m5out/stats.txt | sed 's/system.ruby.network.flits_received::total\s*/flits_received = /' >> network_stats.txt
grep "average_flit_queueing_latency" m5out/stats.txt | sed 's/system.ruby.network.average_flit_queueing_latency\s*/average_flit_queueing_latency = /' >> network_stats.txt
grep "average_flit_network_latency" m5out/stats.txt | sed 's/system.ruby.network.average_flit_network_latency\s*/average_flit_network_latency = /' >> network_stats.txt
grep "average_flit_latency" m5out/stats.txt | sed 's/system.ruby.network.average_flit_latency\s*/average_flit_latency = /' >> network_stats.txt
grep "average_hops" m5out/stats.txt | sed 's/system.ruby.network.average_hops\s*/average_hops = /' >> network_stats.txt

4. 基于8*8 Mesh NoC同构网络的demo仿真

仿真参数

项目参数
网络类型garnet
源节点数量64
目的节点数量64
拓扑类型Mesh_XY
规模8*8
仿真周期10000
vnet注入参数0
注入率0.02
流量类型uniform_random

仿真实验主要目标

通过设定不同的注入率(–injectionrate参数),来观察NoC系统的仿真运行结果,主要关注的指标有:

  • 总发包数量
  • 总收包数量
  • 平均包排队延迟
  • 平均包网络延迟
  • 平均包延迟(等于平均包排队延迟+平均包网络延迟)
  • 平均跳数

仿真实验配置与代码

在Gem5的根目录下,输入其命令行代码:

./build/NULL/gem5.opt configs/example/garnet_synth_traffic.py \
--network=garnet \
--num-cpus=64 \
--num-dirs=64 \
--topology=Mesh_XY \
--mesh-rows=8 \
--sim-cycles=10000 \
--inj-vnet=0 \
--injectionrate=0.02 \
--synthetic=uniform_random 

在这里插入图片描述
仿真结束后如下图所示
在这里插入图片描述
之后,可以利用extract_network_stats.sh脚本生成network_stats.txt,观察一下结果
在这里插入图片描述
可以发现,在仿真参数下,共发包12690个,收包12682个,平均的包时延在15.51cycle,平均包的跳数在5.23跳。


5. 佐治亚理工大学的NoC课程实验的代码问题和BUG分析

课程实验中的原始代码

./build/Garnet_standalone/gem5.debug configs/example /garnet_synth_traffic.py \
--network=garnet2.0 \
--num-cpus=64 \
--num-dirs=64 \
--topology=Mesh_XY \
--mesh-rows=8 \
--sim-cycles=10000 \
--inj-vnet=0 \
--injectionrate=0.02 \
--synthetic=uniform_random

存在的主要问题:

  1. 编译的路径和gem5官方目录不同(./build/Garnet_standalone/gem5.debug)
    解决方法:以最新版的Gem5为准,所输入的仿真代码如前文所示
  2. 仍然使用garnet2.0网络类型,然而现在已经不再被支持了,所以在运行时会发生报错
    解决方法:–network参数输入garnet而不是garnet2.0
  3. 编译参数选择gem5.debug而不是gem5.opt
    其实也不算是错误,但是使用opt有一定好处(This gives a good balance between the speed of the simulation and insight into what’s happening in case something goes wrong)

6. 最新版Gem5(版本v21.2.1.1)包的平均时延仿真结果过大/发包数量过少的原因分析

在本人实验的过程中,遇到了如下问题:

  1. 包的平均时延特别大,基本上处于几千到几万
    在这里插入图片描述
  2. 发包和收包的数量都特别少,有时甚至为0
    在这里插入图片描述

而根据一般情况而言,在一个8*8规模的mesh下,NoC在注入率为0.02,包的平均延迟不会这么大,发包的数量也不会为个位数。

经过调研,发现是新版本的Gem5在garnet_synth_traffic.py中将Global Frequency设置成了1000Ghz,也就是1ps执行一个cycle,系统仿真速度过快。因此就显得仿真参数中的时间过于短暂,以至于还没有大规模发包之前,仿真实际上已经结束了。

观察代码找原因

在Gem5 v 21.2.1.1中,全局频率设置为1ps
在这里插入图片描述
在较老版本的Gem5(例如v20.0.0.3)中,全局频率设置为1ns
在这里插入图片描述
因此可以考虑将全局频率回调,之后仿真的时延结果就基本符合预期了
在这里插入图片描述

仿真结果
在这里插入图片描述

  • 12
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值