2011-06-17 66 views
10

我正在优化软件,并希望测量性能。所以我目前正在用OVP(开放式虚拟平台)模拟一个ARM平台,并将统计数据作为模拟时间和模拟指令。如何测量ARM性能?

我的问题是,为什么每次运行软件时都有不同的模拟指令(不同但接近)?每次都不一样吗?是不是这样,我用C编写的软件将被编译为ARM汇编程序指令,并且每次运行软件时,模拟指令将是这些ARM汇编程序指令运行多少次?每次都应该是一样的?

我应该如何测量性能?取10个模拟指令样本并获得平均值?

+0

某些系统可能会在每次运行的测量设备的一个时钟周期内出现,对于某些系统而言,有些系统不会允许这种情况发生。无论如何,这可能与你在做什么有关。你正在运行嵌入式操作系统吗?你在与外围设备,网络等通话时使用哪种软件? – 2011-06-17 13:43:32

+3

指令的数量可能会因您正在做的事情而有所不同,比如说您有20个指令轮询某些事件或外设来完成某些事情。如果从一次运行到下一次运行,你只是错过了一个事件,并且必须再次运行该循环,则有20个指令差异。这种情况在每次模拟中都会发生几次或几次,这可能会增加明显的差异。如果您将代码和测试定制为永远不能依赖外部事件的东西,并且设计将执行相同的路径,那么每次都应该是相同的。 – 2011-06-17 13:46:40

+0

你想要衡量什么样的表现? CPU,内存,IO,网络?如果我们在谈论cpu,bogomips可能值得一试/看。 – PhilW 2011-07-26 08:46:49

回答

4

从我在一个真正的(非模拟)ARM的经验,如果我走循环计数代码循环的数量会有所不同的部分,这是因为:

  • 可以有上下文切换在执行代码的中间。
  • 输入代码段时,CPU的初始状态可能会有所不同。 (例如流水线的内容,分支预测等)
  • 在进入代码部分时,高速缓存状态将不同。
  • 外部因素,如其他硬件访问外部存储器。

由于所有这些因素,对于真实硬件和真正的操作系统来说,采取平均值(加上其他一些统计测量)确实是唯一实用的方法。在一个好的模拟器中,这些因素中的一些或可能被消除。

在某些实际芯片上(或者如果仿真器支持),ARM Performance Monitoring Unit可能会有用。

如果你正在编写Cortex A8 this是一个很酷的在线循环计数器,它可以真正帮助你从你的代码中获得更多的性能。