¿Cómo verificar el recuento de ciclos en ARM?
Estoy midiendo el número de ciclos en un Raspberry Pi 3b+ (ARM Cortex A53).
Esto es lo que hago (tutorial):
static inline uint32_t read_counter(void)
{
uint32_t cc = 0;
asm volatile (“mrc p15, 0, %0, c9, c13, 0″:”=r” (cc));
return cc;
}
uint32_t t1 = read_counter();
volatile uint64_t n = 100000000;
while(n > 0) n–;
t1 = ccnt_read();
printf(“%u\n”, t1-t0);
Cuando ejecuto el código (usando taskset para mantener el proceso en una CPU: taskset 0x1 my_counter) obtengo en la salida: 1201120230 ciclos (1.201.120.230). Varía, pero siempre está alrededor de 1.201.000.000.
¿Cómo puedo verificar que esto está bien? ¿Cómo puedo saber la frecuencia de mi CPU? ¿Hay una mejor manera de usar el bucle while de 100000000?
Editar:
sudo cat /sys/devices/system/cpu/cpu[0-3]/cpufreq/cpuinfo_cur_freq
da
1400000
1400000
1400000
1400000
¿Significa esto que el valor esperado para el bucle de 1 segundo sería de 1.400.000.000 ciclos?
PD. Todavía no entiendo por qué el bucle while anterior debería durar 1 segundo.
davy.ai
Para verificar si el recuento de ciclos obtenido es exacto, es necesario calcular la frecuencia del CPU y utilizarla para calcular el número esperado de ciclos para un determinado periodo de tiempo. Una manera de averiguar la frecuencia del CPU en Raspberry Pi es utilizando el comando:
Esto nos dará la frecuencia máxima del CPU que soporta Raspberry Pi. En este caso, la salida es
1400000
, lo que significa que el valor esperado para el ciclo de 1 segundo sería1,400,000,000
ciclos.Sin embargo, dado que estamos utilizando un bucle
while
para un número fijo de iteraciones para medir el recuento de ciclos, puede que no sea exacto ya que el tiempo de ejecución del bucle puede variar debido a múltiples factores como la carga de CPU, los aciertos/fallos de caché y otras actividades del sistema. Una mejor manera de medir el recuento de ciclos es utilizando un temporizador de hardware.Una manera de lograr esto es utilizando la herramienta
perf
disponible en Linux. Podemos utilizarperf
para contar los ciclos del CPU con mayor precisión.Esto nos dará el número exacto de ciclos utilizados por nuestro programa.
perf
mide el número exacto de ciclos utilizados por el programa y evita la sobrecarga introducida por el buclewhile
.Utilizar
perf
es más preciso y confiable que utilizar un buclewhile
para medir el recuento de ciclos.