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:

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

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, nicht   result = − (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 00× 32-Bit S D Doppelt 64-Bit
P S x 04× 32-Bit P D x 2× 64-Bit
P S y 08× 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
    • 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.
  • 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.

Verweise