PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : gcc optimierungen


MadMan2k
2005-10-14, 13:42:16
wie groß ist eigentlich der Performanceunterschied zwischen -mtune und -march?
Und was macht -mtune eigentlich genau?

Gast
2005-10-14, 14:06:26
schau mal bei gcc.gnu.org/manual

Harrold
2005-10-14, 15:50:42
was -mtune macht, weiss ich nicht. Bei -march wird der Code nur auf die von dir angegebene CPU Architektur kompiliert. Das Programm läuft dann nicht auf anderen CPU's

MadMan2k
2005-10-14, 16:48:12
mtune soll laut manual den code entsprechend sortieren - aber was bringt das und vor allem wie schlägt sich das im Vergleich zu march?

Coda
2005-10-14, 19:53:50
Naja -mtune bringt weniger weil es generische Binaries erzeugt, es wird also kein SSE/SSE2 oder sonstiges verwendet.

GloomY
2005-10-15, 14:52:40
"-march" erzeugt Code, welcher (wahrscheinlich) nur auf genau dieser Plattform laufen wird. "-mtune" erzeugt Code, welcher für die Plattform nur so weit optimiert ist, dass er auch auf anderen Plattformen noch läuft.

Bsp.: "-march=athlonxp" optimiert auf einem Athlon-XP. Der Code läuft damit (wahrscheinlich) auf keinem Intel Rechner, weil 3DNow!-Befehle eingesetzt werden könnten. Läuft er doch, dann ist es reiner Zufall. ;)

"-mtune=athlon-xp" optimiert auf den Athlon-XP, aber nur soweit, dass es auch auf jedem beliebigen i686 läuft, d.h. vom Pentium Pro aufwärts. In dem Fall werden weder MMX, SSE noch 3DNow!-Befehle verwendet, sehr wohl aber z.B. CMOV und CPUID.

"-march" optimiert, opfert aber Kompatibilität. "-mtune" optimiert auch, aber nur so weit, wie es innerhalb seiner "Klasse" kompatibel bleibt.
Naja -mtune bringt weniger weil es generische Binaries erzeugt, es wird also kein SSE/SSE2 oder sonstiges verwendet.Hmm. Wenn ich "mtune=k8" eingebe, dann wird da doch schon SSE/SSE2 verwendet, oder? Alle k8-basierten CPUs unterstützen das ja.
Es wird doch der kleinste gemeinsame Nenner benutzt, oder liege ich da falsch?

Coda
2005-10-15, 17:41:06
Da liegst du falsch. -mtune=k8 benützt kein SSE/SSE2 (Außer auf x86-64 Linux natürlich)

-mtune=cpu-type
Tune to cpu-type everything applicable about the generated code,
except for the ABI and the set of available instructions. The
choices for cpu-type are

zeckensack
2005-10-16, 01:13:09
Genau.
-mtune nutzt nur Kenntnisse über architektonische Eigenheiten (Scheduling, Anzahl der Ausführungseinheiten, Instruktionslatenzen) der Ziel-CPU, aber eben nicht den Befehlsumfang. Für letzteres ist ganz klar -march (bzw heißt die Option neuerdings -mcpu) zuständig.

ZB wenn ein Integer mit der Konstante 5 multipliziert werden soll, gibt es mindestens vier verschiedene Instruktionssequenzen die in Frage kommen.

(Quellregister:=EBX, Zielregister:=EAX)
1)LEA EAX,[EBX+4*EBX]

2)IMUL EAX,EBX,5

3)MOV EAX,EBX
SHL EAX,2
ADD EAX,EBX

4)MOV EAX,EBX
ADD EAX,EAX
ADD EAX,EAX
ADD EAX,EBX

#1 ist optimal für K7 und K8, da diese Instruktion auf einer der drei AGUs ausgeführt werden kann, und die "richtigen" ALUs frei bleiben. #3 und #4 sind eher schlecht, weil damit nur der Scheduler verstopft wird. Geringe Code-Dichte, zuviele "dependency chains".

Für den K6 sollte man dagegen #2 nehmen. 3 Takte Latenz für die Integermultiplikation sind durch den anderen Schranz kaum zu schlagen.

Der werte Herr Northwood wiederum hätte am liebsten #4, denn ihm fehlen vollwertige dedizierte AGUs, und Bitshifts, ob nun explizit angefordert, oder ausgeführt um eine AGU zu emulieren, sind auch langsam. Multiplikation ebenfalls.

Und genau diese Tweaks werden über -mtune gesteuert.

Coda
2005-10-16, 01:29:01
Der werte Herr Northwood wiederum hätte am liebsten #4, denn ihm fehlen vollwertige dedizierte AGUs, und Bitshifts, ob nun explizit angefordert, oder ausgeführt um eine AGU zu emulieren, sind auch langsam. Multiplikation ebenfalls.Die Integer-Multiplikation wird ja auch von der FP-Mul-Einheit übernommen X-D

Der Pentium 4 ist schon ein krankes Konstrukt.

aths
2005-10-16, 01:55:04
was -mtune macht, weiss ich nicht. Bei -march wird der Code nur auf die von dir angegebene CPU Architektur kompiliert. Das Programm läuft dann nicht auf anderen CPU'sCPUs – ohne Apostroph, bitte.



Genau.
-mtune nutzt nur Kenntnisse über architektonische Eigenheiten (Scheduling, Anzahl der Ausführungseinheiten, Instruktionslatenzen) der Ziel-CPU, aber eben nicht den Befehlsumfang. Für letzteres ist ganz klar -march (bzw heißt die Option neuerdings -mcpu) zuständig.

ZB wenn ein Integer mit der Konstante 5 multipliziert werden soll, gibt es mindestens vier verschiedene Instruktionssequenzen die in Frage kommen.

(Quellregister:=EBX, Zielregister:=EAX)
1)LEA EAX,[EBX+4*EBX]

2)IMUL EAX,EBX,5

3)MOV EAX,EBX
SHL EAX,2

ADD EAX,EBX

4)MOV EAX,EBX
ADD EAX,EAX
ADD EAX,EAX
ADD EAX,EBX

[...]

Der werte Herr Northwood wiederum hätte am liebsten #4, denn ihm fehlen vollwertige dedizierte AGUs, und Bitshifts, ob nun explizit angefordert, oder ausgeführt um eine AGU zu emulieren, sind auch langsam. Multiplikation ebenfalls.Was ist eine AGU?

Coda
2005-10-16, 02:36:44
Address Generation Unit wenn mich nicht alles täuscht.

Bei x86 kann man mit einer addresse + offset * multiplikator aus dem Speicher laden und zwar *2 *4 und *8. Also kann man per LEA (Load Effective Address) diese AGU als Multiplikationseinheit für *2, *3, *4, *5, *8 und *9 missbrauchen.

Also z.B. LEA EBX, [EAX+EAX*4] speichert EAX*5 in EBX. Und da der Athlon das in den AGUs macht belastet es die ALUs nicht.

aths
2005-10-16, 07:32:11
Wenn der P4 sowieso nur 2 (oder waren es 2,5 oder 3?) Mikroinstruktionen pro Takt hereinlässt, könnte die ALU wahrscheinlich sowieso nicht ausgelastet werden, demnach kann man sie dann auch gleich Adressrechnung übernehmen lassen.

Coda
2005-10-16, 16:12:07
Ich denke die ALU muss beim P4 erstmal die Addresse rechnen und danach dann die Operation.

bluey
2005-10-19, 23:17:02
Worin genau liegt eigentlich der Unterschied zwischen -O2 und Os? Weiß nur das Os mehr auf die Binary größe optimiert. Aber worauf wird dabei verzichtet?

Trap
2005-10-20, 08:06:22
RTFM: http://gcc.gnu.org/onlinedocs/gcc-3.4.4/gcc/Optimize-Options.html#Optimize-Options