本文于2023年10月实测可以编译完成GEM5 full system 的parsec benchmar运行。本文提供了一镜到底的手把手全流程教程。 gem的build和disk image总有很多问题,这一次用docker和尽可能的下载而非本地编译来实现。也尽可能避开gem5art的组件等花里胡哨带来潜在bug的功能。
1. build GEM5 with docker
本来可以本地scons build的, 但是遇到了很多问题。
下图中官方提供了很多方法,最简单有效的还是docker,避开一切环境的打扰。(想查看官方教程的:https://www.gem5.org/documentation/general_docs/building )
下面是具体的实际的命令行:
docker pull gcr.io/gem5-test/ubuntu-22.04_all-dependencies:v22-1
#或者 sudo docker pull gcr.io/gem5-test/ubuntu-22.04_all-dependencies:v22-1
#代码解释:任意路径的命令行都可。
#docker pull <image> ,<image> 是你的docker镜像。我选择的是和host,也就是物理机一致的版本,ubuntu22.04。
创建一个文件夹,进入文件夹,git clone gem5
mkdir myprojects2024
cd myprojects2024
git clone https://github.com/gem5/gem5
sudo docker run -u $UID:$GID --volume /home/yz/myprojects/2024GEM5/parsec-tests/yzmodifiedgem5/:/gem5 --rm -it gcr.io/gem5-test/ubuntu-22.04_all-dependencies:v22-1
#docker run -u $UID:$GID --volume <gem5 directory>:/gem5 --rm -it <image>
这里 是host物理机的地址,/gem5是docker内虚拟的地址,docker启动后,会发现ls出现了gem5。这是因为我们把host的 <地址/gem5>挂载到docker内的<根目录/gem5>里,我们同时docker内对该文件夹操作,编译,host物理机也会有同样的效果。
然后dcoker内 进入gem5文件夹,scons编译
cd gem5
scons build/X86/gem5.opt -j 24
## scons build/{ISA}/gem5.{variant} -j {cpus}
#其中ISA 有X86,ARM 等可选,我们选X86因为对应的教程比较多,也有默认的资源。
#gem5.{variant}有 gem5.debug/gem5.opt/gem5.fast可选, 选debug就慢但是信息多,fast就快但是信息少,一般选opt就行。
# 其中-j {cpus} 可以选择--j 4/ -j 8/-j 16,根据cpu核数选择,选错了也没关系,顶多慢一点。#
也许会有一些关于hook的提示,选yes就行,让程序自己编译我花了大概11:50-12:10, 20min以内。
cd gem5/util/m5/ #进入目录即可,如果你当前目录是gem5了, 则为: cd util/m5/
scons build/x86/out/m5
2. 启动一个full system 模拟
然后输入下面的命令行进行一个简单的测试,这个命令行可以跳过。
./build/X86/gem5.opt configs/example/gem5_library/x86-ubuntu-run.py
它将创建一个使用 KVM 启动 Ubuntu 18.04 映像的模拟,并且自动下载缺失的内核与镜像文件。
然后是我们的核心部分,parsec benchmarkl的全系统模拟。其中,我们避免了packer或qemu或者m5 util手动打包镜像,而是直接跳过镜像和内核的编译(从而让gem5默认下载缺失内核和镜像)。
查看可以看到我们在~/.cache/gem5目录内下好了kernel和image文件。
然后是运行parsec的full system模拟。我们运行的是其中一个benchmark,叫blacksholes,很多地方缩写为bl。
size定为simsmall,花费5-8分钟(e5-2678花费8分钟,10700k花费五分钟)。simalarge则在10700k上花费1小时以上。
build/X86/gem5.opt configs/example/gem5_library/x86-parsec-benchmarks.py --benchmark blackscholes --size simsmall
最后的结果如下。
在gem5/m5out/路径下会有结果文件,打开stats.txt即可看到对应的结果。
一些简单的结果分析
打开stats.txt,可以看到host上花了329.56hostseconds,也就是在10700k上花费了地球时间的5分钟。
仿真的频率是1x10^12.
以下与正文无关:
附录A: 一些可能的bug:
bug1: kvm
Exception: [configs/example/gem5_library/x86-parsec-benchmarks.py] KVM is required but is unavailable on this system
解决方法:
sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
sudo adduser `id -un` libvirt
sudo adduser `id -un` kvm
然后重启,或者至少重新开启终端。
bug2: libhdf5-dev
./build/X86/gem5.opt: error while loading shared libraries: libhdf5_serial_cpp.so.103: cannot open shared object file: No such file or directory
解决方法:
sudo apt install libhdf5-dev
bug3:
in the file ‘/proc/sys/kernel/perf_event_paranoid’. The default value was changed to 2 in kernel 4.6.
PARSEC 运行时需要perf_event_paranoid权限。大意是记录performance数据需要读取cpu的记录,被host物理机拒绝了,改为1就行。
sudo sysctl kernel.perf_event_paranoid=1