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

标签 gem5

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

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

  • 完整的系统用户空间基准测试。也许 m5 guest 工具有办法做到这一点?

  • 裸机基准测试。当 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 上以最佳方式运行

最佳答案

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 开头,则应该可以在命中该地址时执行某些操作。

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

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

关于gem5 - 如何计算 gem5 基准测试开始和结束之间的 CPU 时钟周期数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48944587/

相关文章:

gem5 - 提交的指令和提交的操作之间的区别

python - 如何在 gem5 中创建区域缓存

c - 编译 glibc 时 mipsel-gcc 产生的奇怪加载指令

gem5 - gem5 中的伪指令是什么?

c++ - Gem5 中的 UART 通信与 ARM 裸机

scons - 构建gem5时出错: TypeError : File/hdd/Me/gem5/src/systemc/ext/systemc found where directory expected

linux - 使用 DramSim2 运行 gem5

linux - 卸载或创建多个 gem5 模拟

gem5 - 何时在 gem5 中将完整系统 FS 与系统调用仿真 SE 与用户态程序一起使用?