Wie verwende ich profilgesteuerte Optimierungen in g ++?

75

Kann mich auch jemand auf ein gutes Tutorial zu diesem Thema verweisen? Ich kann keine finden.

Nakiya
quelle
ein gutes Tutorial zum Thema was? Ein g ++ - Schalter, für den Sie nicht wissen, wofür Sie ihn verwenden sollen?
Jalf
12
Warum wird dies abgelehnt und für den Abschluss gestimmt? Es ist eine absolut gültige Frage.
Nico
8
@ Jalf es ist eine vollkommen gültige Frage, wie man profilgesteuerte Optimierungen verwendet
Laurynas Biveinis
1
@nakiya: Wenn Sie wissen möchten, wie man eine profilgesteuerte Optimierung in G ++ durchführt, fragen Sie danach. Wenn Sie so fragen, muss ich mich fragen, ob es die spezifischen Schalter sind, an denen Sie interessiert sind, oder das allgemeine Ziel, "die profilgesteuerte Optimierung zu verwenden, um meine Anwendung zu beschleunigen".
Jalf
1
@jalf: "Profilgesteuerte Optimierung:" Dies ist das erste Mal, dass ich diesen Satz überhaupt höre. Ich habe die Frage jetzt zweimal bearbeitet. Ich werde es noch einmal bearbeiten, in der Hoffnung, eine Antwort zu bekommen :(
nakiya

Antworten:

57

-fprofile-generate instrumentiert die Anwendung mit Profilcode. Die Anwendung protokolliert während der tatsächlichen Ausführung bestimmte Ereignisse, die die Leistung verbessern könnten, wenn dieses Verwendungsmuster zur Kompilierungszeit bekannt wäre. Zweige, Inlining-Möglichkeiten usw. können alle protokolliert werden, aber ich bin mir nicht sicher, wie GCC dies im Detail implementiert.

Nach dem Beenden des Programms werden alle diese Daten in * .gcda-Dateien gespeichert, bei denen es sich im Wesentlichen um Protokolldaten für einen Testlauf handelt. Nach dem erneuten Erstellen der Anwendung mit dem Flag -fprofile-use berücksichtigt GCC bei den Optimierungen die Protokolldaten * .gcda, wodurch die Leistung in der Regel erheblich gesteigert wird. Dies hängt natürlich von vielen Faktoren ab.

Maister
quelle
5
Übrigens, wenn Ihr Programm über mehrere Threads verfügt, sind die generierten Profildaten wahrscheinlich inkonsistent und Sie erhalten wahrscheinlich Fehler, wenn Sie versuchen, es zu verwenden. Sie müssen also wahrscheinlich auch -fprofile-correctionden zweiten Aufruf von GCC bestehen.
Nicu Stiurca
Ich kann den Fehler nicht loswerden. Der Befehl, den ich verwende, zeigt gcc hello_world.c -o demo_fdo -fprofile-use -freorder-blocks-and-partition -O3 -fprofile-correction -Wcoverage-mismatchimmer noch den Coverage-Mismatch-Fehler an. Was mache ich falsch?
gbriones.gdl
23

Aus diesem Beispiel :

g++ -O3 -fprofile-generate [more params here, like -march=native ...] -o executable_name
// run my program's benchmarks, or something to stress its most common path
g++ -O3 -fprofile-use [more params here, like -march=native...] -o executable_name

Grundsätzlich kompilieren und verknüpfen Sie zunächst dieses zusätzliche Flag zum Kompilieren und Verknüpfen: -fprofile-generate(von hier aus ).

Wenn Sie es dann ausführen, werden standardmäßig .gcda-Dateien "neben" Ihren .o-Dateien erstellt (fest codiert auf den vollständigen Pfad, in dem sie erstellt wurden).

Sie können optional ändern, wo diese .gcda-Dateien mit der Einstellung -fprofile-dir = XXX erstellt werden .

Anschließend kompilieren und verknüpfen Sie den -fprofile-useParameter erneut und er kompiliert ihn mithilfe der profilgesteuerten Güte.

Rogerdpack
quelle
3
Übrigens, wenn Ihr Programm über mehrere Threads verfügt, sind die generierten Profildaten wahrscheinlich inkonsistent und Sie erhalten wahrscheinlich Fehler, wenn Sie versuchen, es zu verwenden. Sie müssen also wahrscheinlich auch -fprofile-correctionden zweiten Aufruf von g ++ übergeben.
Nicu Stiurca
1
Ich kann den Fehler nicht loswerden. Der Befehl, den ich verwende, zeigt gcc hello_world.c -o demo_fdo -fprofile-use -freorder-blocks-and-partition -O3 -fprofile-correction -Wcoverage-mismatchimmer noch den Coverage-Mismatch-Fehler an. Was mache ich falsch?
gbriones.gdl
3

Das Knifflige ist das Einrichten der Makefiles.

Sie benötigen definitiv separate Ausgabeverzeichnisse für Objektdateien. Ich würde empfehlen, sie "Profil" und "Release" zu nennen. Möglicherweise müssen Sie die * .gcda-Dateien, die sich aus der Profilausführung ergeben, kopieren, damit GCC sie im Release-Erstellungsschritt findet.

Das Ergebnis wird mit ziemlicher Sicherheit schneller sein. Es wird wahrscheinlich auch größer sein. Die Option -fprofile-use aktiviert viele andere Optimierungsschritte, die ansonsten nur von -O3 aktiviert werden.

Zan Lynx
quelle
Können Sie kommentieren, welche Optimierungsschritte das sind? Oder ein Dokument zitieren?
JohnTortugo
2
@ JohnTortugo: info gccund suchen Sie nach Profilverwendung. Es heißt: "Die folgenden Optionen sind aktiviert: -fbranch-probabilities ',' -fvpt ',' -funroll-loops ',' -fpeel-loops ',' -ftracer '"
Zan Lynx