如何计算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?
我想用这个来学习:
答案 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
开头,则应该可以在该地址被命中时执行某些操作。
要查找感兴趣的地址,您可以使用readelf
或gdb
或tracing,以及如果在Linux上运行完整系统,请确保ASLR是关掉了。
这种技术是最不具侵入性的,但设置更难,说实话我还没有完成。有一天,有一天。