2012-07-12 14 views
10

Bei der Verwendung von gprof zum Profilieren eines C++ - Programms, das ich geschrieben habe, habe ich festgestellt, dass die meiste Zeit der Ausführung in der Funktion "frame_dummy" verbracht wird. Genauer gesagt zeigt der erste Eintrag in dem flachen Profil von der Ausgabe von gprof 76,38% der Abtastzeit, die in 24611191 Aufrufen verbracht wurde, und einer Funktion mit dem Namen frame_dummy.Was bedeutet frame_dummy im Zusammenhang mit dem Profiling?

Kurz gesagt, ich versuche zu verstehen, was frame_dummy bezeichnet - wie ich keine Funktion als solche benannt habe - und was das für meine Optimierungsbemühungen bedeutet.

Obwohl es unwahrscheinlich ist, um relevant zu sein, sollte ich hinzufügen, dass dieses Programm entworfen ist, um die Poissonsche Gleichung zu lösen, die den Mehrgitteralgorithmus verwendet, und MPI einsetzt, um die Aufgabe zu parallelisieren. Obwohl MPI-Funktionsaufrufe vorhanden sind, wird die gprof-Ausgabe, die oben erwähnt wird, davon abgeleitet, nur einen einzelnen Prozess auszuführen. Ich sollte auch beachten, dass mein Programm neben MPI keine Abhängigkeiten hat und mit g ++ 4.6.1 kompiliert wurde.

+0

Es ist Teil der C-Laufzeitbibliothek. – Barmar

Antwort

7

Es gibt eine sehr gute Erklärung hier: http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html. Aber ich bin mir nicht sicher, warum dein Programm so viel Zeit in frame_dummy verbringen würde oder warum es so oft aufgerufen werden würde.

Vielleicht ist die Debug-Informationen in Ihrer Binärdatei in irgendeiner Weise beschädigt oder wird von Gprof falsch gelesen? Oder gprof könnte durch MPI bestätigt werden? Hier ist etwas zu versuchen: Führen Sie Ihr Programm in gdb und mit einem Haltepunkt auf der Funktion frame_dummy. Sehen Sie, ob es wirklich 24 Millionen Mal aufgerufen wird, und wenn ja, wie wird es aufgerufen?

Können Sie auch bestätigen, dass dies der frame_dummy in crtbegin.o ist, und nicht einige andere frame_dummy?

Hier ist the source for frame_dummy in crtbegin.c - durch mein Lesen des Codes, sollte es nur einmal aufgerufen werden.

Auch ich nehme an, dass Ihr Programm läuft und das richtige Ergebnis produziert? (Insbesondere, wenn es ein Speicher Fehler in Ihrem Programm ist, dann können Sie ein paar ziemlich seltsames Verhalten bekommen.)

+0

Danke für die Links! –

+1

Edward, wie gprof einen Funktionsnamen findet? Kann sein, dass John seiner eigenen Programmzusammenstellung nicht die Option "-pg" hinzugefügt hat; aber es wurde dem Verknüpfungsschritt hinzugefügt. 'crtbegin' mit' -pg' wurde verwendet; aber keine Anrufe an die Gprof-Instrumentierung in seinem Code. – osgx

+0

Danke für die tolle Antwort! Ich entdeckte schließlich das gleiche Phänomen, das Joel erwähnte; Kompilieren mit -O3 führt eine Art von Optimierung durch, die bewirkt, dass gprof häufig aufgerufene Funktionen als Aufrufe von frame_dummy liest. – Ben

4

ich das gleiche Problem gestoßen, hier ist meine Ausgabe von 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 

In meinem Fall wurde es aufgelöst, wenn ich mit gcc -Os statt gcc -O3 zusammengestellt:

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 

das heißt, gprof f4 für frame_dummy verwechselte.

+0

Das war genau das Problem, obwohl es schien, dass mehrere verschiedene Funktionen von frame_dummy subsumiert wurden. Es ist jedoch etwas frustrierend, da das Deaktivieren von Optimierungen die Profilstruktur dramatisch verändert, da Funktionen durch Compiler-Optimierung in unterschiedlichem Maße beeinflusst werden. – Ben

Verwandte Themen