m5
工具
一个很好的近似是运行,理想情况下是从程序的 shell 脚本中运行/init
:
m5 resetstats
run-benchmark
m5 dumpstats
然后在主机上:
grep -E '^system.cpu.numCycles ' m5out/stats.txt
给出类似的东西:
system.cpu.numCycles 33942872680 # number of cpu cycles simulated
请注意,如果您m5 checkpoint
使用不同的 CPU 从 a 重放,例如:
--restore-with-cpu=HPI --caches
那么您需要 grep 获取不同的标识符:
grep -E '^system.switch_cpus.numCycles ' m5out/stats.txt
resetstats
将累积统计数据归零,并dumpstats
转储基准测试期间收集的数据。
这并不完美,因为 exec 系统调用m5 dumpstats
完成和基准测试开始之间有一段时间,但如果基准足够,这应该没关系。
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 在完成时会转储统计信息。
仪表说明
有时这些似乎是不可避免的,您必须使用这些指令稍微修改输入源代码,以便:
您当然可以从 gem5m5
工具代码代码中推断出这些指令,但这里有一些非常容易重复使用 arm 和 aarch64 的一行复制粘贴,例如对于 aarch64:
/* resetstats */
__asm__ __volatile__ ("mov x0, #0; mov x1, #0; .inst 0XFF000110 | (0x40 << 16);" : : : "x0", "x1")
/* dumpstats */
__asm__ __volatile__ ("mov x0, #0; mov x1, #0; .inst 0xFF000110 | (0x41 << 16);" : : : "x0", "x1")
该m5
工具在底层使用相同的机制,但通过将指令直接添加到源代码中,我们避免了系统调用,因此更精确和更具代表性(以更多的手动工作为代价)。
但是,为了确保编译器不会围绕您的 ROI 对程序集进行重新排序,您可能需要使用以下技术中提到的技术:Enforcing statement order in C++
地址监控
另一种可以使用的技术是监视感兴趣的地址,而不是向源添加魔法指令。
例如,如果您知道基准以 开头PIC == 0x400
,那么当该地址被命中时应该可以做一些事情。
要查找感兴趣的地址,您必须使用readelf
orgdb
或tracking,如果在 Linux 上运行完整系统,请确保关闭 ASLR。
这种技术是侵入性最小的技术,但设置更难,老实说我还没有做过。一天,一天。