Multiplizieren–Akkumulieren-Operation - Multiply–accumulate operation
In der Computertechnik , insbesondere bei der digitalen Signalverarbeitung , ist die Multiply-Accumulate ( MAC ) oder Multiply-Add ( MAD ) Operation ein üblicher Schritt, der das Produkt zweier Zahlen berechnet und dieses Produkt zu einem Akkumulator addiert . Die Hardwareeinheit, die die Operation durchführt, wird als Multiplikator-Akkumulator ( MAC-Einheit ) bezeichnet; die Operation selbst wird oft auch als MAC- oder MAC-Operation bezeichnet. Die MAC-Operation modifiziert einen Akkumulator a :
Bei Gleitkommazahlen kann dies mit zwei Rundungen (typisch in vielen DSPs ) oder mit einer einzigen Rundung erfolgen. Wenn es mit einer einzelnen Rundung durchgeführt wird, wird es als fusioniertes Multiplizieren-Addieren ( FMA ) oder fusioniertes Multiplizieren-Akkumulieren ( FMAC ) bezeichnet.
Moderne Computer können einen dedizierten MAC enthalten, der aus einem Multiplizierer besteht, der in kombinatorischer Logik implementiert ist, gefolgt von einem Addierer und einem Akkumulatorregister, das das Ergebnis speichert. Der Ausgang des Registers wird an einen Eingang des Addierers rückgekoppelt, so dass bei jedem Taktzyklus der Ausgang des Multiplizierers zum Register addiert wird. Kombinatorische Multiplikatoren erfordern viel Logik, können aber ein Produkt viel schneller berechnen als die für frühere Computer typische Methode des Verschiebens und Addierens . Percy Ludgate war der erste, der in seiner Analytical Machine von 1909 einen MAC konzipierte, und der erste, der einen MAC zur Division ausnutzte (unter Verwendung einer Multiplikation, die durch Reziproke gesät wurde, über die konvergente Reihe (1+ x ) −1 ). Die ersten modernen Prozessoren, die mit MAC-Einheiten ausgestattet wurden, waren digitale Signalprozessoren , aber die Technik ist heute auch bei Universalprozessoren üblich.
In Gleitkomma-Arithmetik
Wenn es mit ganzen Zahlen gemacht wird , ist die Operation normalerweise exakt (berechnet modulo eine Zweierpotenz ). Allerdings Gleitkommazahlen haben Zahlen nur eine bestimmte Menge mathematischer Präzision . Das heißt, digitale Gleitkommaarithmetik ist im Allgemeinen nicht assoziativ oder distributiv . (Siehe Gleitkomma § Genauigkeitsprobleme .) Daher macht es für das Ergebnis einen Unterschied, ob die Multiplikation-Addition mit zwei Rundungen oder in einer Operation mit einer einzigen Rundung (eine fusionierte Multiplikation-Addition) durchgeführt wird. IEEE 754-2008 gibt an, dass es mit einer Rundung durchgeführt werden muss, um ein genaueres Ergebnis zu erzielen.
Fusioniert multiplizieren – addieren
Eine fusionierte Multiplikations-Addition ( FMA oder fmadd ) ist eine Gleitkomma-Multiplikations-Additionsoperation, die in einem Schritt mit einer einzigen Rundung durchgeführt wird. Das heißt, wenn eine nicht verschmolzene Multiplikations-Addition das Produkt b × c berechnen würde , es auf N signifikante Bits runden würde , das Ergebnis zu a addieren und auf N signifikante Bits zurückrunden würde, würde eine verschmolzene Multiplikations-Addition den gesamten Ausdruck a + . berechnen ( b × c ) auf seine volle Genauigkeit, bevor das Endergebnis auf N signifikante Bits abgerundet wird.
Eine schnelle FMA kann die Genauigkeit vieler Berechnungen beschleunigen und verbessern, die die Akkumulation von Produkten beinhalten:
- Skalarprodukt
- Matrix-Multiplikation
- Polynomiale Auswertung (zB mit der Horner-Regel )
- Newtonsche Methode zur Auswertung von Funktionen (aus der Umkehrfunktion)
- Faltungen und künstliche neuronale Netze
- Multiplikation in Doppel-Doppel-Arithmetik
Mit Fused Multiply-Add kann man sich in der Regel auf genauere Ergebnisse verlassen. Doch William Kahan hat darauf hingewiesen , dass es Probleme geben kann , wenn gedankenlos verwendet. Wenn x 2 − y 2 als (( x × x ) − y × y ) ausgewertet wird ( gemäß der von Kahan vorgeschlagenen Notation, in der redundante Klammern den Compiler anweisen, den ( x × x ) -Term zuerst zu runden ) mit fusioniertem Multiplizieren-Addieren, dann das Ergebnis kann sogar dann negativ sein, wenn x = y ist, da die erste Multiplikation Bits mit niedriger Wertigkeit verwirft. Dies könnte dann zu einem Fehler führen, wenn dann zB die Quadratwurzel des Ergebnisses ausgewertet wird.
Bei Implementierung innerhalb eines Mikroprozessors kann eine FMA schneller sein als eine Multiplikationsoperation gefolgt von einer Addition. Jedoch erfordern industrielle Standardimplementierungen, die auf dem ursprünglichen IBM RS/6000-Design basieren, einen 2 N- Bit-Addierer, um die Summe richtig zu berechnen.
Ein weiterer Vorteil der Einbeziehung dieses Befehls besteht darin, dass er eine effiziente Softwareimplementierung von Divisions- (siehe Divisionsalgorithmus ) und Quadratwurzeloperationen (siehe Verfahren zum Berechnen von Quadratwurzeln ) ermöglicht, wodurch die Notwendigkeit für dedizierte Hardware für diese Operationen eliminiert wird.
Dot-Produktanleitung
Einige Maschinen kombinieren mehrere fusionierte Multiply-Add-Operationen in einem einzigen Schritt, z. B. Durchführen eines Vier-Elemente-Punktprodukts an zwei 128-Bit- SIMD- Registern a0×b0 + a1×b1 + a2×b2 + a3×b3
mit einem Durchsatz in einem einzigen Zyklus.
Die Unterstützung
Der FMA-Betrieb ist in IEEE 754-2008 enthalten .
Der VAX - Befehl der Digital Equipment Corporation (DEC) wird zum Bewerten von Polynomen mit der Horner-Regel unter Verwendung einer Folge von Multiplikations- und Addierschritten verwendet. Befehlsbeschreibungen geben nicht an, ob das Multiplizieren und Addieren unter Verwendung eines einzigen FMA-Schritts durchgeführt wird. Dieser Befehl ist seit seiner ursprünglichen 11/780-Implementierung im Jahr 1977 Teil des VAX-Befehlssatzes.
POLY
Der Standard von 1999 der Programmiersprache C unterstützt die FMA-Operation durch die fma()
standardmäßige mathematische Bibliotheksfunktion und Standard-Pragmas ( #pragma STDC FP_CONTRACT
), die Optimierungen basierend auf FMA steuern.
Die fusionierte Multiply-Add-Operation wurde als "multiply-add fused" im IBM POWER1 (1990)-Prozessor eingeführt, ist aber seitdem zu zahlreichen anderen Prozessoren hinzugefügt worden:
- HP PA-8000 (1996) und höher
- Hitachi SuperH SH-4 (1998)
- SCE - Toshiba Emotion Engine (1999)
- Intel Itanium (2001)
- STI- Zelle (2006)
- Fujitsu SPARC64 VI (2007) und höher
- ( MIPS- kompatibel) Loongson -2F (2008)
- Elbrus-8SV (2018)
- x86-Prozessoren mit FMA3- und/oder FMA4-Befehlssatz
- AMD Bulldozer (2011, nur FMA4)
- AMD Piledriver (2012, FMA3 und FMA4)
- AMD Dampfwalze (2014)
- AMD- Bagger (2015)
- AMD Zen (2017, nur FMA3)
- Intel Haswell (2013, nur FMA3)
- Intel Skylake (2015, nur FMA3)
- ARM-Prozessoren mit VFPv4 und/oder NEONv2:
- ARM-Cortex-M4F (2010)
- ARM-Cortex-A5 (2012)
- ARM-Cortex-A7 (2013)
- ARM-Cortex-A15 (2012)
- Qualcomm Krait (2012)
- Apfel A6 (2012)
- Alle ARMv8- Prozessoren
- Fujitsu A64FX hat "FMA mit vier Operanden mit Präfixanweisung".
- IBM z/Architektur (seit 1998)
- GPUs und GPGPU-Boards:
-
Advanced Micro Devices GPUs (2009) und neuer
- TeraScale 2 "Evergreen" -serienbasiert
- Graphics Core Next- basiert
- NVidia- GPUs (2010) und neuer
- Intel GPUs seit Sandy Bridge
- Intel-Mikrofon (2012)
- ARM Mali T600-Serie (2012) und höher
-
Advanced Micro Devices GPUs (2009) und neuer
- Vektorprozessoren: