es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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.

Tags:  , ,

Answer

  1. Avatar for 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:

    sudo cat /sys/devices/system/cpu/cpu[0-3]/cpufreq/scaling_max_freq
    

    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ía 1,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 utilizar perf para contar los ciclos del CPU con mayor precisión.

    sudo perf stat -e cycles taskset 0x1 my_counter
    

    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 bucle while.

    Utilizar perf es más preciso y confiable que utilizar un bucle while para medir el recuento de ciclos.

Comments are closed.