2010-03-14 8 views
7

Gibt es eine Methode, automatisch die besten Compiler-Optionen (auf einer bestimmten Maschine) zu finden, die zu der schnellstmöglichen ausführbaren Datei führen?Automatisch finden Compiler-Optionen für schnellste exe auf bestimmten Rechner?

Natürlich verwende ich g++ -O3, aber es gibt zusätzliche Flags, die den Code möglicherweise schneller laufen lassen, z. -ffast-math und andere, von denen einige Hardware-abhängig sind.

Kennt jemand Code, den ich in meine configure.ac Datei (GNU Autotools) setzen kann, so dass die Flags automatisch vom Befehl ./configure zum Makefile hinzugefügt werden?

Zusätzlich zur automatischen Bestimmung der besten Flags würde ich mich für einige nützliche Compiler-Flags interessieren, die als Standard für die meisten optimierten ausführbaren Dateien verwendet werden können.

Update: Die meisten Leute schlagen vor, einfach verschiedene Flaggen auszuprobieren und die besten empirisch auszuwählen. Für diese Methode hätte ich eine weitere Frage: Gibt es ein Dienstprogramm, das alle Compiler-Flags auflistet, die für die Maschine, auf der ich aktiv bin, möglich sind (z. B. Tests, ob SSE-Anweisungen verfügbar sind usw.)?

+5

Die "besten" Optimierungsoptionen hängen davon ab, was Ihr Code tatsächlich tut. Nur du weißt das. –

+1

Und um es zu "elf" zu machen, sollten Sie es profilieren. Es gibt nur wenige kostenlose Mittagessen in Bezug auf Compiler-Umschaltmöglichkeiten. –

+1

Ok, um es wirklich an meinen Code anzupassen, sollte ich die Optionen manuell auswählen und sie profilieren. Aber es kann nicht schaden, den entsprechenden "-march = cpu-type" auf diesem Rechner hinzuzufügen? Und es sollte bestimmte Kategorien von Programmen geben, die von bestimmten anderen (Hardware-abhängigen) Kompilierungsflags profitieren? Zum Beispiel fällt mein Programm in die Kategorie "verwendet viele Fließkommaoperationen". – Frank

Antwort

1

Gibt es eine Methode, um automatisch die besten Compiler-Optionen (auf einer bestimmten Maschine) zu finden, die zu der schnellstmöglichen ausführbaren Datei führen?

Nr

Sie Ihr Programm mit einer großen Auswahl an Compiler-Optionen kompilieren konnte, dann Benchmark jeder Version, dann wählen Sie die eine, die „schnellste“ ist, aber das ist kaum zuverlässig und wahrscheinlich nicht sinnvoll für dein Programm.

+1

Welche, BTW, ist genau das, was Acovea (von @ergosys genannt) tut: kompilieren und benchmarken Sie das Programm hunderte, sogar tausende Male (deshalb muss das Programm einfach und die Benchmarks kurz sein) mit verschiedenen Kombinationen von GCC-Optimierungsflags und "entwickeln" einen guten Satz Flaggen unter Verwendung eines genetischen Algorithmus. –

2

Einige Compiler bieten "-fast" -Option zur automatischen Auswahl der aggressivsten Optimierung für einen bestimmten Kompilierungs-Host. http://en.wikipedia.org/wiki/Intel_C%2B%2B_Compiler

Leider bietet g ++ keine ähnlichen Flags.

als Follow-up zu Ihrer nächsten Frage, für g ++ können Sie -mtune Option zusammen mit -O3 verwenden, die Ihnen recht schnelle Standardwerte geben wird. Die Herausforderung besteht dann darin, den Prozessortyp Ihres Kompilierungshosts zu finden. Vielleicht möchten Sie auf das Autoconf-Makroarchiv schauen, um zu sehen, ob jemand die notwendigen Tests geschrieben hat. andernfalls, unter der Annahme, Linux, müssen Sie /proc/cpuinfo zu verarbeiten, um Prozessor-Typ

4

Ich glaube nicht, dass Sie dies zur Zeit configure tun können, aber es gibt mindestens ein Programm, das gcc Option Flags eine bestimmte ausführbare Datei zu optimieren versucht und Maschine. Siehe zum Beispiel http://www.coyotegulch.com/products/acovea/.

Sie können dies möglicherweise mit einigen Kenntnissen Ihrer Zielmaschine (n) verwenden, um eine gute Auswahl an Optionen für Ihren Code zu finden.

+0

Dito für ATLAS (Automated Tuned Linear Algebra Software), eine Implementierung von BLAS/LAPACK. Siehe http://math-atlas.sourceforge.net/ – celion

+0

Der Link zu Acovea ist kaputt. Hier ist die Alternative: http://stderr.org/doc/acovea/html/acoveaga.html – OutputLogic

2

Nach einigem googeln fand ich dieses Skript: gcccpuopt.

Auf einer meiner Maschinen (32bit), gibt sie:

-march=pentium4 -mfpmath=sse 

auf einer anderen Maschine (64-Bit) gibt sie:

$ ./gcccpuopt 
Warning: The optimum *32 bit* architecture is reported 
-m32 -march=core2 -mfpmath=sse 

Also, es ist nicht perfekt, aber hilfreich sein.

2

Siehe auch -mcpu=native/-mtune=native gcc Optionen.

+0

Cool, ich werde das versuchen. Das ist neu in GCC 4.2, also muss ich updaten ... – Frank

0

Dies ist eine Lösung, die für mich funktioniert, aber es dauert eine Weile, um einzurichten. In "Python Scripting for Computational Science" von Hans Petter Langtangen (ein meiner Meinung nach exzellentes Buch) wird ein Beispiel gegeben, wie man mit einem kurzen Python-Skript die besten Compiler-Optionen für C/Fortran/... Programm. Dies wird in Kapitel 1.1.11 "Verschachtelte heterogene Datenstrukturen" beschrieben.

Quellcode für Beispiele aus dem Buch sind frei verfügbar unter http://folk.uio.no/hpl/scripting/index.html (Ich bin mir der Lizenz nicht sicher, so wird hier kein Code reproduziert), und insbesondere können Sie Code für einen ähnlichen numerischen Test im Code finden in TCSE3-3rd-examples.tar.gz in der Datei src/app/wavesim2D/F77/compile.py, die Sie als Basis für das Schreiben eines Skripts verwenden könnten, das für ein bestimmtes System/Sprache geeignet ist (in Ihrem Fall C++)).

-2

Die Optimierung Ihrer App ist hauptsächlich Ihre Aufgabe, nicht die des Compilers.

Here's an example of what I'm talking about.

Sobald Sie das getan haben, wenn Ihre Anwendung mit Hotspots in Ihrem Code (nicht in der Bibliothek Code) rechen gebunden ist, ist dann die Compiler-Optimierungen für die Geschwindigkeit wird einen Unterschied machen, so können Sie versuchen, verschiedene Flaggenkombinationen.