2010-01-27 11 views
9

trato de un simple perfil prog c usando valgrind:valgrind, el temporizador de generación de perfiles expiró?

[zsun @ nel6005001 ~] $ valgrind --tool = memcheck ./fl.out
== 2238 == Memcheck, un detector de error de memoria
== 2238 == Copyright (C) 2002-2009, y GNU GPL'd, por Julian Seward et al.
== 2238 == Usando Valgrind-3.5.0 y LibVEX; vuelva a ejecutar con -h para obtener información de derechos de autor
== 2238 == Comando: ./fl.out
== 2238 ==
== == 2238
== == 2238 PAFH RESUMEN:
== 2238 == en uso en la salida: 1.168 bytes en bloques de 1
== 2238 == uso total montón: 1 allocs, 0 Libera, 1.168 bytes asignados
== 2238 ==
== 2238 == FUGAS RESUMEN:
== 2238 == definitivamente perdido: 0 bytes en 0 bloques
== 2238 == indirectamente perdido: 0 bytes en 0 bloques
== 2238 == posiblemente perdido: 0 bytes en 0 bloques
== 2238 == todavía alcanzable: 1.168 bytes en bloques de 1
== 2238 == suprimidos: 0 bytes en 0 bloques
== 2238 = = Volver a ejecutar con --leak-check = completo para ver detalles de la memoria perdida
== 2238 == ==
2238 == para los recuentos de errores detectados y suprimidos, vuelva a ejecutar con: -v
== == 2238 RESUMEN DE ERROR: 0 errores de 0 contextos (suprimido: 12 de 8)
Temporizador de generación de perfiles caducado

El código c Estoy tratando de perfil es el siguiente:

void forloop(void){ 
    int fac=1; 
    int count=5; 
    int i,k; 

    for (i = 1; i <= count; i++){ 
     for(k=1;k<=count;k++){ 
      fac = fac * i; 
     } 
    } 
} 

"temporizador expiró Profiling" aparece, ¿qué significa? ¿Cómo resolver este problema? ¡Gracias!

Respuesta

0

No va a poder calcular 10000! así. Necesitará algún tipo de implementación de bignum para calcular factoriales. Esto se debe a que int es "generalmente" de 4 bytes de longitud, lo que significa que "normalmente" puede contener 2^32 - 1 (firmado int, 2^31) - 13! es más que eso. Incluso si usó un unsigned long ("generalmente" 8 bytes), se desbordará cuando llegue a 21!.

En cuanto a lo que significa "temporizador de generación de perfiles", significa que valgrind recibió la señal SIGPROF: http://en.wikipedia.org/wiki/SIGPROF (probablemente significa que su programa tardó demasiado).

+0

bien, si cambio el código de la siguiente manera: int main (void) { int fac = 1; int count = 10; int k; para (k = 1; k <= conteo; k ++) { fac = fac * k; } return 0; } tipo i los comandos: [zsun @ nel6005001 ~] $ gcc -g -pg -o fl.out forAndWhileLoop.c [zsun @ nel6005001 ~] $ valgrind --tool = macizo ./fl. fuera == 2639 == macizo, un perfilador montón == 2639 Derechos de autor == (C) 2003-2009, y GNU GPL, por Nicholas Nethercote == 2639 == Uso de Valgrind-3.5. 0 y LibVEX; vuelva a ejecutar con -h para obtener información de derechos de autor == 2639 == Comando: ./fl.out == 2639 == == == 2639 temporizador expiró perfiles ,, mismo problema. ¿por qué? – martin

16

El problema es que está utilizando valgrind en un programa compilado con -pg. No puede usar valgrind y gprof juntos. El manual valgrind sugiere usar OProfile si está en Linux y necesita perfilar la emulación real del programa bajo valgrind.

+0

si uso oprofile, entonces ¿para qué sirve valgrind? – martin

+0

valgrind memcheck detecta errores de memoria, gprof y oprofile ayudan a encontrar problemas de rendimiento. No puede usar gprof y valgrind al mismo tiempo, y no sería tan útil a menos que esté trabajando en el rendimiento de valgrind o una de sus herramientas. Si desea buscar errores de memoria y también desea encontrar problemas de rendimiento en su propio programa, ejecútelo una vez en valgrind y luego compílelo con -pg y ejecútelo bajo gprof. – mark4o

1

Por cierto, esto no es factorial informático.

Si realmente está tratando de averiguar a dónde va el tiempo, puede intentar stackshots.Puse un ciclo infinito alrededor de tu código y tomé 10 de ellos. Aquí está el código:

6: void forloop(void){ 
7: int fac=1; 
8: int count=5; 
9: int i,k; 
10: 
11: for (i = 1; i <= count; i++){ 
12:  for(k=1;k<=count;k++){ 
13:   fac = fac * i; 
14:  } 
15: } 
16: } 
17: 
18: int main(int argc, char* argv[]) 
19: { 
20: int i; 
21: for (;;){ 
22:  forloop(); 
23: } 
24: return 0; 
25: } 

Y aquí están los stackshots, volver a pedir con la más frecuente en la parte superior:

forloop() line 12 
main() line 23 

forloop() line 12 + 21 bytes 
main() line 23 

forloop() line 12 + 21 bytes 
main() line 23 

forloop() line 12 + 9 bytes 
main() line 23 

forloop() line 13 + 7 bytes 
main() line 23 

forloop() line 13 + 3 bytes 
main() line 23 

forloop() line 6 + 22 bytes 
main() line 23 

forloop() line 14 
main() line 23 

forloop() line 7 
main() line 23 

forloop() line 11 + 9 bytes 
main() line 23 

¿Qué te dice esto? Dice que la línea 12 consume aproximadamente el 40% del tiempo, y la línea 13 consume aproximadamente el 20% del tiempo. También le dice que la línea 23 consume casi el 100% del tiempo.

Eso significa que desenrollar el lazo en la línea 12 podría darle un factor de aceleración de 100/(100-40) = 100/60 = 1.67x aproximadamente. Por supuesto, hay otras maneras de acelerar este código también, como eliminar el bucle interno, si realmente está tratando de calcular factorial.

Solo lo señalé porque es una forma simple de hacer perfiles.

Cuestiones relacionadas