2010-11-17 9 views
6

Quiero saber cuántas instrucciones x86-64 se ejecutan durante una ejecución determinada de un programa que se ejecuta en Red Hat Enterprise Linux. Sé que puedo obtener esta información del valgrind pero la desaceleración es considerable. También sé que estamos usando CPU Intel Core 2 Quad (modelo Q6700) que tienen contadores de rendimiento de hardware integrados. Pero no conozco ninguna forma de acceder al número total de instrucciones ejecutadas desde un programa C.¿Cómo puedo contar las instrucciones ejecutadas en Red Hat Enterprise Linux (x86-64)?

+0

solo preguntando. ¿Por qué querrías que se ejecutaran varias instrucciones? El número de ciclos parece más significativo que agregar instrucciones lentas (digamos accesos de memoria) con registros rápidos. – kriss

+0

El número de ciclos incluye puestos como esperar que se entreguen datos desde las memorias caché. Por lo tanto, difiere de ejecución a ejecución, mientras que el número de insns se mantiene constante – horsh

+0

@kriss: lo que dijo horsh --- Estoy buscando un número que sea estable y repetible. –

Respuesta

2

Performance Application Programming Interface (PAPI) parece ser a lo largo de las líneas de lo que busca.

Desde el website:

PAPI tiene como objetivo proporcionar al diseñador de herramientas y el ingeniero de aplicación con una interfaz consistente y metodología para el uso de los equipos de contadores de rendimiento que se encuentra en la mayoría de los microprocesadores principales.

Vince Weaver, un investigador postdoctoral Asociado con el Laboratorio de Computación Innovadora de la Universidad de Tennessee, hizo un poco de trabajo PAPI-related. La investigación que aparece en su web page en UTK parece que puede proporcionar información adicional.

2

libpapi es la biblioteca que está buscando. Los chips AMD e Intel brindan el número de entradas.

1

Hay varias formas de hacerlo, dependiendo de lo que necesite exactamente. Si solo quiere saber el número total de argumentos potenciales, puede ejecutar objdump en el binario, que le proporcionará el ensamblaje. Si desea información más detallada acerca de las instrucciones reales que se están ejecutando en un recorrido del programa, es posible que desee consultar el DynamoRIO que proporciona esa funcionalidad. Es similar a valgrind, pero creo que tiene un efecto menor en el rendimiento. Pude juntar un contador de instrucciones básicas con él en septiembre de manera relativamente rápida y fácil.

Si eso no es bueno, puede intentar consultar PAPI, que es una API que debe permitirle acceder a los contadores de rendimiento de sus procesadores. Nunca lo he usado, así que no puedo hablar por eso, pero un amigo mío lo usó en un proyecto hace unos 6 meses y dijo que lo encontró muy útil.

1

El programa debajo del acceso al contador de ciclos se registra desde C (código lamentable no portátil, pero funciona bien con gcc). Este es para contar ciclos, eso no es lo mismo que instrucciones. Los procesadores modernos pueden usar varios ciclos en la misma instrucción o ejecutar varias instrucciones a la vez. Los ciclos suelen interesar más a ese número de instrucciones, pero depende de su propósito real.

Sin duda, se puede acceder al contador de otras interpretaciones de la misma manera (en realidad ni siquiera sé si hay otras), pero tendré que buscar el código de instrucción real para usar.

static __inline__ unsigned long long rdtsc(void) 
{ 
    unsigned long long int x; 
    __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); 
    return x; 

}

Cuestiones relacionadas