Multiply-Accumulate
Multiply-Accumulate (kurz: MAC) oder Multiply-Add (kurz: MAD) ist eine Rechenoperation, bei der zwei Faktoren multipliziert und das Produkt zu einem fortlaufenden Summanden (Akkumulator) addiert wird:
Diese Operation wird intensiv bei der Verarbeitung digitaler Signale genutzt. In modernen FPGAs sowie bei der Entwicklung von anwendungsspezifischen Schaltungen (ASICs) wird diese Operation als Teil von DSP-Blöcken (Hardwareeinheiten) bereitgestellt;[1] als Maschinenbefehl ist sie seit den 1980er Jahren in vielen Signalprozessoren wie auch seit Anfang der 2000er Jahre in konventionellen CPUs zu finden. Fused Multiply-Accumulate ist ein Multiply-Accumulate Befehl mit höherer Rechengenauigkeit.
Durch die Erweiterung des Hardware-Multiplizierers können Prozessoren diese genauso schnell wie eine klassische Multiplikation ausführen – übliche Ausführungszeiten sind z. B. 2 Takte (40 ns) beim TMS320C40 von Texas Instruments 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
Bei der MAC-Operation kann eine Verbesserung der Genauigkeit im finalen Ergebnis erzielt werden, indem 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.[2]
Geschwindigkeit
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
- mit .
benötigen würden.
- Es wird häufig keine Addition, sondern eine Subtraktion des Produkts benötigt (Aufwand: Ein Exklusiv-Oder-Gatter für das Vorzeichen von oder ).
- Genauso häufig sind Skalierungen mit den Faktoren 0,5 oder 2 notwendig (Aufwand: Inkrement oder Dekrement für den Exponenten von oder ).
- Es wird eine 4-Operanden-Form benötigt, da nicht zerstört werden darf.
Im ersten Fall ist die MAC-Anweisung häufig nicht verwendbar, obwohl sie ein Exklusiv-Oder-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:
- Approximation der reziproken Wurzel von a mit dem Newton-Raphson-Verfahren:
- Komplexwerte Multiplikation:
- Selbst die Iteration der Julia-Menge:
- Funktionsapproximation mittels Reihenentwicklung bis zum quadratischen Term
Einzelnachweise
- Uwe Meyer-Baese: Digital Signal Processing with Field Programmable Gate Arrays, Springer Verlag, 2014. S. 124ff doi:10.1007/978-3-642-45309-0
- Eric Quinnell: Floating-Point Fused Multiply–Add Architectures. (PDF; 4,4 MB) 2007, abgerufen am 25. Juli 2013.