FMA
Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de
versiunea revizuită la 15 iulie 2021; verificările necesită
6 modificări .
FMA ( eng. Fused Multiply-Add , multiplicare-adunare cu rotunjire unică) este un set de instrucțiuni SIMD opționale de 128 și 256 de biți pentru arhitecturi x86 și x86-64 , concepute pentru a efectua operația de înmulțire-adunare pe numere în floating- format punct.virgulă.
Există două opțiuni pentru extensii care adaugă instrucțiuni FMA:
- FMA4 a fost susținut de procesoarele AMD încă de la arhitectura Bulldozer . FMA4 a fost implementat înainte de FMA3, dar AMD a renunțat ulterior la suportul pentru această extensie. Acest lucru a devenit nepractic deoarece Intel nu a implementat FMA4 în procesoarele lor.
- FMA3 este suportat de procesoarele Intel din arhitectura Haswell și de procesoarele AMD din arhitectura Piledriver .
Caracteristici
Instrucțiunile FMA3 și FMA4 au funcționalități aproape identice, dar nu sunt compatibile. Ambele conțin instrucțiuni SIMD de înmulțire-adăugare pentru numerele în virgulă mobilă. Suportul lor în compilatoare va dura ceva timp.
Problemă de compatibilitate
Diferența dintre FMA3 și FMA4 este câți operanzi diferiți are instrucțiunea - 3 sau 4. Operația FMA este:
Forma cu 4 operanzi (FMA4) permite a, b, c și d să fie în registre diferite, în timp ce forma cu 3 operanzi (FMA3) necesită ca d să fie în unul dintre aceleași registre ca a, b sau c. Forma cu 3 operanzi face codul mai scurt și mai ușor de implementat în hardware, în timp ce forma cu 4 operanzi oferă mai multă flexibilitate de programare.
FMA3
Procesoare cu suport FMA3
- Intel
- Intel a introdus o implementare hardware a FMA3 în procesoare bazate pe arhitectura Haswell în 2013.
- AMD
- Procesoarele AMD au primit suport FMA3 în arhitecturile Bulldozer și Piledriver în 2012. [1] [2] .
Noi instrucțiuni FMA3
Instruire
|
operanzi
|
Operațiune
|
VFMADD132PDy, VFMSUB132PDy
|
ymm, amm, amm/m256
|
a = a c ± b
|
VFMADD132PSy, VFMSUB132PSy
|
VFMADD132PDx, VFMSUB132PDx
|
xmm, xmm, xmm/m128
|
VFMADD132PSx, VFMSUB132PSx
|
VFMADD132SD, VFMSUB132SD
|
xmm, xmm, xmm/m64
|
VFMADD132SS, VFMSUB132SS
|
xmm, xmm, xmm/m32
|
VFMADD213PDy, VFMSUB213PDy
|
ymm, amm, amm/m256
|
a = b a ± c
|
VFMADD213PSy, VFMSUB213PSy
|
VFMADD213PDx, VFMSUB213PDx
|
xmm, xmm, xmm/m128
|
VFMADD213PSx, VFMSUB213PSx
|
VFMADD213SD, VFMSUB213SD
|
xmm, xmm, xmm/m64
|
VFMADD213SS, VFMSUB213SS
|
xmm, xmm, xmm/m32
|
VFMADD231PDy, VFMSUB231PDy
|
ymm, amm, amm/m256
|
a = b c ± a
|
VFMADD231PSy, VFMSUB231PSy
|
VFMADD231PDx, VFMSUB231PDx
|
xmm, xmm, xmm/m128
|
VFMADD231PSx, VFMSUB231PSx
|
VFMADD231SD, VFMSUB231SD
|
xmm, xmm, xmm/m64
|
VFMADD231SS, VFMSUB231SS
|
xmm, xmm, xmm/m32
|
Pe lângă instrucțiunile principale enumerate în tabel, extensia FMA3 conține o serie de instrucțiuni aparținând următoarelor grupuri:
- VFMADDSUB - înmulțirea și alternarea adunării și scăderii (scăderea pe poziții pare, adunarea - pe cele impare);
- VFMSUBADD - înmulțire și scădere și adunare alternativă (adunare pe poziții pare, scădere - pe poziții impare);
- VFNMADD - înmulțirea luată cu semnul opus și adunarea;
- VFNMSUB - înmulțire luată cu semnul opus și scădere.
FMA4
Procesoare cu suport FMA4
- AMD
- AMD a implementat pentru prima dată suportul FMA4 în procesoarele cu arhitectură Bulldozer, care au fost introduse în octombrie 2011 [3] , iar arhitectura Piledriver acceptă și FMA4 [4] .
- Începând cu microarhitectura Zen (2017, Ryzen , mărci EPYC) AMD a încetat să mai suporte FMA4 [5] [6]
- Intel
- Din 2013, procesoarele Intel nu acceptă FMA4 și nu se știe dacă Intel va suporta FMA4 în viitor.
Noi instrucțiuni FMA4
Instruire
|
operanzi
|
Operațiune
|
VFMADDPDx
|
xmm, xmm, xmm/m128, xmm/m128
|
a = b c + d
|
VFMADDPDy
|
ymm, amm, aa/m256, aaa/m256
|
VFMADDPSx
|
xmm, xmm, xmm/m128, xmm/m128
|
VFMADDPSy
|
ymm, amm, aa/m256, aaa/m256
|
VFMADDSD
|
xmm, xmm, xmm/m64, xmm/m64
|
VFMADDSS
|
xmm, xmm, xmm/m32, xmm/m32
|
Istorie
Incompatibilitatea dintre FMA3 de la Intel și FMA4 de la AMD se datorează faptului că ambele companii și-au schimbat planurile fără să cadă de acord între ele asupra detaliilor de codificare. AMD a schimbat planurile de la FMA3 la FMA4, în timp ce Intel a schimbat planurile de la FMA4 la FMA3, aproape în același timp.
Suport pentru compilator
Diferiți compilatoare oferă diferite niveluri de suport FMA.
Suport la asamblori:
- NASM a primit suport pentru FMA3 în versiunea 2.03 și FMA4 în versiunea 2.06.
- YAsm acceptă FMA3 și FMA4 începând cu versiunea 1.1.0.
- FASM acceptă atât FMA3, cât și FMA4.
Vezi și
Note
- ↑ Găsirea unui echilibru . Dave Christie, bloguri pentru dezvoltatori AMD (7 mai 2009). Preluat: 8 mai 2009. (nedefinit) (link indisponibil)
- ↑ Maffeo, Robin AMD și Visual Studio 11 Beta . AMD. Preluat: 8 decembrie 2013. (nedefinit) (link inaccesibil)
- ↑ AMD64 Architecture Programmer's Guide. Volumul 6. Instrucțiuni XOP, FMA4 și CVT16 pe 128 și 256 biți . AMD (1 mai 2009). Consultat la 7 decembrie 2013. Arhivat din original pe 20 mai 2009.
- ↑ Noi instrucțiuni în „Bulldozer” și „Piledriver”. Un pas înainte în dezvoltarea de software de înaltă performanță . AMD (octombrie 2012). Data accesului: 7 decembrie 2013. Arhivat din original pe 7 ianuarie 2013.
- ↑ [1] Arhivat la 14 septembrie 2017 la Wayback Machine „Dar, având în vedere că Zen este un design cu foaie curată, există câteva extensii de set de instrucțiuni găsite în procesoarele Bulldozer care nu se găsesc în Zen/znver1. Cele care nu mai sunt prezente includ FMA4 și XOP.”
- ↑ [https://web.archive.org/web/20160304033017/https://sourceware.org/ml/binutils/2015-03/msg00078.html Arhivat 4 martie 2016 la Wayback Machine Gopalasubramanian, G - [PATCH ]adăugați procesorul znver1]
- ↑ GCC 4.5 este scos (downlink) . Preluat la 7 decembrie 2013. Arhivat din original la 13 decembrie 2013. (nedefinit)
- ↑ Obiecte FMA4 încorporate adăugate în Visual Studio 2010 SP1 . Preluat la 7 decembrie 2013. Arhivat din original la 16 decembrie 2013. (nedefinit)
- ↑ Nou în x86 Open64 Compiler Suite v4.5.2 . Arhivat din original pe 13 noiembrie 2013. (nedefinit)
Link -uri