如何验证 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。
我正在 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。