FMA skup instrukcija

FMA skup instrukcija je proširenje na 128 i 256-to bitne instrukcije Streaming SIMD Extensions u okviru seta instrukcija za x86 mikroprocesor. FMA služi za istovremeno obavljanje operacija množenja i sabiranja.[1] Postoje dve varijante:

  • FMA4, koji je podržan u AMD procesorima počev od Bulldozer arhitekture. FMA4 je hardverski realizovan pre FMA3.
  • FMA3 podržava AMD procesore počev od Piledriver arhitektu i Intel, počev od procesora Haswell i Broadwell od 2014. godine.

Nove instrukcije uredi

FMA3 i FMA4 instrukcije imaju gotovo identičnu funkcionalnost, ali nisu kompatibilne. Oba sadrže sjedinjeno množenje–dodavanje (FMA) instrukcije za racionalne brojeve i zaSIMD SIMD operacije, ali FMA3 uputstva imaju tri operanda, dok ih FMA4 ima četiri. FMA operacija ima formu d = Round(a * b + c), gde funkcija Round obavlja zaokruživanje, omogućavajući da se rezultat smesti u registar odredišta u slučaju da ima više značajnih bita nego što može da stane u odredište.

Oblik sa četiri operanda (FMA4) omogućava a, b, cd da budu u četiri različita registra, dok oblik sa tri operanda (FMA3) zahteva da operand d bude u istom registru kao neki od operanada a, b ili c. FMA3 proizvodi mnogo kraći kod koji olakšava lakšu hardversku implementaciju, dok FMA4 doprinosi većoj fleksibilnosti tokom programiranja.

FMA3 instrukcioni set uredi

Procesori koji implementiraju FMA3 uredi

  • Intel
    • Intel je započeo hardversku realizaciju FMA3 u procesorima počev od arhitekture Hasvell u 2013. godini.
  • AMD
    • Kompanija AMD je sa Piledriver arhitekturom započela podršku FMA3 radi veće kompatibilnosti.[2][3] Druga generacija APU procesora zasnovanim na "Trinity" (32 nm), koji su podržavali FMA3 je predstavljena 15. maja 2012. godine. Druga generacija procesora Bulldozer jezgrima koji podržavaju instrukcioni set FMA3 je predstavljena 23. oktobra 2012. godine.

Izvod iz FMA3 uredi

Mnemotehnika (AT&T) Operandi Operacija
VFMADD132PDy ymm, ymm, ymm/m256 $0 = $0×$2 + $1
VFMADD132PSy
VFMADD132PDx xmm, xmm, xmm/m128
VFMADD132PSx
VFMADD132SD xmm, xmm, xmm/m64
VFMADD132SS xmm, xmm, xmm/m32
VFMADD213PDy ymm, ymm, ymm/m256 $0 = 1$×$0 + $2
VFMADD213PSy
VFMADD213PDx xmm, xmm, xmm/m128
VFMADD213PSx
VFMADD213SD xmm, xmm, xmm/m64
VFMADD213SS xmm, xmm, xmm/m32
VFMADD231PDy ymm, ymm, ymm/m256 $0 = 1$×2 $+ $0
VFMADD231PSy
VFMADD231PDx xmm, xmm, xmm/m128
VFMADD231PSx
VFMADD231SD xmm, xmm, xmm/m64
VFMADD231SS xmm, xmm, xmm/m32

FMA4 instrukcioni set uredi

Procesori koji implementiraju FMA4 uredi

  • AMD
    • Bulldozer jezgro je predstavljeno 12. oktobra 2011. g.[4]
    • Piledriver[5]
  • Intel
    • Neivesno je da li će budući Intel procesori podržati FMA4 nakon što je Intel objavio prelazak na FMA3.

Izvod iz FMA4 uredi

Mnemotehnika (at & t) Operandi Operacija
VFMADDPDx xmm, xmm, xmm/m128, xmm/m128  $0 = 1$×2 $+ $3
VFMADDPDy ymm, ymm, ymm/m256, ymm/m256 
VFMADDPSx xmm, xmm, xmm/m128, xmm/m128 
VFMADDPSy ymm, ymm, ymm/m256, ymm/m256 
VFMADDSD xmm, xmm, xmm/m64, xmm/m64 
VFMADDSS xmm, xmm, xmm/m32, xmm/m32

Istorijat uredi

Nekompatibilnost između Intelovog FMA3 i AMD-ovog FMA4 se dogodila zato što su obe kompanije promenile plan bez međusobne koordinacije u detaljima koda. Kompanija AMD je promenila svoje planove iz FMA3 u FMA4, dok je Intel je promenio svoje planove iz FMA4 u FMA3 u skoro isto vreme. Priča može se sažeti na sledeći način:

  • Avgust 2007. godine: AMD najavljuje SSE5 skup instrukcija, koji obuhvata FMA instrukciju sa 3 operanda. Nova šema kodiranja (DREX) je predstavljena, omogućavajući instrukcijama da imaju tri operanda.[6]
  • April 2008: Intel najavljuje njihove AVX i FMA skupove instrukcija, uključujući FMA4 instrukcije. Kodiranje ovih instrukcija koristi nove VEX šeme kodiranja, koje su fleksibilnije od AMD-ovih DREX šema.[7]
  • Decembar 2008: Intel menja specifikaciju svojih FMA instrukcija sa one sa četiri operanda, na instrukcije sa 3 operanda. VEX šema se i dalje koristi.[8]
  • Maja 2009: AMD menja specifikaciju svojih FMA uputstava sa FMA3 DREX forme na FMA4 VEX oblik, koja je kompatibilna sa aprilskom спецификацијом Интела из 2008, umesto specifikacije iz decembra 2008.[9]
  • Oktobar 2011: AMD Buldozer procesor podržava FMA4.[10]
  • Januar 2012.: kompanija AMD nagoveštava podršku FMA3 u budućim procesorima pod nazivima Trinity i Vishera koji su bazirani na Piledriver arhitekturi.[11]
  • Maja 2012: AMD Piledriver procesor podržava FMA3, takođe i FMA4.[10]
  • Jun 2013: Intel Haswell procesor podržava FMA3.[12]

Kompanija AMD je otkrila da će Zen, treća generacija arhitekture x86-64, u svom prvom izdanju (znver1 – Zen, verzija 1) prestati da podržava FMA4 u zakrpi za GNU Binutils paket.[13] Isprva je postojala zbunjenost, vezana za to da li će FMA4 biti implementiran ili ne, zbog grešaka u prvobitnoj zakrpi, koja je od tada popravljen.[14]

Kompajleri i asembleri koji podržavaju FMA uredi

Različiti kompajleri pružaju različite nivoe podrške za FMA4:

  • GCC podržava FMA4 sa -mfma4 od verzije 4.5.0[15] i FMA3 sa -mfma od verzije 4.7.0.
  • Microsoft Visual C++ 2010 SP1 podržava FMA4 instrukcije.[16]
  • Microsoft Visual C++ 2012 podržava FMA3 instrukcije (ako procesor takođe podržava dodatak skupa instrukcija AVX2).
  • Microsoft Visual C++ 2013
  • Microsoft Visual C++ 2015
  • PathScale podržava FMA4 sa -mfma.[17]
  • LLVM 3.1 dodaje podršku FMA4.[18]
  • Open64 5.0 dodaje "limitiranu podršku".
  • Intel kompajleri podržavaju samo realizaciju FMA3 instrukcija.[15]
  • NASM podržava realizaciju FMA3 instrukcije od verzije 2.03 i FMA4 instrukcije od 2.06.
  • Yasm podržava FMA3 od verzije 0.8.0 i FMA4 od verzije 1.0.0.
  • FASM podržava FMA3 i FMA4 instrukcije.

Reference uredi

  1. ^ "FMA3 and FMA4 are not instruction sets, they are individual instructions -- fused multiply add.
  2. ^ „Striking a balance”. Dave Christie, AMD Developer blogs. 7. 5. 2009. Pristupljeno 8. 5. 2009. [mrtva veza]
  3. ^ Maffeo, Robin. „AMD and the Visual Studio 11 Beta”. AMD. Pristupljeno 19. 4. 2012. [mrtva veza]
  4. ^ „AMD64 Architecture Programmer’s Manual Volume 6: 128-Bit and 256-Bit XOP, FMA4 and CVT16 Instructions” (PDF). AMD. 1. 5. 2009. 
  5. ^ „New "Bulldozer" and "Piledriver" Instructions A step forward for high performance software development” (PDF). AMD. 2012. 
  6. ^ „128-Bit SSE5 Instruction Set”. AMD Developer Central. Arhivirano iz originala 15. 1. 2008. g. Pristupljeno 28. 1. 2008. 
  7. ^ „Intel Advanced Vector Extensions Programming Reference”. Intel. Arhivirano iz originala (PDF) 07. 08. 2011. g. Pristupljeno 5. 4. 2008. 
  8. ^ „Intel Advanced Vector Extensions Programming Reference”. Intel. Pristupljeno 6. 5. 2009. 
  9. ^ „Striking a balance”. Dave Christie, AMD Developer blogs. 7. 5. 2009. Arhivirano iz originala 05. 04. 2012. g. Pristupljeno 8. 5. 2009. 
  10. ^ a b „New Bulldozer and Piledriver Instructions” (PDF). AMD. Pristupljeno 25. 7. 2013. 
  11. ^ „Software Optimization Guide for AMD Family 15h Processors” (PDF). AMD. Pristupljeno 19. 4. 2012. 
  12. ^ „Intel Architecture Instruction Set Extensions Programming Reference” (PDF). Intel. Pristupljeno 25. 7. 2013. 
  13. ^ Gopalasubramanian, G - [PATCH] add znver1 processor
  14. ^ Pawar, Amit - [PATCH] Remove CpuFMA4 From Znver1 CPU Flags
  15. ^ a b Latif, Lawrence (14. 11. 2011). „AMD Bulldozer only FMA4 and XOP instructions are supported by GCC Intel still mute”. The Inquirer. Arhivirano iz originala 17. 11. 2011. g. Pristupljeno 05. 06. 2016. 
  16. ^ „FMA4 Intrinsics Added for Visual Studio 2010 SP1”. 
  17. ^ „EKOPath man doc”. Arhivirano iz originala 23. 06. 2016. g. Pristupljeno 05. 06. 2016. 
  18. ^ „LLVM 3.1 Release Notes”.