Frage

Kennt jemand diese Compiler-Funktion?Es scheint, dass GCC dies unterstützt.Wie funktioniert es?Was ist der potenzielle Gewinn?In welchem ​​Fall ist es gut?Innere Schleifen?

(Diese Frage ist spezifisch und betrifft nicht die Optimierung im Allgemeinen, danke)

War es hilfreich?

Lösung

Es funktioniert, indem zusätzlicher Code eingefügt wird, um zu zählen, wie oft jeder Codepfad verwendet wird.Wenn Sie ein zweites Mal kompilieren, nutzt der Compiler die gewonnenen Erkenntnisse über die Ausführung Ihres Programms, die er vorher nur vermuten konnte.Es gibt ein paar Dinge, auf die PGO hinwirken kann:

  • Entscheiden Sie, welche Funktionen inline sein sollen oder nicht, abhängig davon, wie oft sie aufgerufen werden.
  • Entscheiden Sie, wie Hinweise darauf platziert werden sollen, auf welchem ​​Zweig einer „Wenn“-Anweisung die Vorhersage erfolgen soll, basierend auf dem Prozentsatz der Anrufe, die in die eine oder andere Richtung gehen.
  • Entscheiden Sie, wie Schleifen optimiert werden sollen, basierend darauf, wie viele Iterationen bei jedem Schleifenaufruf durchgeführt werden.

Man weiß nie wirklich, wie viel diese Dinge helfen können, bis man es ausprobiert.

Andere Tipps

PGO erhöht die Geschwindigkeit beim Kompilieren von x264, dem Projekt, an dem ich arbeite, um etwa 5 % und wir haben ein eingebautes System dafür (make fprofiled).In manchen Fällen ist das eine schöne, kostenlose Geschwindigkeitssteigerung und hilft wahrscheinlich mehr bei Anwendungen, die im Gegensatz zu x264 weniger aus handschriftlicher Assemblierung bestehen.

Jasons Rat ist richtig.Die besten Beschleunigungen erhalten Sie, wenn Sie „entdecken“, dass Sie ein O(n2)-Algorithmus irgendwo in eine innere Schleife gerät oder dass Sie bestimmte Berechnungen außerhalb teurer Funktionen zwischenspeichern können.

Im Vergleich zu den Mikrooptimierungen, die PGO auslösen kann, sind dies die großen Gewinner.Sobald Sie diesen Optimierungsgrad erreicht haben, kann Ihnen PGO möglicherweise weiterhelfen.Allerdings hatten wir nie viel Glück damit – die Kosten für die Instrumentierung waren so hoch, dass unsere Anwendung unbrauchbar langsam wurde (um mehrere Größenordnungen).

Ich verwende Intel VTune vor allem deshalb gerne als Profiler, weil es im Vergleich zur Instrumentierung von Profilern, die das Verhalten zu sehr ändern, nicht invasiv ist.

Das Schöne an der Optimierung ist, dass Geschwindigkeitsgewinne an den unwahrscheinlichsten Stellen erzielt werden.

Dies ist auch der Grund, warum Sie einen Profiler benötigen, anstatt zu raten, wo die Geschwindigkeitsprobleme liegen.

Ich empfehle, mit einem Profiler zu beginnen (gperf (wenn Sie GCC verwenden) und fangen Sie einfach an, sich die Ergebnisse der Ausführung Ihrer Anwendung durch einige normale Vorgänge anzusehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top