如何在恢复检查点后切换gem5中的CPU模型,然后观察差异?

时间:2018-02-27 14:32:17

标签: gem5

我希望使用轻量级CPU以完整系统(FS)模式启动Linux内核以节省时间,在启动完成后创建检查点,然后使用更详细的CPU恢复检查点以研究基准测试,如上所述:http://gem5.org/Checkpoints

但是,当我尝试使用-r 1 --restore-with-cpu=时,我无法观察到新旧CPU之间的周期差异。

我正在考虑的措施是缓存大小如何影响基准运行所需的周期数。

我正在使用的设置详见:Why doesn't the Linux kernel see the cache sizes in the gem5 emulator in full system mode?我正在查看循环计数,因为我目前无法直接使用Linux内核查看缓存大小。< / p>

例如,如果我使用带有命令的详细而缓慢的HPI模型(摘录)从头开始启动Linux内核:

./build/ARM/gem5.opt --cpu-type=HPI --caches --l1d_size=1024 --l1i_size=1024 --l2cache --l2_size=1024 --l3_size=1024 

然后更改缓存大小,随着缓存大小变得更好,基准测试会变得更快。

但是,如果我首次启动时没有使用--cpu-type=HPI更快的AtomicSimpleCPU模型的./build/ARM/gem5.opt --caches --l1d_size=1024 --l1i_size=1024 --l2cache --l2_size=1024 --l3_size=1024

m5 checkpoint

然后我用./build/ARM/gem5.opt --restore-with-cpu=HPI -r 1 --caches --l1d_size=1024 --l1i_size=1024 --l2cache --l2_size=1024 --l3_size=1024 创建检查点并尝试恢复更快的CPU:

AtomicSimpleCPU

然后更改缓存大小没有区别:我总是得到与AtomicSimpleCPU相同的循环计数,表明修改后的恢复不成功。

如果我尝试从DerivO3CPU切换到update(hospital: Hospital): Promise<Hospital> { hospital.name=‘’; const url =`${this.hospitalsUrl}/${hospital.id}`; return this.http.put(url, JSON.stringify(hospital), {headers: this.headers}) .toPromise() .then(() => hospital); ,则类似于x86。

邮件列表中的相关旧帖子:http://thread.gmane.org/gmane.comp.emulators.m5.users/14395

测试时间:fbe63074e3a8128bdbe1a5e8f6509c565a3abbd4

3 个答案:

答案 0 :(得分:1)

通过阅读一些代码我相信--restore-with-cpu特别适用于使用不是AtomicCPU的CPU模型创建检查点的情况。脚本假定AtomicCPU用于创建检查点。我认为在恢复时重要的是拥有与系统检查点相同的cpu模型,如果你给另一个带有--cpu-type的模型,那么它在恢复操作完成后切换到该模型。

http://gem5.org/Checkpoints#Sampling有关于切换cpu模型的一些(小)细节

答案 1 :(得分:0)

--cpu-type=影响了恢复,但--restore-with-cpu=没有

我不确定为什么会这样,但我有empirically verified如果我这样做:

-r 1 --cpu-type=HPI

然后正如预期的那样,缓存大小选项开始影响循环计数:更大的缓存会导致更少的循环。

另请注意,缓存不会对AtomicSimpleCPU造成太大影响,并且没有太多意义。

TODO那么--restore-with-cpu= vs --cpu-type如果它在我的测试中似乎没有做任何事情的话有什么意义呢?

除了让我感到困惑,因为如果--cpu-type != --restore-with-cpu,那么周期次数会显示在system.switch_cpus.numCycles而不是system.cpu.numCycles下。

我相信这是正在发生的事情(尚未经过测试):

  • switch_cpu包含您切换到的CPU的统计信息
  • 当您设置--restore-with-cpu= != --cpu-type时,它认为您已经拥有 从一开始就切换CPU
  • --restore-with-cpu对初始CPU没有影响。它只是 对于在运行期间切换CPU的选项很重要,例如: --fast-forward--repeat_switch。这是您将看到cpu和switch_cpu数据都被填满的地方。

TODO:另外,如果我使用或删除--restore-with-cpu=,则周期差异小1%。但为什么会有差异呢? AtomicSimpleCPU循环计数完全不同,所以它不能再落后于它。

答案 2 :(得分:0)

首先,对于您的问题,我不认为周期计数如何指示恢复结果。无论您要切换哪个CPU,要恢复的周期都应该相同。切换不会改变过去的周期。创建检查点时,基本上可以将模拟冻结在该状态。切换CPU只需更改CPU的所有参数,同时保持刻度不变。就像热插拔CPU。

要正确地验证还原,您应在还原前保留一份config.json的副本,并将其与还原后的新副本进行比较。对于X86情况,我只能在还原之前在此找到字符串AtomicSimpleCPU

此外,只有--cpu-type将确定要切换的CPU。但这不会使--restore-with-cpu变得无用。实际上,--restore-with-cpu仅应在使用AtomicSimpleCPU以外的CPU引导系统时使用。大多数人都希望使用AtomicSimpleCPU来启动系统并进行检查,因为它更快。但是,如果您错误地使用DerivO3CPU进行启动以还原此特定检查点,则必须将--restore-with-cpu配置为DerivO3CPU。否则,它将失败。