Re: Compileroptimierungen

From: Oliver Fromme <olli(at)lurza.secnetix.de>
Date: Wed, 30 Jan 2008 11:05:17 +0100 (CET)

Alexandre Fiveg wrote:
> Oliver Fromme wrote:
> > Alexandre Fiveg wrote:
> > > nighthawk wrote:
> > > > Wenn man GCC keine march und keine mtune Parameter mitgibt, wird dann
> > > > überhaupt irgendeine Optimierung durchgeführt? Sprich, erkennt GCC den
> > > > Prozessor auf dem es läuft und optimiert sein Kompilat explizit für
> > > > dieses Modell oder wird per default auf Portabilität zu möglichst
> > > > vielen verschiedenen CPU Modellen einer Architektur optimiert?
> > >
> > > Beim Kompilieren (Portieren) des GCC für ein bestimmtes Architektur wird
> > > extra ein Parameter eingegeben, das dies Ziel-Architektur bezeichnet.
> > > Der erzeugte GCC wird dann "per default" nur für dieses Ziel-Architektur
> > > den Code erzeugen.
> >
> > Das stimmt (in diesem Fall ist die Zielarchitektur vermut-
> > lich i386). Das war aber nicht Frage.
> >
> > Die Frage von "nighthawk" war, ob gcc für den betreffenden
> > Prozessor optimiert, auf dem er läuft. Die Antwort ist
> > nein.
>
> Auf dieser Stelle würde ich sagen (so weit wie ich weiß) , dass GCC per
> default den Code erzeugt, der natürlich auf native Architektur läuft.

Tut mir leid, aber Du verwechselst schon wieder Architektur
mit Prozessor.

Also nochmal mit anderen Worten: Per default erzeugt gcc
Code für die ARCHITEKTUR, auf der er läuft. Auf i386 wird
Code für i386 erzeugt, auf Alpha für Alpha, auf ARM für
ARM, und so weiter. Will man für eine »fremde« Architektur
compilieren, muss man das ausdrücklich angeben (man nennt
das »Cross-compiling«). Code läuft grundsätzlich nur auf
der Architektur, für die er compiliert wurde. Beispiel:

$ uname -sm
FreeBSD i386
$ file -b bin/mget-solaris
ELF 32-bit MSB executable, SPARC, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
$ bin/mget-solaris
zsh: exec format error: bin/mget-solaris

(Die genaue Fehlermeldung hängt von der Shell ab.)

Das war aber nicht die Frage von »nighthawk«. Seine Frage
zielte auf den PROZESSOR. Zum Beispiel kann gcc unter der
i386-Architektur für 80386, 80486, Pentium, Pentium-MMX,
Pentium-II, Prescott, mit/ohne SSE, 3dNow usw.usf. optimie-
ren. Das ist aber alles dieselbe Architektur (i386) und
hat nichts mit Cross-compiling zu tun. Diese Art Optimie-
rung macht der gcc NICHT per default, sondern er erzeugt
Code für den kleinsten gemeinsamen Nenner, der auf allen
Prozessoren der betreffenden Architektur läuft.

Um solche Optimierungen einzuschalten, gibt es die Optionen
-mtune und -march ("march" ist irreführend, weil es nichts
mit der Architektur zu tun hat, aber die gcc-Doku erklärt
es immerhin korrekt). Bei FreeBSD genügt es, CPUTYPE=xxx
in /etc/make.conf entsprechend zu setzen.

Der entscheidende Unterschied ist übrigens, dass bei -mtune
nur solche Optimierungen verwendet werden, die den Code
nicht unportabel machen, d.h. er läuft trotzdem noch auf
anderen Prozessoren (derselben Architektur, natürlich),
allerdings evtl. langsamer. Bei -march dagegen werden alle
Features (neue Instruktionen u.ä.) verwendet, die der be-
treffende Prozessor hat, wodurch der Code nicht mehr auf
Prozessoren lauffähig ist, die diese Features nicht haben,
auch wenn sie derselben Architektur angehören.

Gruß
   Olli

-- 
Oliver Fromme, secnetix GmbH & Co. KG, Marktplatz 29, 85567 Grafing b. M.
Handelsregister: Registergericht Muenchen, HRA 74606,  Geschäftsfuehrung:
secnetix Verwaltungsgesellsch. mbH, Handelsregister: Registergericht Mün-
chen, HRB 125758,  Geschäftsführer: Maik Bachmann, Olaf Erb, Ralf Gebhart
FreeBSD-Dienstleistungen, -Produkte und mehr:  http://www.secnetix.de/bsd
$ dd if=/dev/urandom of=test.pl count=1
$ file test.pl
test.pl: perl script text executable
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Wed 30 Jan 2008 - 11:05:20 CET

search this site