3

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

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

  • 完整的系统用户态基准。也许m5来宾工具有办法做到这一点?

  • 裸机基准。当 gem5 退出时,它会自动转储统计信息,因此主要问题是如何跳过引导加载程序的周期并直接进入基准测试本身。

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

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

我想用这个来学习:

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

1 回答 1

2

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,那么当该地址被命中时应该可以做一些事情。

要查找感兴趣的地址,您必须使用readelforgdbtracking,如果在 Linux 上运行完整系统,请确保关闭 ASLR。

这种技术是侵入性最小的技术,但设置更难,老实说我还没有做过。一天,一天。

于 2018-02-23T09:18:56.887 回答