compiler optimierung sinnvoll? [gelöst]
-
Hab ein kleines Problemchen... hab in c++ die vectormultiplikation gemacht
Normale methode (mit überladenem operator* [und = aber es geht um ])
vector1=vector2*vector3*vector4 usw....
enstehen ja temporäre zwischenergebnisse da er immer
x3x4 -> tmp1
y3y4 -> tmp2
(so ungefähr halt)
so hier die theroie: ich will mittels einsatz von templates auf diese form kommen:
x1=x2*x3*x4... bzw x1=x2; x1=x3; x1*=x4 ...
y1=y2*y3*y4...
z1=z2*z3*z4...
gut das ordnen hätt ich dann auch geschafft... nun zu meinem Problem und dem Grund warum das hier im asm forum stehtBei der Compileroption Beste Optimierung (mingw32) bekomme ich diese ergebniss:
0x401610: 55 push ebp 0x401611: 89E5 mov ebp,esp 0x401613: 83EC68 sub esp,0x68 0x401616: D90548404400 fld dword ptr [0x444048] 0x40161C: D9054C404400 fld dword ptr [0x44404c] 0x401622: D9C9 fxch st(0),st(1) 0x401624: D80D54404400 fmul dword ptr [0x444054] 0x40162A: D9C9 fxch st(0),st(1) 0x40162C: D80D58404400 fmul dword ptr [0x444058] 0x401632: D90544404400 fld dword ptr [0x444044] 0x401638: D80D50404400 fmul dword ptr [0x444050] 0x40163E: D9CA fxch st(0),st(2) 0x401640: D80D3C404400 fmul dword ptr [0x44403c] 0x401646: D9C9 fxch st(0),st(1) 0x401648: D80D40404400 fmul dword ptr [0x444040] 0x40164E: D9CA fxch st(0),st(2) 0x401650: D80D38404400 fmul dword ptr [0x444038] 0x401656: D9C9 fxch st(0),st(1) 0x401658: D80D30404400 fmul dword ptr [0x444030] 0x40165E: D9CA fxch st(0),st(2) 0x401660: D80D34404400 fmul dword ptr [0x444034] 0x401666: D9C9 fxch st(0),st(1) 0x401668: D80D2C404400 fmul dword ptr [0x44402c] 0x40166E: D9CA fxch st(0),st(2) 0x401670: D80D24404400 fmul dword ptr [0x444024] 0x401676: D9C9 fxch st(0),st(1) 0x401678: D80D28404400 fmul dword ptr [0x444028] 0x40167E: D9CA fxch st(0),st(2) 0x401680: D80D20404400 fmul dword ptr [0x444020] 0x401686: D9C9 fxch st(0),st(1) 0x401688: D80D18404400 fmul dword ptr [0x444018] 0x40168E: D9CA fxch st(0),st(2) 0x401690: D80D1C404400 fmul dword ptr [0x44401c] 0x401696: D9C9 fxch st(0),st(1) 0x401698: D80D14404400 fmul dword ptr [0x444014] 0x40169E: D9CA fxch st(0),st(2) 0x4016A0: C9 leave 0x4016A1: DEC9 fmulp st(1),st(0) 0x4016A3: DEE9 fsubp st(1),st(0) 0x4016A5: C3 ret
bei option optimierung bekomm ich aber folgendes:
0x401332: 55 push ebp 0x401333: 89E5 mov ebp,esp 0x401335: 83EC68 sub esp,0x68 0x401338: D90510504400 fld dword ptr [0x445010] 0x40133E: D80D1C504400 fmul dword ptr [0x44501c] 0x401344: D80D28504400 fmul dword ptr [0x445028] 0x40134A: D80D34504400 fmul dword ptr [0x445034] 0x401350: D80D40504400 fmul dword ptr [0x445040] 0x401356: D80D4C504400 fmul dword ptr [0x44504c] 0x40135C: D90514504400 fld dword ptr [0x445014] 0x401362: D80D20504400 fmul dword ptr [0x445020] 0x401368: D80D2C504400 fmul dword ptr [0x44502c] 0x40136E: D80D38504400 fmul dword ptr [0x445038] 0x401374: D80D44504400 fmul dword ptr [0x445044] 0x40137A: D80D50504400 fmul dword ptr [0x445050] 0x401380: D90518504400 fld dword ptr [0x445018] 0x401386: D80D24504400 fmul dword ptr [0x445024] 0x40138C: D80D30504400 fmul dword ptr [0x445030] 0x401392: D80D3C504400 fmul dword ptr [0x44503c] 0x401398: D80D48504400 fmul dword ptr [0x445048] 0x40139E: D80D54504400 fmul dword ptr [0x445054] 0x4013A4: D955F0 fst dword ptr [ebp-0x10] ; VAR:0x10 0x4013A7: DEC9 fmulp st(1),st(0) 0x4013A9: DEE9 fsubp st(1),st(0) 0x4013AB: C9 leave 0x4013AC: C3 ret
Nun frag ich mich: sollte nicht nr2 besser sein? da macht er genau das, was ich eigentlich bewirken wollte...
oder ist doch variante 1 schneller und ich blick nur nicht so recht durch? Dann ist nämlich die optimierung ziemlich umsonst gewesen... denn ungefähr den selben code bekomm ich wenn ich nicht optimier!Ich hoffe ihr könnt mir das erklären und entschuldige mich für den code-post...
mfg Manuelh87
-
Für welche Target-CPU hast du denn optimiert? Auf Pentium - Pentium 3 ist die erste Variante sicher schneller, auf P4 ist es fraglich - da ist alles langsam.
-
die erste variante dürfte auch auf dem p4 schneller sein, fmul hat dort ja eine latenz von 8/7 +2 zyklen, aber ein throughput on nur zwei zyklen. das ständige fxch (latenz=0, throuput=1) sorgt also für eine bessere auslastung.
andererseits macht man derartige sequenzen am besten mit sse...
-
Erstmal danke für eure Antworten!
also optimiert hab ich für keine bestimmte Prozessortype.. also das feld steht bei mir leer, aber ich schätz mal es wird pentium oder pentium pro sein...Hab mir ja schon fast gedacht das der kompiler das auf jedenfall besser optimieren kann, ich dachte nur dass die 2. form das ziel ist. Hab da vor langer zeit mal einen artikel über eben diese optimierung gelesen, allerdings war dort der compiler der von msvc++.
Naja, also die sache ist relativ eindeutig.. diese optimierung kann ich mir im prinzip sparen.
Hier die (von mir nicht optimierte) variante die der kompiler auf beste optimierung selbstständig macht.. (ist eh genau die 1.?!)
;****************************************************************************** 0x401290: 55 push ebp 0x401291: 89E5 mov ebp,esp 0x401293: 83EC58 sub esp,0x58 0x401296: D90548404400 fld dword ptr [0x444048] 0x40129C: D9054C404400 fld dword ptr [0x44404c] 0x4012A2: D9C9 fxch st(0),st(1) 0x4012A4: D80D54404400 fmul dword ptr [0x444054] 0x4012AA: D9C9 fxch st(0),st(1) 0x4012AC: D80D58404400 fmul dword ptr [0x444058] 0x4012B2: D90544404400 fld dword ptr [0x444044] 0x4012B8: D80D50404400 fmul dword ptr [0x444050] 0x4012BE: D9CA fxch st(0),st(2) 0x4012C0: D80D3C404400 fmul dword ptr [0x44403c] 0x4012C6: D9C9 fxch st(0),st(1) 0x4012C8: D80D40404400 fmul dword ptr [0x444040] 0x4012CE: D9CA fxch st(0),st(2) 0x4012D0: D80D38404400 fmul dword ptr [0x444038] 0x4012D6: D9C9 fxch st(0),st(1) 0x4012D8: D80D30404400 fmul dword ptr [0x444030] 0x4012DE: D9CA fxch st(0),st(2) 0x4012E0: D80D34404400 fmul dword ptr [0x444034] 0x4012E6: D9C9 fxch st(0),st(1) 0x4012E8: D80D2C404400 fmul dword ptr [0x44402c] 0x4012EE: D9CA fxch st(0),st(2) 0x4012F0: D80D24404400 fmul dword ptr [0x444024] 0x4012F6: D9C9 fxch st(0),st(1) 0x4012F8: D80D28404400 fmul dword ptr [0x444028] 0x4012FE: D9CA fxch st(0),st(2) 0x401300: D80D20404400 fmul dword ptr [0x444020] 0x401306: D9C9 fxch st(0),st(1) 0x401308: D80D18404400 fmul dword ptr [0x444018] 0x40130E: D9CA fxch st(0),st(2) 0x401310: D80D1C404400 fmul dword ptr [0x44401c] 0x401316: D9C9 fxch st(0),st(1) 0x401318: D80D14404400 fmul dword ptr [0x444014] 0x40131E: D9CA fxch st(0),st(2) 0x401320: C9 leave 0x401321: DEC9 fmulp st(1),st(0) 0x401323: DEE9 fsubp st(1),st(0) 0x401325: C3 ret ;******************************************************************************
also wie man sieht... auf dem compiler bringts nix...
Naja, danke für die Erklärungen!mfg Manuelh87
-
mit ein bissl template programmierung
kann man den compiler beim codegenerieren sehr unterstützen:
http://www.flipcode.com/tutorials/tut_fastmath.shtml
damit ist es bei mir sehr viel fixer geworden
rapso->greets();
-
ja, aber der compiler generiert ja genau den selben code... also bei bester optimierung! Ich hab genau dasselbe gelesen und ne ziemlich ähnliche implementierung gemacht und hab mich dann eben gewundert warum er das nicht so übersetzt wie das ziel eigentlich war!
Das hat mich ja so erstaunt..
Ich schau mir da so den code an... nichts böses ahnent sonder eigentlich sowas wie fld bla; fmul bla; fmul bla; fmul bla; (dann nächstes) fld bla; ....
und seh da plötzlich das er alles mit fxchg dauernd durwechselt und ne ganz neue reinfolge gewählt hat...Desshalb hab ich ja dann auch gefragt denn wenn ich die optimierung von [beste] auf [normal] stell dann bekomm ich ziemlich das gewünschte ergebniss...
und wollt eben wissen ob die [beste] optimerung besser ist oder nicht... und da die angeblich besser ist kann man daher auch auf die optimierung verzichten...ich bekomme bei mit und ohne template optimierung bei [bester] otimerung immer den selben code...
und bei flipcode haben sie ja den msvc++ verwendet... vielleicht liegts daran! Der optimiert ja sogut wie gar nicht... soweit ich gehört habe..mfg Manuelh87
-
Manuelh87 schrieb:
und bei flipcode haben sie ja den msvc++ verwendet... vielleicht liegts daran! Der optimiert ja sogut wie gar nicht... soweit ich gehört habe..
Unsinn. Der optimiert meistens ziemlich gut.
Es wird wohl keine Möglichkeit geben, den Code schneller zu machen. Du hast deine 16 Multiplikationen, die mit voller FPU-Bandbreite ablaufen können. Schneller ginge es nur noch mit SSE, aber das hast du ja nicht eingeschaltet.
-
Ringding schrieb:
Unsinn. Der optimiert meistens ziemlich gut.
lass dich nicht auf einen flamewar mit jemandem ein, der schon sogarkeine erfahrungen mit vc++ hat und das desweegn behaupten kann
rapso->greets();
-
Is okay... kannst dann auch schließen...
Hab mich grad vorher voll aufgeregt weil ich dachte dass sich deine aussage auf mein "msvc++ ist scheiße" (das ich so nie sagen würde...) bezogen hat aber ich denk mal da hab ich mich stark geirrt..
Sry... hätt ich da fast selbst d nen flamewar gestartet...na eigentlich könnt ma den thread sowieso schließen... ich glaub es gibt sowieso niemanden mehr der noch was zum thema zu sagen hat...
@ ringding:
ja sse oder 3dnow würden sicher die performance steigern.. allerdings soll der code nicht nur auf rechnern laufen die das unterstützen. Es ging eigentlich nur um diese eine template optimierung und ob sie sinn macht.mfg Manuel
PS: Ich sollte genau lesen üben...
-
du kannst beim vc++ SSE-optimierungen einschalten, dann macht er das von selbst. dadurch hat man vorteile weil die register normal ansprechbar sind und nicht über den stack und compare operationen werden direkt in statusregister reingeschrieben, ohne den umweg wie bei fcom. da das nur ein compilerflag ist, dürfte es einfachs ein ein binary sowohl für alte als auch neue rechner binaries zu erstellen.
btw. mit sse lohnt sich die template optimierung eher nicht, dürfte wohl sogar andersrum sein. die templateoptimierung ist ja dafür da um unnötige speicherschieberei zu umgehen aufgrund der stackarchitektur der x87, das schafft aber mehr (unnötige) abhängigkeiten zwischen den einzelnen befehlen. bei sse-sofern du nicht zuviele temporäre floats hast, werden diese in registern behalten und mit möglichst wenig abhängigkeiten abgearbeitet.
könnte sogar sein dass sie von compilern automatisch parallelisiert werden.
rapso->greets();