赞
踩
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.
通过最近对软件定义晶上系统(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版本比较陈旧。
Gem5的相关依赖下载:
这部分参考Gem5的官方文档进行配置:
https://www.gem5.org/documentation/general_docs/building
以本机所在的Ubuntu 18.04为例,需要配置的依赖有(Gem5版本高于v21.0):
可以在终端中进行安装:
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
仿真参数
项目 | 参数 |
---|---|
网络类型 | 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跳。
课程实验中的原始代码
./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
存在的主要问题:
在本人实验的过程中,遇到了如下问题:
而根据一般情况而言,在一个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
因此可以考虑将全局频率回调,之后仿真的时延结果就基本符合预期了
仿真结果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。