2010-06-04 17 views
11

Me gustaría establecer un perfil estadístico de mi código C en el nivel de instrucción. Necesito saber cuántas adiciones, multiplicaciones, divisiones, etc. estoy realizando.Instrucciones de seguimiento/creación de perfiles

Este no es el requisito habitual de generación de perfiles de código de fábrica. Soy un desarrollador de algoritmos y quiero estimar el costo de convertir mi código a implementaciones de hardware. Para esto, me preguntan el desglose de llamadas de instrucciones durante el tiempo de ejecución (el análisis del ensamblado compilado no es suficiente ya que no considera los bucles en el código).

Después de mirar a su alrededor, parece que VMware puede ofrecer una posible solución, pero aún no pude encontrar la característica específica que me permita rastrear el flujo de llamadas de instrucciones de mi proceso.

¿Conoce alguna herramienta de creación de perfiles que lo permita?

+0

Me parece que desea examinar no sólo los recuentos de ejecución de dichas instrucciones, pero a la fracción total de tiempo que cuenta porque, por ejemplo, suponga que toman el 50% del tiempo, y puede reducir esa parte a insignificante, solo ha obtenido un factor de 2 aceleración. –

+0

El tiempo de ejecución no es importante en este caso específico. No estoy realizando perfiles para la optimización de código. – LeChuck2k

Respuesta

7

Finalmente utilicé una solución trivial pero efectiva.

  1. Configurado BGF para mostrar el desmontaje de la siguiente instrucción (cada vez que se detenga) mediante la invocación:

display/i $pc

  1. configurado una GDB sencilla secuencia de comandos que se rompe en la función que necesito analizar y procede a la instrucción paso por instrucción:

    set $i=0 
    break main 
    run 
    while ($i<100000) 
    si 
    set $i = $i + 1 
    end 
    quit 
    

  2. GDB Ejecutado con mi guión vertido salida en un archivo de registro:

    gdb -x script a.out > log.txt

  3. Analizado el registro para registrar las llamadas de instrucciones específicas.

crudo, pero funciona ...

4

La herramienta valgrind cachegrind se puede utilizar para obtener recuentos de ejecución de cada línea en el ensamblado compilado (el valor Ir en la primera columna).

4

Puede utilizar pin-instat que es una herramienta PIN. Es un poco exagerado ya que registra más información que el recuento de instrucciones. Todavía debería ser más eficiente que su enfoque de gdb.

Descargo de responsabilidad: soy el autor de pin-instat.

+0

Como arquitecto de computadoras, esta pequeña pieza de software realmente me ayuda a razonar acerca de mis diseños. ¡Gracias por hacer este trabajo! –

3

La herramienta de Linux perf le proporcionará una buena cantidad de información de creación de perfiles; específicamente, perf annotate le dará recuentos relativos por instrucción.

Es posible desglosar hasta el nivel de instrucción con perf annotate. Para eso, necesita invocar perf annotate con el nombre del comando para hacer anotaciones.Todas las funciones con las muestras serán desmontados y cada instrucción tendrá su porcentaje relativo de muestras reportaron:
 
perf record ./noploop 5 
perf annotate -d ./noploop 

------------------------------------------------ 
Percent | Source code & Disassembly of noploop.noggdb 
------------------------------------------------ 
     : 
     : 
     : 
     : Disassembly of section .text: 
     : 
     : 08048484 <main>: 
    0.00 : 8048484:  55      push %ebp 
    0.00 : 8048485:  89 e5     mov %esp,%ebp [...] 
    0.00 : 8048530:  eb 0b     jmp 804853d <main+0xb9> 
    15.08 : 8048532:  8b 44 24 2c    mov 0x2c(%esp),%eax 
    0.00 : 8048536:  83 c0 01    add $0x1,%eax 
    14.52 : 8048539:  89 44 24 2c    mov %eax,0x2c(%esp) 
    14.27 : 804853d:  8b 44 24 2c    mov 0x2c(%esp),%eax 
    56.13 : 8048541:  3d ff e0 f5 05   cmp $0x5f5e0ff,%eax 
    0.00 : 8048546:  76 ea     jbe 8048532 <main+0xae> [...]