Reputation: 8610
I am measuring cycle counts on 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;
}
This is what I do (tutorial):
uint32_t t1 = read_counter();
volatile uint64_t n = 100000000;
while(n > 0) n--;
t1 = ccnt_read();
printf("%u\n", t1-t0);
When I execute the code (using taskset
to keep the process on one CPU: taskset 0x1 my_counter
) I get at the output: 1201120230
cycles (1.201.120.230
). It varies, but it is always around 1.201.000.000
.
$ time taskset 0x1 ./cycles
How would I verify that this is OK? How do I find out my CPU frequency? Is there a better way than using the 100000000 while
loop?
Edit:
sudo cat /sys/devices/system/cpu/cpu[0-3]/cpufreq/cpuinfo_cur_freq
gives
1400000
1400000
1400000
1400000
This means expected value for the 1 second loop would be 1.400.000.000
cycles?
p.s. I still don't understand why the above while loop is supposed to be 1 second long?
Upvotes: 0
Views: 1386
Reputation: 8610
After running:
$ time taskset 0x1 ./cycles
the output will give cycles and seconds:
Count (about) 1 second: 1201120230 cycles:
real 0m0.855s
user 0m0.854s
sys 0m0.000s
To check if the values "make sense", divide your cycles with the clock frequency
1201120230 / 1400000000 = 0.857
and compare with the time measured.
In this case it seems close, so the cycle count is OK.
Tip: since the clock frequency often varies as the CPU goes into power-save modes, it's a good idea to first set the clock to constant frequency. More info on how to do that here.
Upvotes: 1