samsung procesadores procesador cortex caracteristicas arquitectura a53 c arm performancecounter cortex-a8 time-measurement

procesadores - arquitectura arm pdf



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

¿Estás seguro de que los gobernadores se usan en Android para la gestión del rendimiento de la misma forma que en Linux estándar? ¿Y está usando una imagen personalizada de Android o una proporcionada por el fabricante? Asumiría que existen políticas de menor nivel en la imagen proporcionada por el fabricante (relacionada con la actividad de durmientes o módems, etc.). También podría ser que el código de sueño escale directamente el voltaje y la frecuencia. Podría valer la pena deshabilitar todo el CPUFreq, no solo las políticas (o los gobernadores).

Estoy usando un procesador Exynos 3110 (1 GHz Single-core ARM Cortex-A8, por ejemplo, usado en el Nexus S) y trato de 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 kernel para permitir la lectura de 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é el scaling_governor al espacio de usuario y configuré la frecuencia de la CPU en 1GHz para asegurarme de que Android no cambia la frecuencia del reloj.

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


Echa un vistazo a la página de este profesor: http://users.ece.utexas.edu/~valvano/arm/ Tiene múltiples programas completos de ejemplo que tienen que ver con time / periodic-timers / measuring-execution-time, están desarrollados para Microcontroladores basados ​​en ARM Cortex-M3. Espero que esto no sea muy diferente de lo que estás trabajando. Creo que estarías interesado en Performance.c