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?
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?
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?
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.
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.
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?
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.
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.
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?
RTFM: http://gcc.gnu.org/onlinedocs/gcc-3.4.4/gcc/Optimize-Options.html#Optimize-Options
vBulletin®, Copyright ©2000-2025, Jelsoft Enterprises Ltd.