Mida el tiempo de ejecución en ARM Cortex-A8 usando el contador de hardware

Estoy usando un procesador Exynos 3110 (ARM Cortex-A8 de un solo núcleo de 1 GHz, por ejemplo, usado en el Nexus S) e intento medir los tiempos de ejecución de funciones particulares. Tengo un Android 4.0.3 ejecutándose en el Nexus S. Probé el método desde

[1]¿Cómo medir el tiempo de ejecución del programa en el procesador ARM Cortex-A8?

Cargué el módulo del kernel para permitir leer los valores de registro en modo de usuario. Estoy usando el siguiente programa para probar el contador:

static inline unsigned int get_cyclecount (void)
{
    unsigned int value;
    // Read CCNT Register
    asm volatile ("MRC p15, 0, %0, c9, c13, 0\t\n": "=r"(value));
    return value;
}


static inline void init_perfcounters (int do_reset, int enable_divider)
{
    // in general enable all counters (including cycle counter)
    int value = 1;

    // peform reset:  
    if (do_reset)
    {
        value |= 2;     // reset all counters to zero.
        value |= 4;     // reset cycle counter to zero.
    } 

    if (enable_divider)
        value |= 8;     // enable "by 64" divider for CCNT.

    value |= 16;

    // program the performance-counter control-register:
    asm volatile ("MCR p15, 0, %0, c9, c12, 0\t\n" :: "r"(value));  

    // enable all counters:  
    asm volatile ("MCR p15, 0, %0, c9, c12, 1\t\n" :: "r"(0x8000000f));  

    // clear overflows:
    asm volatile ("MCR p15, 0, %0, c9, c12, 3\t\n" :: "r"(0x8000000f));
}


int main(int argc, char **argv)
{
    int i = 0;
    unsigned int start = 0;
    unsigned int end = 0;

    printf("Hello Counter\n");

    init_perfcounters(1,0);

    for(i=0;i<10;i++)
    {
        start = get_cyclecount();
        sleep(1); // sleep one second
        end = get_cyclecount();

        printf("%u %u %u\n", start, end, end - start);
    }

    return 0;
}

Según [1] el contador se incrementa con cada ciclo de reloj. Cambié scaling_governor al espacio de usuario y configuré la frecuencia de la CPU a 1 GHz para asegurarme de que Android no cambie la frecuencia del reloj.

Si ejecuto el programa, se ejecutan los intervalos de 1 segundo, pero los valores del contador están en el rango de ~ 200e6, en lugar del esperado 1e9. ¿Hay algo de procesador específico que me falta aquí? ¿La frecuencia de reloj de los contadores es diferente a la velocidad de reloj del procesador?

Respuestas a la pregunta(4)

Su respuesta a la pregunta