程序在ARM Cortex-A8处理器中的执行时间



我正在使用ARM Cortex-A8,并试图通过汇编代码从CCNT时间计数器读取值。如何在ARM Cortex-A8处理器中测量程序执行时间?。根据它,在我可以从计时器读取值之前,我必须启用计数器,启用64位除法并清除溢出。这些操作是通过在适当的寄存器(例如,PMCR(性能监控寄存器))内写入来执行的。因此,我在循环中打印计数器值来跟踪溢出是如何发生的,我有这样的行为:

1           (starts to incrementing after it was reset to zero)
4650
4858
4943
5023
...
...        (incrementing...)
...
4293939054
4293939128       (overflow happens)
1602570          
1602703
1602788
...
...
4293522911
4293522987
4293523062
4293523137
1186243
1186367
1186453
1186536
1186612
1186686
...
4293536300
4293536377
4293536456
4293536533
4293536612
1199090
1199209
1199295
1199373
1199453
1199530
….
and so forth.

因此,我有一组问题:

a) Linux内核使用了上述哪个寄存器?(进一步内核版本的信息有多可靠)。他们价值观的改变有多安全?

b) CCNT频率的准确值是多少,如何得到它?不幸的是,我无法在处理器规范中找到该值。然而,dmesg说

[ 0.000000] OMAP clocksource: GPTIMER2 at 24000000 Hz
[ 0.000000] sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 178956ms
[ 0.132855] Switching to clocksource gp timer

但是手动识别它,反对clock_gettime,给我7 MHz。那么,为什么它不是预期的24mhz呢?

c)根据我的第一个输出,为什么在溢出后它不是从零开始,而是从大约1 mil开始?

d)为什么没有64除法我得到错误的结果?该值开始以这种方式跳转:

...
134110099
134114934
134119656
302352300
302361825
302367135
…
2885588930
2885593776
2885598630
3053958670
3053966752
3053972232
…
261130096
261134909
429343853
429351487
429356735

我很感激任何帮助。由于

a) Linux内核的perf子系统可以使用PMU regs(通过perf userspace工具访问)。

b) CCNT频率为Cortex-A9 CPU周期计数器,如果启用分频器,则为cycles/64。因此,7MHz与分压器将是一个平均的CPU时钟约450 MHz。这与24 MHz系统时钟是分开的。

c)也许你的进程被安排出去了。这是一个用于整个CPU的低级周期计数器,而不仅仅是您的进程。无论在内核中还是在其他进程中,它都将继续运行。另一方面,如果您的进程迁移到另一个CPU,那么您将访问该CPU的周期计数器(甚至可能没有相同的分压器设置)。如果你想要一个一致的计数,你应该把你的进程固定在一个CPU上。

d)与(c)类似,您可能会看到进程调度和迁移的效果。

相关内容

  • 没有找到相关文章

最新更新