Doppelte Zusammenstellung von C-Code zur Verkürzung der Ausführungszeiten

7

Laut diesem Artikel / Video:

  

GCC erkennt mehrere architekturabhängige Optimierungen für   Erhöhung der Geschwindigkeit von ausführbaren C-Dateien. Eine ausführbare Datei übergeben   GCC ein zweites Mal kann oft eine dramatische Leistung bieten   Verbesserung.

Wenn Sie das Video auf dem Link angesehen haben, können Sie sehen, dass diese Methode die Geschwindigkeit einer ausführbaren Datei verdoppelt. Ich bin mir nicht sicher, ob das allgemein ist.

Meine Frage ist: Warum passiert das?

Bonus: Was passiert, wenn wir ein kompiliertes Programm genau kompilieren?

    
AK_ 25.07.2014, 22:03
quelle

1 Antwort

46

Das ist ein Scherz.

Weder gcc noch irgendein anderer Compiler kann Objektcode lesen, "kompilieren" und Objektcode erzeugen, der schneller ist.

Die nächste Sache ist die feedbackgesteuerte Kompilierung, bei der Sie zuerst ein Programm mit Instrumentierung kompilieren (zB gcc --fprofile-generate ), dieses Programm ausführen, eine Datendatei über den Lauf generieren (zB foo.gcda ) und dann das Programm kompilieren wieder denselben Quellcode und die Datendatei als Eingabe für den Compiler verwenden (zB gcc --fprofile-use ). Dies kann zu ziemlich bescheidenen Beschleunigungen führen, in der Regel zwischen 5% und 10%.

Angenommen, Sie haben eine lange Kette von 50 if … else if -Konstrukten (die nicht als switch restrukturiert werden können). Dies geschieht beispielsweise häufig in Monte-Carlo-Simulationen. Wenn Sie ein einigermaßen erfahrener Programmierer sind, werden Sie diese wahrscheinlich so bestellen, dass der am häufigsten verwendete Zweig zuerst angezeigt wird. Die Idee ist, dass Sie zur Laufzeit keine Zeit verschwenden, wenn Sie 30 weniger wahrscheinliche Verzweigungen betrachten, bevor Sie die wahrscheinlichsten betrachten. Darüber hinaus werden Sie versuchen, diese Verzweigungen höchstwahrscheinlich zu den wahrscheinlichsten zu ordnen, so dass im Durchschnitt die geringste Anzahl von Verzweigungstests ausgeführt wird, bevor die richtige gefunden wird.

Beachten Sie, dass der Compiler keine Grundlage für die Bestellung dieser Verzweigungen hat, da die Informationen, die wahrscheinlicher sind als andere, nicht im Quellcode enthalten sind. Daher ist es am besten, die Zweige in Quellreihenfolge auszugeben / p>

Bei der klassischen rückgekoppelten Kompilierung erstellen Sie zunächst eine instrumentierte Version der ausführbaren Datei, die (wenn Sie sie ausführen) aufzeichnet, wie oft jede Verzweigung in eine Datendatei übernommen wird (oder nicht). Beim zweiten Kompilieren hat der Compiler empirische Daten von runtime (die er normalerweise nicht hat), die verwendet werden können, um Tests neu anzuordnen und Verzweigungshinweise einzufügen, die den Code schneller laufen lassen ... zumindest mit Workloads ähnlich dem profilierten Testprogramm.

Ich bin mir sicher, dass moderne feedbackgesteuerte Kompilationen wesentlich ausgeklügelter sind, aber das ist die allgemeine Idee.

    
Emmet 25.07.2014, 23:14
quelle

Tags und Links