如何计算 gem5 中基准测试开始和结束之间的 CPU 时钟周期数?
我对以下所有情况都感兴趣:
完整的系统用户空间基准测试。也许
m5
guest 工具有办法做到这一点?裸机基准测试。当 gem5 退出时,它会自动转储统计数据,因此主要问题是如何跳过引导加载程序的周期并直接进入基准测试本身。
除了使用检测指令修改基准源之外,还有其他方法吗?如何详细编写那些仪器指令?
系统调用模拟基准。我认为 gem5 只是在运行结束时输出
stats.txt
,然后你可以 grepsystem.cpu.numCycles
,但我必须确认一下,目前封锁于:How to solve "FATAL: kernel too old" when running gem5 in syscall emulation SE mode?
我想用这个来学习:
- 了解 CPU 的工作原理
- 如何优化汇编代码或编译器设置以在给定 CPU 上以最佳方式运行
最佳答案
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 检查点
重播,例如:
--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 m5
工具代码中推断出这些指令,但是 here are some very easy to re-use one line copy pastes for arm and 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
或 gdb
或 tracing ,如果在 Linux 上运行完整系统,请确保关闭 ASLR。
这项技术是侵入性最小的技术,但设置更难,老实说我还没有做过。一天,一天。
关于gem5 - 如何计算 gem5 基准测试开始和结束之间的 CPU 时钟周期数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48944587/