如何使用 qemu 对算法进行分析

Zha*_* Li 1 c qemu

我现在有一个程序在 Ubuntu 上运行良好。该程序纯用C语言编写,最终将在嵌入式处理器上运行。我希望知道它在不同目标上的执行速度,例如Cortex M3、M4或A系列。由于double类型的算术非常多,所以区别应该很明显。目前,我的想法是使用 qemu 来统计对某些数据集执行的指令。由于该程序仅涉及数据处理,因此唯一需要的资源应该是 RAM。

我不需要非常准确的结果,因为它只能作为选择CPU的指导。有一些简单的任务指南吗?我对 qemu 的经验很少。我看到有两种调用 qemu 的方法:qemu-system-arm 和 qemu-user。我想最准确的模拟结果应该是qemu-system-arm。更何况Cortex M系列应该因为缺少MMU而不支持Linux吧?

Pet*_*ell 6

关于如何做到这一点的信息并不多,因为通常很难在模拟的 CPU/系统上对客户代码进行分析并从真实硬件上的性能信息中获取有用的信息。这是因为真实硬件上的性能通常强烈依赖于大多数仿真(特别是 QEMU)不建模的事件,例如:

  • 分支错误预测
  • 缓存未命中
  • TLB 未命中
  • 内存延迟

以及指令之间周期数的差异(通常不如上述显着)——例如,在 Cortex-M4 上,VMUL.F32 是 1 个周期,但 VDIV.F32 是 14 个周期。

对于 Cortex-M CPU 来说,硬件足够简单(即没有缓存、没有 MMU),简单的指令数可能与实际性能相差不远,但对于 A 级核心来说,仅指令数就可能是极具误导性。

人们有时想要采取的另一种方法是测量模型下的运行时间;这可能比计算指令更糟糕,因为一些在真实硬件上非常快的东西在模拟器中却非常慢(例如浮点指令),并且因为 JIT 过程在不可预测的时间引入了额外的开销。

除了概念上的困难之外,QEMU 目前对于获取指令计数等信息并不是一个非常有用的环境。您也许可以使用TCG 插件 API做一些事情(如果幸运的话,示例插件之一可能就足够了)。

综上所述,如果您想了解一段代码在特定硬件上的性能,最简单、最准确的方法是在真实硬件上运行和分析该代码。