FMA-Anweisungssatz - FMA instruction set
Der FMA - Befehlssatz ist eine Erweiterung auf die 128 und 256-Bit - Streaming SIMD Extensions Anweisungen in dem x86 - Mikroprozessor - Befehlssatz perform Multiplikations-Additions fusionierte (FMA) -Operationen. Es gibt zwei Varianten:
- FMA4 wird in AMD- Prozessoren ab der Bulldozer- Architektur unterstützt. FMA4 wurde in Hardware ausgeführt, bevor FMA3 war. Die Unterstützung für FMA4 wurde seit Zen 1 entfernt .
- FMA3 wird in AMD-Prozessoren ab der Piledriver- Architektur und Intel ab Haswell-Prozessoren und Broadwell-Prozessoren seit 2014 unterstützt.
Anweisungen
FMA3- und FMA4-Befehle haben fast identische Funktionen, sind jedoch nicht kompatibel. Beide enthalten fusionierte Multiply-Add (FMA)-Befehle für Gleitkomma- Skalar- und SIMD- Operationen, aber FMA3-Befehle haben drei Operanden, während FMA4-Befehle vier haben. Die FMA-Operation hat die Form d = round( a · b + c ), wobei die Rundungsfunktion eine Rundung durchführt , damit das Ergebnis in das Zielregister passt, wenn es zu viele signifikante Bits gibt, um in das Ziel zu passen.
Die Vier-Operanden-Form (FMA4) erlaubt, dass a , b , c und d vier verschiedene Register sind, während die Drei-Operanden-Form (FMA3) erfordert, dass d dasselbe Register wie a , b oder c ist . Die Drei-Operanden-Form macht den Code kürzer und die Hardware-Implementierung etwas einfacher, während die Vier-Operanden-Form mehr Programmierflexibilität bietet.
Weitere Informationen zu Kompatibilitätsproblemen zwischen Intel und AMD finden Sie im XOP-Befehlssatz .
FMA3-Befehlssatz
CPUs mit FMA3
- AMD
-
Piledriver (2012) und neuere Mikroarchitekturen
- APUs der 2. Generation, "Trinity" (32 nm) , 15. Mai 2012
- 2. Generation "Bulldozer" (bdver2) mit Piledriver-Kernen , 23. Oktober 2012
-
Piledriver (2012) und neuere Mikroarchitekturen
- Intel
Auszug aus FMA3
Zu den unterstützten Befehlen gehören
Opcode | Betrieb | Opcode | Betrieb |
---|---|---|---|
VFM HINZUFÜGEN | result = + a · b + c |
VFM- ADDSUB |
result = a · b + c für i = 1, 3, ... result = a · b − c für i = 0, 2, ...
|
VF N M HINZUFÜGEN |
result = − a · b + c
|
||
VFM- SUB | result = + a · b − c |
VFM- SUBADD |
result = a · b − c für i = 1, 3, ... result = a · b + c für i = 0, 2, ...
|
VF N M SUB |
result = − a · b − c
|
- Notiz
- VF N M ADD ist
result = − a · b + c
, nichtresult = − (a · b + c)
. - VF N M SUB erzeugt eine –0 für alle Eingaben sind null.
Die explizite Reihenfolge der Operanden ist in der Mnemonik mit den Nummern "132", "213" und "231" enthalten:
Postfix 1 |
Betrieb | möglicher Speicheroperand |
überschreibt |
---|---|---|---|
132 | a = a · c + b |
c (Faktor) |
a (anderer Faktor)
|
213 | a = b · a + c |
c (Summand) |
a (Faktor)
|
231 | a = b · c + a |
c (Faktor) |
a (Summand)
|
sowie Operandenformat (gepackt oder skalar) und Größe (einfach oder doppelt).
Postfix 2 |
Präzision | Größe | Postfix 2 |
Präzision | Größe |
---|---|---|---|---|---|
S S | Einzel | 32-Bit | S D | Doppelt | 64-Bit |
P S x | 4× 32-Bit | P D x | 2× 64-Bit | ||
P S y | 8× 32-Bit | P D y | 4× 64-Bit | ||
P S z | 16× 32-Bit | P D z | 8× 64-Bit |
Das führt zu
Gedächtnisstütze (AT&T) | Operanden | Betrieb |
---|---|---|
VFMADD 132 PD y | ymm, ymm, ymm/m256 |
a = a · c + b
|
VFMADD 132 PS y | ||
VFMADD 132 PD x | xmm, xmm, xmm/m128 | |
VFMADD 132 PS x | ||
VFMADD 132 SD | xmm, xmm, xmm/m64 | |
VFMADD 132 SS | xmm, xmm, xmm/m32 | |
VFMADD 213 PD y | ymm, ymm, ymm/m256 |
a = b · a + c
|
VFMADD 213 PS y | ||
VFMADD 213 PD x | xmm, xmm, xmm/m128 | |
VFMADD 213 PS x | ||
VFMADD 213 SD | xmm, xmm, xmm/m64 | |
VFMADD 213 SS | xmm, xmm, xmm/m32 | |
VFMADD 231 PD y | ymm, ymm, ymm/m256 |
a = b · c + a
|
VFMADD 231 PS y | ||
VFMADD 231 PD x | xmm, xmm, xmm/m128 | |
VFMADD 231 PS x | ||
VFMADD 231 SD | xmm, xmm, xmm/m64 | |
VFMADD 231 SS | xmm, xmm, xmm/m32 |
FMA4-Befehlssatz
CPUs mit FMA4
- AMD
- "Heavy Equipment"-Prozessoren
- Bulldozer-basierte Prozessoren, 12. Oktober 2011
- Piledriver-basierte Prozessoren
- Steamroller-basierte Prozessoren
- Baggerbasierte Prozessoren (einschließlich "v2")
- Zen : WikiChips Tests zeigen, dass FMA4 (unter den Testbedingungen) immer noch zu funktionieren scheint, obwohl es nicht offiziell unterstützt und nicht einmal von CPUID gemeldet wird. Dies wurde auch von Agner bestätigt. Aber andere Tests lieferten falsche Ergebnisse. Offizielle AMD Website FMA4 Support Hinweis ZEN CPUs = AMD ThreadRipper 1900x, R7 Pro 1800, 1700, R5 Pro 1600, 1500, R3 Pro 1300, 1200, R3 2200G, R5 2400G.
- "Heavy Equipment"-Prozessoren
- Intel
- Intel hat keine CPUs mit Unterstützung für FMA4 veröffentlicht.
Auszug aus FMA4
Gedächtnisstütze (AT&T) | Operanden | Betrieb |
---|---|---|
VFMADDPDx | xmm, xmm, xmm/m128, xmm/m128 | a = b·c + d |
VFMADPDy | ymm, ymm, ymm/m256, ymm/m256 | |
VFMADDPSx | xmm, xmm, xmm/m128, xmm/m128 | |
VFMADPSy | ymm, ymm, ymm/m256, ymm/m256 | |
VFMADDSD | xmm, xmm, xmm/m64, xmm/m64 | |
VFMADDSS | xmm, xmm, xmm/m32, xmm/m32 |
Geschichte
Die Inkompatibilität zwischen Intels FMA3 und AMDs FMA4 ist darauf zurückzuführen, dass beide Unternehmen ihre Pläne ändern, ohne die Codierungsdetails miteinander abzustimmen. AMD änderte seine Pläne von FMA3 auf FMA4, während Intel seine Pläne fast gleichzeitig von FMA4 auf FMA3 änderte. Die Historie lässt sich wie folgt zusammenfassen:
- August 2007: AMD kündigt den SSE5- Befehlssatz an, der 3-Operanden-FMA-Befehle enthält. Ein neues Codierungsschema (DREX) wird eingeführt, um zuzulassen, dass Befehle drei Operanden haben.
- April 2008: Intel kündigt seine AVX- und FMA-Befehlssätze an, einschließlich 4-Operanden-FMA-Befehlen. Die Codierung dieser Anweisungen verwendet das neue VEX- Codierungsschema, das flexibler als das DREX-Schema von AMD ist.
- Dezember 2008: Intel ändert die Spezifikation für seine FMA-Befehle von 4-Operanden- auf 3-Operanden-Befehle. Das VEX-Codierungsschema wird weiterhin verwendet.
- Mai 2009: AMD ändert die Spezifikation seiner FMA-Anweisungen vom 3-Operanden-DREX-Formular in das 4-Operanden-VEX-Formular, das mit der Intel-Spezifikation vom April 2008 anstelle der Intel-Spezifikation vom Dezember 2008 kompatibel ist.
- Oktober 2011: AMD Bulldozer Prozessor unterstützt FMA4.
- Januar 2012: AMD kündigt FMA3-Unterstützung in zukünftigen Prozessoren mit den Codenamen Trinity und Vishera an ; sie basieren auf der Piledriver-Architektur.
- Mai 2012: AMD Piledriver Prozessor unterstützt sowohl FMA3 als auch FMA4.
- Juni 2013: Intel Haswell Prozessor unterstützt FMA3.
- Februar 2017 Die erste Generation von AMD Ryzen Prozessoren unterstützt offiziell FMA3, aber nicht FMA4 laut CPUID- Anweisung. Es gab Verwirrung darüber, ob FMA4 auf diesem Prozessor implementiert wurde oder nicht, aufgrund von Errata im ersten Patch für das GNU Binutils- Paket, das inzwischen korrigiert wurde. Während die FMA4-Anweisungen nach einigen Tests zu funktionieren scheinen, können sie auch falsche Ergebnisse liefern. Darüber hinaus könnten die anfänglichen Ryzen-CPUs durch eine bestimmte Abfolge von FMA3-Befehlen zum Absturz gebracht werden. Es wurde seitdem durch einen aktualisierten CPU-Mikrocode behoben.
Compiler- und Assembler-Unterstützung
Verschiedene Compiler bieten unterschiedliche Unterstützungsstufen für FMA:
- GCC unterstützt FMA4 mit -mfma4 seit Version 4.5.0 und FMA3 mit -mfma seit Version 4.7.0.
- Microsoft Visual C++ 2010 SP1 unterstützt FMA4-Anweisungen.
- Microsoft Visual C++ 2012 unterstützt FMA3-Befehle (wenn der Prozessor auch die AVX2-Befehlssatzerweiterung unterstützt).
- Microsoft Visual C++ seit VC 2013
- PathScale unterstützt FMA4 mit -mfma.
- LLVM 3.1 fügt FMA4-Unterstützung hinzu, zusammen mit vorläufiger FMA3-Unterstützung.
- Open64 5.0 fügt "eingeschränkte Unterstützung" hinzu.
- Intel-Compiler unterstützen nur FMA3-Anweisungen.
- NASM unterstützt FMA3-Anweisungen seit Version 2.03 und FMA4-Anweisungen seit 2.06.
- Yasm unterstützt FMA3-Instruktionen seit Version 0.8.0 und FMA4-Instruktionen seit Version 1.0.0.
- FASM unterstützt sowohl FMA3- als auch FMA4-Anweisungen.