Vor- und Nachteile von 2-Operand-Format und 3-Operand-Format
-
Hallo Leute,
ich bin auf der Suche nach Vor- und Nachteilen vom 2-Operand-Format und 3-Operand-Format. Also:
add $1 $2
und
add $3 $1 $2
Ein Vorteil des 3-Operand-Format gegenueber dem 2-Operand-Format ist doch sicherlich das man weniger Instructions braucht also ich muss nicht extra noch ein mov machen um das Ergebnis aus dem Akkumulator zu holen. Ist das richtig?
Gibt es sonst noch mehr Vorteile bzw. Nachteile?
mfg
-
Im 2-Operand-Format kommen Instruktionen mit weniger Speicher aus, weil das Zielregister (oder was auch immer) implizit mitgeliefert wird und nicht extra im Befehl kodiert werden muss.
Schumi123 schrieb:
Ein Vorteil des 3-Operand-Format gegenueber dem 2-Operand-Format ist doch sicherlich das man weniger Instructions braucht also ich muss nicht extra noch ein mov machen um das Ergebnis aus dem Akkumulator zu holen. Ist das richtig?
Naja...bedingt. Wenn du sowieso nur ein Akkumulator-Register hast macht es wenig Sinn, dieses jedes mal explizit angeben zu muessen.
-
ob man desktruktiv mit 2 operanten arbeitet, oder doch mit 3 oder 4 haengt hauptsaechlich davon ab wieviele register man zur verfuegung hat.
SSE mit 4operanten, bei 8 registern, waere ziemlich schlecht, denn man muesste eh pro befehl die ganzen register zur verfuegung stellen und vermutich die vom vorherigen befehl zerstoeren.
andererseits, auf einer SPU, wo man 128 SIMD register hat, machen 4operanten durchaus sinn, denn dort kannst du selbst bei einer groesseren schleife durchgaengig wichtige variablen in registern halten und dann willst du nicht destruktiv arbeiten und immer wieder nachladen.nachteil:
-entsprechend, fuer 3+ operanten brauchst du mehr register damit sie sinn machen, daraus hast du den nachteil dass natuerlich der chip groesser wird und die instruktionen laenger werden (auf der SPU hast du 2KB register und indizierst sie mit 7bit, was schon ein kompromis ist, denn du kannst nur SIMD-weise arbeiten).
-architekturen mit vielen operanten neigen dazu auch immer in registern arbeiten zu muessen,man muss also fuer einfach dinge immer wieder speicher laden. (mehr instruktionen) gegenueber z.b. x86 der direkt vom oder auf dem speicher arbeiten kann.
-bandbreite im chip wird kritischer, pro operation bis zu 4 operanten haben zu koennen bedeutet dass der chip auch so ausgelegt sein muss, dass du immer diese 4 pro cycle transferieren kannst. das wird meist "port" genannt und ist wohl zZ ein grund weshalb intels sandy bridge doch kein Fused multiply Add bekam und weshalb IvyBridy nur ein 3operanten (also desktruktives) FMA3 bekommt. Ein FMA4 ohne die 4 ports wuerde nicht viel bringen, es wuerde die zerstoerung eines registers ersparen, aber braeuchte 2cycles nur um die bandbreite zu befriedigen.
vorteil:
-loops kann man besser optimieren, da man wegen vieler register und nicht destruktiver arbeitsweise all input "konstanten" in registern halten kann.
-performance ist konstanter, da man auf registern arbeitet. eine destruktive architektur muss viel vom speicher laden, selbst ein L1 cache kann da limitieren und auch unregelmaessigkeiten aufweisen. dadurch musst du den chip nicht so komplex designen um das zu kompensieren und dann sparst du wiederrum transistoren.
-man kann eher "peak" performance in real world anwendungen erreichen, bzw man kommt nah dran wenn man optimiert, da heutzutage die meisten destruktiven CPUs memory bound sind (sieht dann aus als haette man L1 oder L2 cache misses weil die cpu darauf stallt, aber es ist einfach nur bandbreite).