Multiply-Accumulate

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

Ein Multiply-Accumulate-Befehl (kurz: MAC) ist ein Befehl, der zwei Faktoren multipliziert und das entstehende Produkt zu einem weiteren Summanden (Akkumulator) addiert. Der Befehl ist seit den 1980er Jahren in vielen Signalprozessoren wie auch seit Anfang der 2000er Jahren in konventionellen CPUs zu finden.

Er kann die Anweisung:

\ a \leftarrow a + ( b \cdot c )

durch eine Erweiterung des Hardware-Multiplizierers genauso schnell wie eine klassische Multiplikation ausführen – übliche Ausführungszeiten sind z. B. 2 Takte (40 ns) beim TI TMS320C40 mit 50 MHz Taktfrequenz und 5 Takten (2 ns) beim aktuellen Intel Haswell mit z. B. 2,5 GHz Taktfrequenz.

Entgegen üblichen Darstellungen sind Multiply-Accumulate-Befehle auch für Berechnungen abseits der Haupteinsatzbereiche wie für die digitale Bildverarbeitung, Dekodierung von Videos, digitaler Filter und Regelungstechnik verwendbar.

Die Argumente und das Ergebnis dieser Operation können je nach Prozessortyp und gewähltem Datentyp

  • Integer-Zahlen (Motorola DSP56K),
  • Festkomma-Zahlen (kein Typ bekannt),
  • einfach genaue Gleitkomma-Zahlen (TI TMS320C30/40, Altivec, Intel Haswell) oder
  • doppelt genaue Gleitkomma-Zahlen (Intel Haswell) sein.

Genauigkeit[Bearbeiten]

Hauptartikel: Fused multiply-add

Bei der MAC-Operation kann eine Verbesserung der Genauigkeit im finalen Ergebnis erzielt werden, in dem die notwendige Rundung erst am Ende der MAC-Operation ausgeführt wird und die Zwischenergebnisse intern mit voller Auflösung ohne Rundungen durchgeführt werden. Diese Operation wird auch als englisch Fused Multiply Accumulate, abgekürzt FMA oder FMAC, bezeichnet. Die FMAC-Operation bedingt, im Gegensatz zur MAC-Operation, breitere Datenpfade und damit verbunden einen erhöhten Hardwareaufwand.[1]

Geschwindigkeit[Bearbeiten]

Der Geschwindigkeitszuwachs kann bis zu 100 % betragen. So dauert in vielen DSPs der Multiply-Accumulate-Befehl genauso lange wie eine einzelne Addition oder eine einzelne Multiplikation (Beispiel: Texas Instruments TMS320C40). Der Geschwindigkeitszuwachs beim Intel Haswell ist geringer. Ein Multiply-Accumulate-Befehl dauert 5 Takte, eine einzelne Multiplikation 5 Takte und eine einzelne Addition 3 Takte, was zusammen 8 Takte ergibt und bei optimalem Einsatz ein Gewinn von 60 % bringt.

Auf der anderen Seite ist der Multiply-Accumulate-Befehl häufig der kritischste Befehl (kritischer Pfad) und begrenzt die Taktfrequenz nach oben. Ein weiteres Problem ist, dass man es in der Praxis sehr häufig mit Operationen zu tun hat, die die Form

\ z \leftarrow a + ( b \cdot c ) \cdot s    mit    s = \pm 0{,}5,\,\, \pm 1,\,\, \pm 2.

benötigen würden.

  • Es wird häufig keine Addition, sondern eine Subtraktion des Produkts benötigt (Aufwand: Ein XOR-Gatter für das Vorzeichen von a oder b).
  • Genauso häufig sind Skalierungen mit den Faktoren 0,5 oder 2 notwendig (Aufwand: Inkrement oder Dekrement für den Exponenten von a oder b).
  • Es wird eine 4-Operanden-Form benötigt, da a nicht zerstört werden darf.

Im ersten Fall ist die MAC-Anweisung häufig nicht verwendbar, obwohl sie ein XOR-Gatter von der benötigten Lösung entfernt ist. Im zweiten Fall bringt der MAC-Befehl einen deutlichen Nutzen, leider verbleibt eine Trivialoperation. Der dritte Fall wurde von AMD mit FMA4 adressiert, weiterhin lässt er sich durch das Registerumbenennung heutiger CPUs meist verstecken.

Beispiele:

  • Approximation des Kehrwertes von a mit dem Newton-Raphson-Verfahren: x' = x \cdot (\underline{2 - a \cdot x})
  • Approximation der reziproken Wurzel von a mit dem Newton-Raphson-Verfahren: x' = x \cdot (\underline{1.5 - 0.5 \cdot a \cdot (x^2)})
  • Komplexwerte Multiplikation: r = \underline{(r_1 r_2) - i_1 i_2},\,\, i = r_1 i_2 + r_2 i_1
  • Selbst die Iteration der Juliamenge: r_{n+1} = r_n^2 \underline{- i_n^2 + r_0},\,\,  i_{n+1} = \underline{2 r_n i_n + i_0}
  • Funktionsapproximation mittels Reihenentwicklung bis zum quadratischen Term

Einzelnachweise[Bearbeiten]

  1. Eric Quinnell: Floating-Point Fused Multiply–Add Architectures. 2007, abgerufen am 25. Juli 2013 (PDF; 4,4 MB).