如何计算gem5中基准测试开始和结束之间的CPU时钟周期数?

时间:2018-02-23 09:18:41

标签: gem5

如何计算gem5中基准测试开始和结束之间的CPU时钟周期数?

我对以下所有情况感兴趣:

  • 完整的系统用户态基准。也许m5访客工具有办法实现吗?

  • 裸机基准。当gem5退出时,它会自动转储统计信息,因此主要问题是如何跳过bootloader的循环并直接进入基准测试。

    除了使用仪表指令修改基准源之外,还有其他方法吗?如何详细编写这些仪器指令?

  • 系统调用仿真基准。我认为gem5只是在运行结束时输出stats.txt,然后你只需要grep system.cpu.numCycles,但我必须确认它,目前已阻止:How to solve "FATAL: kernel too old" when running gem5 in syscall emulation SE mode?

我想用这个来学习:

  • 了解CPU的工作原理
  • 如何优化汇编代码或编译器设置以在给定CPU上以最佳方式运行

1 个答案:

答案 0 :(得分:1)

m5工具

一个很好的近似是运行,理想情况是从/init程序的shell脚本运行:

m5 resetstats
run-benchmark
m5 dumpstats

然后在主持人身上:

grep -E '^system.cpu.numCycles ' m5out/stats.txt

给出类似的东西:

system.cpu.numCycles                      33942872680                       # number of cpu cycles simulated

请注意,如果您从具有不同CPU的m5 checkpoint重播,例如:

--restore-with-cpu=HPI --caches

然后你需要grep寻找一个不同的标识符:

grep -E '^system.switch_cpus.numCycles ' m5out/stats.txt

resetstats将累积统计数据清零,dumpstats转储在基准测试期间收集的内容。

这并不完美,因为在m5 dumpstats完成的exec系统调用与基准测试开始之间有一段时间,但如果足够的基准,这应该不重要。

http://arm.ecs.soton.ac.uk/wp-content/uploads/2016/10/gem5_tutorial.pdf还提出了一些启发式方法:

#!/bin/sh
# Wait for system to calm down
sleep 10
# Take a checkpoint in 100000 ns
m5 checkpoint 100000
# Reset the stats
m5 resetstats
run-benchmark
# Exit the simulation
m5 exit

m5 exit也有效,因为GEM5在完成时会转储统计信息。

仪表说明

有时候那些似乎是不可避免的,您必须使用这些指令稍微修改输入源代码才能:

  • 跳过初始化并直接进入稳定状态
  • 评估各个主循环运行

您当然可以从gem5代码中推断出这些指令,但是here are some very easy to re-use one line copy pastes for arm and aarch64,例如:

static void m5_checkpoint(void)
{
    __asm__ __volatile__ ("mov r0, #0; mov r1, #0; mov r2, #0; mov r3, #0; .inst 0xEE000110 | (0x43 << 16);");
};

m5工具使用相同的机制,但通过直接将指令添加到源中,我们避免了系统调用,因此更加精确和具有代表性(以更多的手动工作为代价)。 / p>

地址监控

可以使用的另一种技术是监视感兴趣的地址,而不是向源添加魔术指令。

,例如,如果您知道基准测试以PIC == 0x400开头,则应该可以在该地址被命中时执行某些操作。

要查找感兴趣的地址,您可以使用readelfgdbtracing,以及如果在Linux上运行完整系统,请确保ASLR是关掉了。

这种技术是最不具侵入性的,但设置更难,说实话我还没有完成。有一天,有一天。