optimiert gcc automatisch?
-
Hi zusammen,
ich muss z.Z. ein Programm schreiben, welches von einer Industrie-Kamera Bilder holt und diese weiterverarbeitet (Features Berechnung und optischer Fluss).
Ich programmiere unter Kubuntu in Eclipse. Habe dort ein makefile-project erstellt und erfolgreich eine erstes Programm compiliert. Der gesamte Algorithmus (Bilder laden, Feature-Berechnung,optischer Fluss-Berechnung) läuft in ca 0.1 Sekunden ab. Als BV-Bibliothek nutze ich die Intel OpenCV-lib.
Es stellt sich nun die Frage, ob der Compiler schon automatisch optmiert (CPU ist ein Intel DualCore) und MMX, SSE o.ä. schon nutzt, oder ob ich das "per Hand" noch weiter optimieren kann. (ich denke, die OpenCV-lib ist bereits für Intel-CPUs optmiert!?).
Die Kamera kann bis zu 40 Hz Bilder bei einer Auflösung von 1024*768 aufnehmen. Wäre natürlich super, wenn der PC das nicht auf "nur" 10 Hz senken würde. 20Hz würden mich schon zufrieden stellen, sofern das überhaupt drin ist :p
kurz gefragt: Wie optmiere ich mein Programm für MMX,SSE, sofern es der GCC noch nicht tut?
-
Nein, wenn Du gcc ohne Optionen aufrufst, nicht. Versuch zB mal ein
-O3
oä.Üblicherweise verwendet man einfach die Umgebungsvariable CFLAGS, da schreibt man rein, welche Compileroptionen man standardmäßig für C-Programme verwenden möchte und in die CXXFLAGS kommen die C++-Compileroptionen rein. Wenn die nicht gesetzt sind, kannst Du irgendwelche Standardoptionen verwenden.
-
Schau ins Handbuch
http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Optimize-Options.html#Optimize-Options
http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Linux/Unix in das Forum Compiler- und IDE-Forum verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
ich habe mal ins Makefile folgendes eingetragen:
#------------------------------------------- CPPFLAGS_1 = -mtune=i686 \ -O3
leider gibts es eine Fehlermeldung "error: bad value (core2) for -mtune= switch"
habe die GNU make Version 3.81.
Mit "-mtune=i686" läuft es. Kennt er den CoreDuo nicht?
-
Welche Compiler Version nutzt du denn? IIRC kam die 'core2' Option erst mit dem 4.2er oder 4.3er hinzu. Ausserdem solltest du nochmal genau nachschauen, welcher Prozessor denn wirklich zum Einsatz kommt. Die Core 2 Derivate, genauer Core 2 Duo, waren die ersten Prozessoren mit Core Architektur (Merom Basis). Der Core Duo (Yonah Basis) gehört aber nicht dazu. Ist also kein Core 2 Derivat bzw basiert nicht auf der Core Architektur. So seltsam und verwirrend das auch klingen mag. Der Core Duo ist im Grunde nicht viel mehr als zwei Pentium-M Kerne, die an einen gemeinsamen L2 Cache angebunden sind. Dh, 'pentium-m' wäre in dem Fall die passende Option.
Damit SSE genutzt wird, musst du noch den Schalter '-mfpmath=' angeben. Und die SSE Version dann über '-msse...'. Mittels '-march=' kannst du dies auch dem Compiler überlassen.
Noch ein Hinweis, SSE kann durchaus langsamer sein als Legacy Code, wie zB x87. Vor allem dann, wenn kaum vektorisierte und hauptsächlich skalare Instruktionen erzeugt werden können.
-
groovemaster schrieb:
Welche Compiler Version nutzt du denn? IIRC kam die 'core2' Option erst mit dem 4.2er oder 4.3er hinzu. Ausserdem solltest du nochmal genau nachschauen, welcher Prozessor denn wirklich zum Einsatz kommt. Die Core 2 Derivate, genauer Core 2 Duo, waren die ersten Prozessoren mit Core Architektur (Merom Basis). Der Core Duo (Yonah Basis) gehört aber nicht dazu. Ist also kein Core 2 Derivat bzw basiert nicht auf der Core Architektur. So seltsam und verwirrend das auch klingen mag. Der Core Duo ist im Grunde nicht viel mehr als zwei Pentium-M Kerne, die an einen gemeinsamen L2 Cache angebunden sind. Dh, 'pentium-m' wäre in dem Fall die passende Option.
Damit SSE genutzt wird, musst du noch den Schalter '-mfpmath=' angeben. Und die SSE Version dann über '-msse...'. Mittels '-march=' kannst du dies auch dem Compiler überlassen.
Noch ein Hinweis, SSE kann durchaus langsamer sein als Legacy Code, wie zB x87. Vor allem dann, wenn kaum vektorisierte und hauptsächlich skalare Instruktionen erzeugt werden können.Die GCC Version ist 4.2.4. Und der Prozessor ist ein Core2 Duo E6750. Das sollte ja ein "vollwertiger" core2 sein, oder? Ich werde es mal mit den Schaltern versuchen.
-
Yep, der E6750 ist ein Core 2 Prozessor.
-
Hallo,
man könnte noch, um sicher zu sein, in der Datei /proc/cpuinfo nachschauen, dort gibt es eine "flags" Zeile. Ich habe mal so zufällig erfahren, dass meine Centrino Duo CPU für GCC nicht -march=pentium-m sondern richtiger -march=prescott sein soll. Ich nehme an, so soll es auch für die E6750 CPU sein, es sei denn, sie ist 64 Bit...
-
prescott ist das richtige Flag für den Core2, allerdings könntest du auch gcc 4.3 nutzen, denn dort kannst du einfach "native" angeben und gcc sucht für dich das/die passende(n) Flag(s) heraus.
-
Leute, bitte nicht alles durcheinander werfen. Für den Core2 ist das richtige Flag _core2_. Das hatten wir doch mittlerweile geklärt. Prescott hat damit nichts zu tun und gehört zur Netburst Familie, also Pentium 4.
@abc.w
Wenn du einen Pentium 4 Mobile hast, wäre _prescott_ durchaus korrekt. Ich vermute aber mal, weil du von Centrino sprachst, du hast eher einen Core Duo. Dafür kennt der GCC kein entsprechendes Flag. _pentium-m_ wäre immer noch am passendsten. Das Problem ist nur, beim Core wurde im Gegensatz zum Pentium-M noch SSE3 hinzugefügt. Rein von der ISA ist er mit dem Prescott also ziemlich identisch. Nur sind es völlig verschiedene Mikroarchitekturen. Und entsprechend unterschiedlich wird auch optimiert. Deshalb ist _prescott_ an der Stelle suboptimal.
-
suboptimal, oh nein, habe bereits die gesamte Gentoo Installation mit prescott Einstellung gemacht. Ist eigentlich kein Problem, man könnte alles neu rekompilieren lassen, dauert halt ein wenig...
SSE3 war übrigens der Grund, warum ich von pentium-m auf prescott geändert hab. Dachte, wenn die CPU diesen Befehlssatz unterstützt, wäre es naheliegend, die passendste Einstellung aus dem GCC manual rauszusuchen. Hab gar nicht an die Mikroarchitekturen gedacht.
-
Wenn ich sage, dass es suboptimal ist, dann ist es auch suboptimal. Es geht schliesslich nicht um Machbarkeitsstudien.