Acovea implementiert ein genetischer Algorithmus für die Suche nach den "besten" Optionen für die Erstellung der Programme mit dem GCC C und C ++ Compiler.
Acovea (Analyse von Compiler-Optionen über Evolutionary Algorithm) implementiert ein genetischer Algorithmus, um die "besten" Optionen für die Erstellung der Programme mit dem GNU Compiler Collection (GCC) C und C ++ Compiler zu finden.
"Best", in diesem Zusammenhang ist als jene Optionen, die die schnellsten ausführbaren Programms von einem gegebenen Quellencode zu erzeugen definiert. Acovea ist eine C ++ Framework, das erweitert werden kann, um andere Programmiersprachen und nicht-GCC-Compiler zu testen.
Ich stelle mir vor Acovea als Optimierungswerkzeug, ähnlich wie in Ziel, Profiling. Traditionelle Funktion Ebene Profilierung identifiziert die Algorithmen einflussreichsten in die Leistung eines Programms; Acovea wird dann auf diesen Algorithmen angewandt, um die Compiler-Flags und Optionen, die die schnellste Code zu generieren finden.
Acovea ist auch nützlich zum Testen Kombinationen von Flags für pessimistische Wechselwirkungen und zur Prüfung der Zuverlässigkeit des Compilers.
Moderne Software ist schwer zu verstehen, und überprüfen Sie mit traditionellen Mitteln. Millionen von Zeilen Code zu produzieren Anwendungen mit komplizierten Wechselwirkungen, trotzt einfache Beschreibung oder Brute-Force-Untersuchung.
Eine geführte, deterministischen Ansatz der Prüfung stützt sich auf die menschliche Tester, jede mögliche Kombination von Maßnahmen vorstellen - eine unrealistische Annahme gegeben Softwarekomplexität. Doch trotz dieser Komplexität müssen wir Antworten auf wichtige Fragen zu modernen, großen Software.
Was für wichtige Fragen? Betrachten Sie die GNU Compiler Collection. Ich schreibe Artikel, die Benchmark-Code-Generierung, eine Aufgabe mit Schwierigkeiten aufgrund der unzähligen Möglichkeiten von verschiedenen Compilern zur Verfügung gestellt. Für meine Benchmarks einen Sinn haben soll, muss ich wissen, welche Kombination von Optionen für eine bestimmte Anwendung die schnellste Code erzeugt.
Suche nach dem "besten" Satz von Optionen klingt wie eine einfache Aufgabe, da das Ausmaß der GCC-Dokumentation und die gängige Meinung der GCC-Entwickler-Community. Ach, wenn es nur so einfach! Die GCC-Dokumentation, während umfangreiche, ist auch ehrlich ungenau.
Ich schätze diese Art der Dokumentation; im Gegensatz zu vielen kommerziellen Anbietern, die absolute Aussagen über die "Qualität" der Produkte zu machen, GCC Dokumentation schreiben zugeben Unsicherheiten, wie die verschiedenen Optionen zu ändern Code-Generierung. Tatsächlich ist der Codegenerierung völlig abhängig von der Art der Anwendung kompiliert und der Zielplattform. Eine Option, die schnell ausführbaren Code für einen Quellencode erzeugt, kann sich nachteilig auf die Leistung eines anderen Programms sein.
"Konventionelle Weisheit" kommt in meinem Posteingang, wenn ich einen neuen Artikel zu veröffentlichen. Angefangen von der Höflichkeit der beharrlichen auf die unhöflich, diese E-Mails enthalten widersprüchliche Vorschläge zur Herstellung von schnellen Code.
In der überwiegenden Mehrzahl der Fälle, wie anekdotische Behauptungen entbehren jeder formalen Beweis für ihre Gültigkeit, und mehr als oft nicht, ist die vorgeschlagene "Verbesserung" unwirksam oder schädlich. Es wurde zunehmend klar, dass niemand --myself enthalten - genau weiß, wie alle diese GCC-Optionen zusammenarbeiten bei der Erzeugung von Programmcode.
Ich suche den Heiligen Gral der Optimierung - aber genau das, was ist Optimierung? Das Verständnis des Problems ist der erste Schritt bei der Lösung.
Optimierung versucht, das "beste" Maschinencode aus dem Quellcode zu erzeugen. "Best" bedeutet verschiedene Dinge für verschiedene Anwendungen; eine Datenbank Schaufeln Stücke von Informationen, während eine wissenschaftliche Anwendung mit schnelle und genaue Ergebnisse besorgt; die erste Sorge für ein eingebettetes System kann die Codegröße sein.
Und es ist durchaus möglich, dass kleine Code ist schnell, oder schnellen Code genau. Optimierung ist alles andere als eine exakte Wissenschaft, da die Vielfalt der Hardware- und Softwarekonfiguration.
Ein Optimierungsalgorithmus kann so einfach wie das Entfernen einer Schleifeninvariante, oder so komplex wie die Prüfung eines gesamten Programms zur globalen gemeinsamen Unterausdrücke zu beseitigen. Viele Optimierungen ändern, was der Programmierer schrieb in eine effizientere Form, zum gleichen Ergebnis führen, während Änderung zugrunde liegenden Details für Effizienz; anderen "Optimierungen" produzieren Code, der spezifischen Eigenschaften der zugrunde liegenden Hardware, wie zum Beispiel spezielle Befehlssätze verwendet.
Speicherarchitekturen, Rohrleitungen, On- und Off-Chip-Caches - beeinflussen Code Leistung in einer Weise, die nicht auf der Hand, um Programmierer mit einer Hochsprache sind. Eine Optimierung, die auch scheinen mag, schneller Code erzeugen kann, in der Tat, zu erstellen großen Code, mehr Cache-Misses verursacht, so erniedrigender Leistung.
Selbst die beste Hand abgestimmt C-Code enthält Bereichen Auslegung; es gibt keine absolute, Eins-zu-Eins-Entsprechung zwischen C-Anweisungen und Maschinenbefehle. Fast jede Folge von Quellencode in verschiedene kompiliert werden - jedoch funktionell gleichwertige - Maschinenanweisungsströme mit unterschiedlichen Größen und Leistungseigenschaften.
Inline-Funktionen ist ein klassisches Beispiel für dieses Phänomen: Ersetzen eines Aufruf einer Funktion mit dem Funktionscode selbst kann eine schnellere Programm zu produzieren, kann aber auch Programmgröße zu erhöhen. Erhöhte Programmgröße kann wiederum verhindern, dass ein Algorithmus von Montage im Inneren Hochgeschwindigkeits-Cache-Speicher und verlangsamt so ein Programm aufgrund von Cache-Misses.
Beachten Sie, meine Verwendung des Wiesel Wort "kann" - Inlining kleine Funktionen ermöglicht manchmal andere Optimierungsalgorithmen eine Chance, Code für die örtlichen Gegebenheiten zu verbessern, wodurch schneller und kleiner Code.
Optimierung ist nicht einfach oder offensichtlich und Kombinationen von Algorithmen kann zu unerwarteten Ergebnissen führen. Das bringt mich zu der Frage zurück: Für jede Anwendung, was sind die effektivste Optimierungsmöglichkeiten?
Was ist neu in dieser Version:
· Kleinere Änderungen in der non-free-Lizenz.
· Support für die neuesten Versionen von libcoyotl und libevocosm hinzugefügt.
Softwarebeschreibung:
Version: 1.0.1
Upload-Datum: 3 Jun 15
Lizenz: Frei
Popularität: 176
Kommentare nicht gefunden