如何验证 ARM 上的周期计数?

How to verify cycle count on ARM?

我正在 Raspberry Pi 3b+ (ARM Cortex A53) 上测量周期数。

static inline uint32_t read_counter(void)
{
    uint32_t cc = 0;
    __asm__ volatile ("mrc p15, 0, %0, c9, c13, 0":"=r" (cc));  
    return cc;
}

这就是我所做的 (tutorial):

uint32_t t1 = read_counter();       

volatile uint64_t n = 100000000;
while(n > 0) n--;

t1 = ccnt_read();
printf("%u\n", t1-t0);

当我执行代码时(使用 taskset 将进程保持在一个 CPU: taskset 0x1 my_counter 上)我得到输出:1201120230 cycles (1.201.120.230).它会有所不同,但总是在 1.201.000.000.

附近

$ time taskset 0x1 ./cycles

我如何验证这是否正常?我如何找出我的 CPU 频率?有没有比使用 100000000 while 循环更好的方法?

编辑: sudo cat /sys/devices/system/cpu/cpu[0-3]/cpufreq/cpuinfo_cur_freq 给出

1400000
1400000
1400000
1400000

这意味着 1 秒循环的预期值为 1.400.000.000 个周期?

p.s。 我仍然不明白为什么上面的 while 循环应该是 1 秒长?

运行之后:

$ time taskset 0x1 ./cycles

输出将给出周期和秒数:

Count (about) 1 second: 1201120230 cycles:

real    0m0.855s
user    0m0.854s
sys     0m0.000s

要检查这些值是否“有意义”,请将您的周期除以时钟频率

1201120230 / 1400000000 = 0.857

并与实测时间进行比较

在这种情况下似乎很接近,所以循环计数没问题。

提示:由于时钟频率经常随着 CPU 进入省电模式而变化,因此最好先将时钟设置为恒定频率。有关如何执行此操作的更多信息 here