
Gem5 Garnet互连网络环境安装与程序测试
基于Gem5的Garnet互连网络demo,软件定义晶上系统原理实验
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
存在的主要问题:
- 编译的路径和gem5官方目录不同(./build/Garnet_standalone/gem5.debug)
解决方法:以最新版的Gem5为准,所输入的仿真代码如前文所示 - 仍然使用garnet2.0网络类型,然而现在已经不再被支持了,所以在运行时会发生报错
解决方法:–network参数输入garnet而不是garnet2.0 - 编译参数选择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)包的平均时延仿真结果过大/发包数量过少的原因分析
在本人实验的过程中,遇到了如下问题:
- 包的平均时延特别大,基本上处于几千到几万
- 发包和收包的数量都特别少,有时甚至为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
因此可以考虑将全局频率回调,之后仿真的时延结果就基本符合预期了
仿真结果
更多推荐
所有评论(0)