Kann mich auch jemand auf ein gutes Tutorial zu diesem Thema verweisen? Ich kann keine finden.
c++
optimization
g++
Nakiya
quelle
quelle
Antworten:
-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.
quelle
-fprofile-correction
den zweiten Aufruf von GCC bestehen.gcc hello_world.c -o demo_fdo -fprofile-use -freorder-blocks-and-partition -O3 -fprofile-correction -Wcoverage-mismatch
immer noch den Coverage-Mismatch-Fehler an. Was mache ich falsch?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-use
Parameter erneut und er kompiliert ihn mithilfe der profilgesteuerten Güte.quelle
-fprofile-correction
den zweiten Aufruf von g ++ übergeben.gcc hello_world.c -o demo_fdo -fprofile-use -freorder-blocks-and-partition -O3 -fprofile-correction -Wcoverage-mismatch
immer noch den Coverage-Mismatch-Fehler an. Was mache ich falsch?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.
quelle
info gcc
und suchen Sie nach Profilverwendung. Es heißt: "Die folgenden Optionen sind aktiviert: -fbranch-probabilities ',' -fvpt ',' -funroll-loops ',' -fpeel-loops ',' -ftracer '"