2012-07-12 32 views
10

En el proceso de usar gprof para perfilar un programa C++ que he escrito, me he dado cuenta de que la gran mayoría del tiempo de ejecución se gasta en la función "frame_dummy". Más precisamente, la primera entrada en el perfil plano de la salida de gprof muestra el 76.38% del tiempo de muestreo gastado en y 24611191 llamadas a una función con el nombre frame_dummy.¿Qué significa frame_dummy en el contexto de creación de perfiles?

En resumen, estoy tratando de entender tanto a qué se refiere frame_dummy, ya que no tengo ninguna función nombrada como tal, como lo que esto significa para mis esfuerzos de optimización.

Aunque es poco probable que sea relevante, debo agregar que este programa está diseñado para resolver la ecuación de Poisson utilizando el algoritmo multirradio y emplea MPI para paralelizar la tarea. Sin embargo, aunque las llamadas a la función MPI están presentes, el resultado de gprof mencionado anteriormente se deriva de ejecutar solo un proceso. También debería tener en cuenta que mi programa no tiene dependencias aparte de MPI y fue compilado con g ++ 4.6.1.

+0

Es parte de la biblioteca C runtime. – Barmar

Respuesta

7

Aquí hay una muy buena explicación: http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html. Pero no estoy seguro de por qué su programa pasaría tanto tiempo en frame_dummy, o por qué sería llamado tantas veces.

¿Quizás la información de depuración en su binario está dañada de alguna manera o está siendo mal interpretada por gprof? O gprof podría ser confesionado por MPI? Aquí hay algo que probar: ejecutar su programa en gdb y con un punto de interrupción en la función frame_dummy. Vea si realmente se llama 24 millones de veces, y si lo hace, entonces de qué se llama.

Además, ¿puede confirmar que este es el frame_dummy en crtbegin.o, y no algún otro frame_dummy?

Aquí está the source for frame_dummy in crtbegin.c - al leer el código, solo debería recibir una llamada.

Además, ¿estoy asumiendo que su programa se ejecuta y produce el resultado correcto? (En particular, si hay un error de memoria en el programa, entonces se puede obtener un comportamiento bastante extraño.)

+0

¡Gracias por los enlaces! –

+1

Edward, ¿cómo gprof encuentra un nombre de función? Puede ser que John no haya agregado la opción '-pg' a su propia compilación del programa; pero lo agregué al paso de enlace. 'crtbegin' con' -pg' se usó; pero no hay llamadas a la instrumentación gprof en su código. – osgx

+0

¡Gracias por la excelente respuesta! Finalmente descubrí el mismo fenómeno que mencionó Joel; compilar con -O3 realiza algún tipo de optimización que hace que gprof lea varias funciones llamadas frecuentemente como llamadas a frame_dummy. – Ben

4

me encontré con el mismo problema, aquí está mi salida de gprof:

% cumulative self    self  total 
time seconds seconds calls ms/call ms/call name 
52.00  16.27 16.27 204000  0.08  0.08 frame_dummy 
47.46  31.12 14.85 418000  0.04  0.07 f2 
    0.51  31.28  0.16 21800  0.01  1.42 f1 
    0.03  31.29  0.01  1980  0.01 14.21 f5 

En mi caso , que se resolvió cuando se compila con gcc -Os en lugar de gcc -O3:

Each sample counts as 0.01 seconds. 
    % cumulative self    self  total 
time seconds seconds calls ms/call ms/call name 
53.12  22.24 22.24 200000  0.11  0.11 f4 
45.65  41.36 19.11 598000  0.03  0.03 f2 
    0.69  41.65  0.29 20000  0.01  1.45 f3 
    0.45  41.84  0.19 39800  0.00  0.32 f1 
    0.10  41.88  0.04        evaluate 

es decir, gprof confundieron f4 de frame_dummy.

+0

Este es exactamente el problema, aunque en realidad parecía que varias funciones diferentes estaban siendo subsumidas por frame_dummy. Sin embargo, es un poco frustrante porque desactivar las optimizaciones cambia drásticamente la estructura del perfil ya que las funciones se ven afectadas en diferentes grados por la optimización del compilador. – Ben

Cuestiones relacionadas