本文为使用gem5对片上网络(NoC)进行仿真的教程。
环境:
虚拟机 | VM Workstation Pro |
---|---|
系统 | Ubuntu22.04 |
系统内存 | 8G |
处理器数量 | 8 |
硬盘 | 60G |
IDE | VS Code |
gem5教学文档:https://www.gem5.org/documentation/
一、安装ubuntu虚拟机
1.下载Ubuntu22.04的镜像
Ubuntu官网下很慢,去清华的镜像站下
网址:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/22.04/
点图中圈出的下载Ubuntu22.04版本的镜像
2.创建虚拟机
创建ubuntu的虚拟机,具体创建过程上网搜,网上很多。
在设置具体配置时,根据自己电脑配置尽量设置高一点,比如我的电脑内存16G,16个处理器,我分配的就是8G内存,8个处理器,硬盘大小建议最小30G。
二、安装和编译Gem5
1.安装Gem5
直接去GitHub里下载就可以,注意要在虚拟机里下,不能在主机里下完再移到虚拟机里。
网址:https://github.com/gem5/gem5
下载完压缩包直接解压,直接放在主目录下就可以,我这里是把名字改成gem5了。
2.安装相关依赖
想要编译和使用Gem5还需要下载一些相关的依赖
打开终端,在终端输入以下命令进行依赖安装。
sudo apt install build-essential git m4 scons zlib1g zlib1g-dev \
libprotobuf-dev protobuf-compiler libprotoc-dev libgoogle-perftools-dev \
python3-dev libboost-all-dev pkg-config python3-tk
3.编译Gem5
以上的依赖成功安装完成后就可以编译Gem5了
首先终端进入到gem5的目录下,如下图所示
然后输入以下编译指令
scons build/NULL/gem5.opt -j {cpus}
{cpus}是你想使用多少个处理器来编译,根据自己分配给虚拟机处理器个数来选择,我使用的是 -j 7 。
在编译过程中可能会遇到编译失败,进程终止的问题,我遇到的导致该问题产生的原因有:(1)交换区(swap)空间太小(2)虚拟机硬盘空间不足
(1)swap太小
首先终端进入到主目录下,然后依次在终端中使用以下命令
sudo mkdir ./swap
cd ./swap
sudo dd if=/dev/zero of=swapfile bs=1024 count=2000000
sudo chmod 600 ./swapfile
sudo mkswap -f ./swapfile
sudo swapon /swapfile
依次执行完以上命令后,使用free -m 命令查看swap空间是否扩展成功。
(2)虚拟机硬盘空间不足
扩大虚拟机的硬盘空间,首先要把虚拟机关掉。
点击编辑虚拟机设置
点击扩展,因为这里我没有关掉虚拟机,所以无法扩展。正常情况下30G是够用的。
编译结束后终端出现以下结果说明编译成功。
编译成功后会在/gem5/build/NULL/目录下生成以下文件
在Gem5的教学文档中,有更为详细的编译教程
网址:https://www.gem5.org/documentation/general_docs/building
三、使用Gem5进行片上网络的仿真
首先要修改一个文件
点开图中圈中的python文件,划到最底。
将图中红线所划位置改为1ns(正常原来是1ps),然后保存。
使用命令进行仿真
首先创建一个装命令的文件夹 我这里取名为my_command
进入该文件夹下,创建一个shell脚本,我这里取名commad.sh
./build/NULL/gem5.org configs/example/garnet_synth_traffic.py \
--num-cpus=16 \
--num-dirs=16 \
--network=garnet \
--topology=Mesh_XY \
--mesh-rows=4 \
--sim-cycles=1000 \
--synthetic=uniform_random \
--injectionrate=0.1
以上命令是对一个4×4mesh结构的片上网络进行仿真
下面终端进入到gem5目录下,运行bash ./my_command/command.sh
命令
出现以上结果说明仿真成功
仿真的结果会出现在gem5目录下的m5out文件夹下
其中的stats.txt文件中是全部的仿真结果,像平均延迟,平均跳数都在里面。
对片上网络的仿真,gem5中有很多参数,对这些参数的说明可以在教学文档中查看
网址:https://www.gem5.org/documentation/general_docs/ruby/garnet_synthetic_traffic/
扩展
如果你想对Gem5的片上网路进行修改,则需要修改gem5的源代码,gem5的底层是由C++进行编写,所以如果想要使用gem5成功自定义NoC还是需要一定的c++基础的。注意,修改后需要重新进行编译。
gem5中garnet部分的源代码是以上图片显示的部分。个人建议想要学会如何在gem5中自定义自己的片上网络,一定要清楚消息在garnet中的生命周期,可以去教学文档中学习
网址:https://www.gem5.org/documentation/general_docs/ruby/heterogarnet/
搞懂上面这张图对创建自己的片上网络至关重要。
调试
学会Gem5的调试是非常重要的,如果你对Garnet做了一些修改,通过调试可以知道你所做的修改是否成功。
我常使用的两个调试命令是--debug-flags=Ruby --debug-file=debug.txt
具体使用方法如下:
执行完该命令后会在m5out文件夹生成一个debug.txt文件,这个文件中包含了全部的调试信息,大家在使用调试命令测试自己网络的时候记住尽量减少仿真次数(sim-cycles),否则过多的仿真次数会在生成调试结果文件(debug.txt)时消耗大量的时间,且生成的文件也会很大,几g几十g都有可能。
调试信息来源于garnet源代码中的DPRINTF()语句,如下图所示。
他在debug.txt对应的就是
我们也可以自行添加DPRINTF语句,用来观察自己定义的变量的值的变化,在下一节中,我给大家举个例子。
获取和设置flit中的数据块(datablock)
你们现在所做的课题,我觉得后面肯定会需要修改flit中的数据块,那garnet本身有DataBlock这个类,类里面也有获取和修改数据块信息的函数(getData()和setData()),但是想要使用这两个函数我们首先需要从消息实体(MsgPtr)中提取出DataBlock,但这是Gem5默认没有提供的,需要我们对源代码进行一点修改才能调用MsgPtr的getDataBlk()函数。
下面我告诉你们在哪里修改,首先找到Message.hh文件,在下图所示的位置。
打开这个文件我们可以看到默认是没有getDataBlk()函数的,只有getDestination()函数
我们可以借鉴getDestination()的写法自己写一个getDataBlk()函数,下面是我在Message.hh文件中所插入的语句,在做出这个修改后,我们的MsgPtr类就可以使用getData()来获取flit的数据块了,下面我举个具体的例子
我在NoC的网络接口(NetworkInterface)处读取flits的数据块并将数据块中的数据的前48位全部设为0×1,并添加调试语句,将修改结果显示在调试文件中。
下面是我在NetworkInterface.cc文件中所作出的修改:
在做出以上修改并且对Gem5进行编译后,运行仿真命令,查看调试结果(debug.txt)
上面是我的调试结果,可以看出我添加的用来查看数据块前三位数据的DPRINTF()语句在debug.txt中生成了。
还可以看出我对flit的数据块修改也成功了,flit原本的DataBlk全为0×0,在经过我的修改后前48位变成了0×1。
所以在gem5的使用过程中,调试的作用是非常大的,大家一定要熟练使用调试,在Gem5的教学文档中还说了其他的调试方法,大家感兴趣的也可以了解了解
网址:https://www.gem5.org/documentation/general_docs/debugging_and_testing/debugging/trace_based_debugging
常用脚本分享
以下是我常用的两个脚本:一个是提取仿真结果中的重要信息,一个是用来进行重复性实验
extract_network_stats.sh
lab.sh
以上两个脚本大家都可以根据自己的需求进行修改。
Gem5其他模式
gem5的fs和se模式是可以用来进行基准测试的,例如splash2基准。这里建议大家做为初学者就先将garnet自带的合成流量先用懂,再去研究另外两种模式。
在这里举个se模式的例子吧
以上是使用se模式,在4×4Mesh片上网络下执行splash2中FFT进行测试的命令
以上为仿真成功的结果。
最后,本文用于智联实验室片网课题的仿真器学习使用,实话实说,片上网络的学习并不简单,但希望片网课题的同学还是要静下心来,贵在坚持吧。
新来的同学如果在安装编译或使用过程中遇到实在不太懂的问题,可以在这个博客的评论区留言,如果我有时间会为大家解答,大家也可以互相交流互相学习。