首页 > 解决方案 > 如何使用 qemu 对算法进行分析

问题描述

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

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

标签: cqemu

解决方案


关于如何执行此操作的内容并不多,因为通常很难在模拟的 CPU/系统上对来宾代码进行分析并从有关真实硬件性能的有用信息中获取。这是因为真实硬件上的性能通常强烈依赖于大多数仿真(尤其是 QEMU)没有建模的事件,例如:

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

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

对于 Cortex-M CPU,硬件足够简单(即没有缓存,没有 MMU),简单的指令数可能与实际性能相差不远,但仅对于 A 级内核指令数可能高度误导。

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

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

总之,如果你想知道一段代码在特定硬件上的性能,最简单、最准确的方法是在真实硬件上运行和分析代码。


推荐阅读