Skip to content

香山 gem5 环境环境

原生的 gem5 提供了模型供用户去修改,但是其仿真速度是一个很大的问题,虽然有采样得到检查点再从检查点恢复来减少仿真时间的手段,但是单单就生成检查点的时间都是非常长的,根据报告可能长达十几天以上,这是不能接受的。一个可行的解决方案而言是可以使用其内置的 KVM CPU 来进行采样、生成检查点等等,但是当运行 gem5 的 cpu 体系结构与 gem5 中模型的体系结构相同的时候才能这么做,对于当前的个人 pc 来说,大多数机器都是 x86 的,因此只能使用 x86 的 kvm cpu。但是我想研究的是 risc 指令集,如果有 apple m1 的话,或许能够使用其 ARM kvm 来进行加速,但是我没有,因此就要找别的方案。

很早就了解到了香山项目也在使用 gem5 进行体系结构探索,也知道他们采用了他们的加速技术,来解决 gem5 的仿真速度慢等问题,于是就想把香山全系统模拟的环境搭起来,然后供自己的研究使用。

核心原理

本来 gem5 的检查点原理就是将状态写到一个文件中,在需要恢复的时候再从一个文件中恢复。这个文件相当于一个接口,gem5 调用这个接口保存,同时也调用这个接口恢复,问题则在于调用保存的这个接口过程消耗的时间很长。如果自己设计一个文件格式,让 gem5 能从这种格式中恢复,同时不用 gem5 而是用其他速度更快的模拟器生成这种格式的文件,就能够实现整个流程的加速。

香山项目就是采取了这样的方法,他们自己设计文件格式,使用 NEMU 模拟器生成检查点(实测跑一个 benchmark 在 10 分钟内),然后再用 gem5 从这个文件中恢复检查点进行模拟,实现自己的体系结构探索。


下面就讲环境的搭建,顺便把自己搭建环境的时候的版本信息记录下来,省的下次还要重复搭建环境。

spec benchmark

版本:06a53ed2e2e8cfd9acf1516777e4d521db1951cb

这部分直接按照视频去做就行了,并不会遇到太大的问题,生成 benchmark 应该是比较顺利的。

initramfs

版本:7b6cf0ccdfdb103d2e5918712036634d4e973552

主要就是修改配置文件,没什么特别的问题,最主要就是引用某个 benchmark 的话映射的路径要写对。

riscv-linux

版本:655055af981b490cb6a12353a5bb846d2be79c6f

这部分也没什么问题,只要按照文档把相关的配置调整掉就行了。不需要在这个目录下面编译,后续 pk 会直接调用这个目录编译的。

risc-v pk

版本:a621e1620a1ab050d81f53743253e8eb5cf1b24e

这部分在手册上改动很多,但是实测发现如果根据手册改动,检查点虽然能够生成,也能够通过 NEMU 恢复,但是放到 gem5 上缺无法进行恢复,感觉很有可能是检查点的兼容问题等等。因此按照实测来说,这里不错任何的修改,不做对 bbl.lds 和 dtb 的相关修改,只是继续将地址保持在 0xa0000就行了,只是编译报错的时候解决报错问题就行了。

NEMU

版本:732e4ccdda9f3f5111cd5701a6eca8d887dfb025

按照教程正常编译,注意在编译 gcpt 的时候,需要将其的恢复地址和 bbl 中的地址对应上,gcpt.lds 中相关的链接脚本要把位置调整对,其他倒是没有太大的问题。

官网上说到需要加一段恢复程序之类的,香山项目已经自动把我们做了,这部分恢复程序就包含在 initramfs 目录的 app 文件夹下,用户能够自行选择编译。

在 NEMU 准备对 benchmark 生成检查点的时候,注意可以先使用 NEMU 或者 qemu 先跑一下 benchmark,保证 benchmark 是能够正常运行的。然后如果生成这个检查点的过程中出现错误,去查相关的日志就行了。检查点生成之后记得再去按照官网给的代码去运行恢复下,保证检查点是正确的。

gem5

版本:de13e7e4f7ce65291b64faf99494d044aa3790ba

总体来说在版本对上之后这步也没什么问题,但是着实这步进行了好久,感觉可能是检查点兼容问题。这里需要注意的是把相关的变量设置对,就是 NEMU ref 和 gcpt,在运行的时候看看输出的日志,看看自己到底设置对了没有。