Gem5模拟器,一些运行的小tips(十一)

一些基础知识,下面提到的东西与前面的文章有一定的关系,感兴趣的小伙伴可以看一下

(21条消息) Gem5模拟器,全流程运行Chiplet-Gem5-SharedMemory-main(十)_好啊啊啊啊的博客-CSDN博客

 Gem5模拟器,FS模式运行自定义程序(九)_好啊啊啊啊的博客-CSDN博客


目录

1.关于运行openmp矩阵并行乘法时编译产生错误(这个是基于上述Gem5运行提出的问题),如下:

2.关于在gem5中绘制系统配置图:

3.已安装pydot库但是仍然报错 No module named pydot

4.关于重定向Gem5的输出文件

5.关于fatal condition id > SNOOP_MASK_SIZE occured: Snoop filter only supports 256 snooping ports, got 385

6.关于checkpints恢复报错

7.关于“too many open files”

8. 关于开启ruby时创建topology报错

9. 复杂的源码如何观看?


1.关于运行openmp矩阵并行乘法时编译产生错误(这个是基于上述Gem5运行提出的问题),如下:

undefined reference to `omp_get_thread_num'

 正确的编译代码如下:

pip install pydot
g++ -lm5 -L./ ./SMP.cpp -o SMP.out ./libm5.a -fopenmp

2.关于在gem5中绘制系统配置图:

gem5运行过se模式或fs模式后在m5out/下会有一个config.dot.svg,里面绘制了系统包含的组件以及各个组件之间的连线,但是一般情况下是不会直接生成该文件的,必须要安装pydot包,不然无效。可以参考源码中具体的实现:dot_writer.py(root/gem5/src/python/m5/util/dot_writer.py),调用文件是在simulate.py(root/gem5/src/python/m5/simulate.py)的第110行。下面记录如何生成该文件:

1. 安装Pydot包,如果没有pip,使用sudo apt install python3-pip即可

pip install pydot

2. 安装Graphviz包来根据dot文件绘制图片

sudo apt install graphviz

3.绘制图片(一般而言只有第一次需要手动操作,后续直接运行gem5仿真的命令就会自动生成。)

cd m5out # 这个目录是存放配置结果的,根据不同名称进入即可
dot -Tpng -o config.png config.dot

 运行结果如下:(来自:(28条消息) gem5中绘制系统配置图_空空7的博客-CSDN博客

在这里插入图片描述

3.已安装pydot库但是仍然报错 No module named pydot

# python-pydot-ng isn't in the 14.04 repos
sudo apt install python-pydot python-pydot-ng graphviz

亲测可行,还不行可以重启试试

4.关于重定向Gem5的输出文件

这个是真的让人迷醉的程度,是会把人气的死去活来的程度。同样的命令行参数,位置换了居然报错,重定向的两个参数是“-d”或者“--outdir”,需要加在build/指令集/gem5.opt后面,如下图所示:

 反之这样是不行的:

 如果上述包已经安装齐全,那么你的输出文件会是这样:

5.关于fatal condition id > SNOOP_MASK_SIZE occured: Snoop filter only supports 256 snooping ports, got 385

解决方法:更改root/gem5/src/mem/snoop_filter.hh文件中的SNAOOP_MASK_SIZE的值,将256修改为1024,然后重新编译Gem5

6.关于checkpints恢复报错

我在Gem5的FS模式下运行时,基本设置是:64core+caches

build/X86/gem5.opt -d 指定输出目录 configs/example/fs.py --num-cpus=64 --kernel=内核 --disk=镜像 --caches 

进入m5后使用“m5 checkpoint”制作了恢复点,但是我在恢复时遇到了报错,如下:

 其实我很纳闷,因为我同样的操作,为什么在只有一个core的时候从来都不报错,我看了一下源码,发现了一些我以前忽略的东西:

① 关于恢复checkpoint时的“-r num”

由下图可知,是按照文件 名里的数字串大小来的,而非制作checkpoint的先后顺序,在检查自己加载的checkpoint是否正确时,可以参看上图红色框出来的@97874363801500,这个就是你现在加载的checkpoint文件名。

 ②关于“when>=getCurTick()”

我们要先明确一个问题,重启checkpoint是为了回到之前制作checkpoint的情境下。当我们在执行仿真过程中制作了一个checkpoint,就相当于保存了当前仿真的状态,包括当前时钟周期数、寄存器的值、内存的值等等。如果我们想要回到这个状态,就可以通过重启checkpoint来恢复这个状态。而时间戳在重启checkpoint中的作用是用来指定仿真的起始时间。

当我们重新加载checkpoint时,会将时间戳作为起始时间,并从这个时间点开始重新执行仿真过程。如果我们指定的时间早于当前时间,就会导致仿真时间倒退,从而引发错误(我没有证据支撑这句话,这是我目前的揣测)。 在一些情况下,我们可能需要手动指定时间戳,例如在同时运行多个仿真任务时,我们需要确保每个任务的起始时间不同,避免出现竞争和冲突。

③如何解决这个问题?

这个问题困扰了我好久,我之前一直以为,我在保存checkpoint的时候会把当时所有的状态都记录下来,所以我恢复的时候不用在制定CPU个数、CPU类型,只用指定checkpoint所在目录即可,事实证明,非也(T_T)。

我们在恢复的时候还是要指定cpu数目,不指定默认就是1(我觉得是这样),我们将恢复checkpoint的指令改写成下面这个:

build/X86/gem5.opt -d 指定输出目录 configs/example/fs.py --num-cpus=64 --kernel=内核 --disk=镜像 其他配置参数 -r 1 --checkpoint-dir=checkpoint目录在指定的输出目录中 
--restore-with-cpu=O3CPU --cpu-type=O3CPU

另外需要注意的是:为了尽可能减少系统启动所花时间,我们最好只指定所模拟系统的大小,即指定模拟系统的CPU核数量,其他配置不用设置,按照所提供的默认值即可,在后续使用的时候再重新配置相关系统参数即可。


研究表明,该踩坑的躲都躲不掉,之前以为只用指定系统规模(即多少个核心),实验发现,其实内存大小也需要提前指定(除非你默认一直使用512MB,就可以不管这个参数),不然在checkpoint恢复时再想指明内存大小会报错,比如,我通过下述指令运行:

报错如下:


7.关于“too many open files”

看源码,来自于socket.cc文件, 

fd = ::socket(PF_INET, SOCK_STREAM, 0) 是用于创建一个TCP套接字的系统调用,它返回一个文件描述符fd。在Linux系统中,每个进程都有一定数量的文件描述符可用来打开文件、读写网络套接字等。当进程使用的文件描述符数量超过了系统预设的上限时,就会出现 "Too many open files" 的错误。

因此,当Gem5运行时,它会调用socket系统调用来创建一个网络套接字,但由于之前已经使用了大量的文件描述符,导致无法再创建新的套接字,从而出现了该错误。 解决这个问题的方法是增加Linux系统中允许的最大文件描述符数量。解决这个问题,可以通过以下方法:

  1. 修改系统限制:可以通过修改系统的文件描述符限制来解决该问题。可以使用ulimit命令查看当前限制,并使用ulimit -n 命令修改限制,其中为新的限制值。也可以可以通过修改 /etc/security/limits.conf文件,增加nofile参数,来提高系统的文件描述符数量限制
  2. 减少打开的文件数:可以通过减少打开的文件数来解决该问题。可以尝试使用更少的文件或者关闭不必要的文件,以减少打开的文件数量。
# 暂时修改
ulimit -n 4096(自己制定数量,不行的话可以试试切换root权限)

# 永久修改
sudo vi /etc/security/limits.conf
    # 在末尾追加以下内容
    * soft nofile 4096
    * hard nofile 4096

实测,靠谱,别整那些幺蛾子,ulimit -n 4096,可用,简单好使。

8. 关于开启ruby时创建topology报错

开启命令如下:

报错如下:

 解决方法:

比如我调用的是Mesh_XY,那么按照提示到root/gem5/configs/topologies/Mesh_XY.py中,注释掉第102行,重新编译gem5即可。

9. 复杂的源码如何观看?

安装Graphviz

sudo apt install graphviz 

安装Doxygen

sudo apt install doxygen

进入项目文件根目录,生成配置文件

doxygen -g Doxygen.config

修改配置文件,将配置文件中的下列配置进行修改,其他配置可以按照需求修改

EXTRACT_ALL            = YES
HAVE_DOT               = YES
UML_LOOK               = YES
RECURSIVE              = YES 

运行

doxygen Doxygen.config

参考:(24条消息) Linux下自动生成c++ UML图_linux自动生成类图_Cross_Entropy的博客-CSDN博客

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值