FMA скуп инструкција

FMA скуп инструкција је проширење на 128 и 256-то битне инструкције Streaming SIMD Extensions у оквиру сета инструкција за x86 микропроцесор. FMA служи за истовремено обављање операција множења и сабирања.[1] Постоје две варијанте:

  • FMA4, који је подржан у АМД процесорима почев од Bulldozer архитектуре. FMA4 је хардверски реализован пре FMA3.
  • FMA3 подржава АМД процесоре почев од Piledriver архитекту и Интел, почев од процесора Haswell i Broadwell од 2014. године.

Нове инструкције

FMA3 и FMA4 инструкције имају готово идентичну функционалност, али нису компатибилне. Оба садрже сједињено множење–додавање (FMA) инструкције за рационалне бројеве и заSIMD СИМД операције, али FMA3 упутства имају три операнда, док их FMA4 има четири. FMA операција има форму d = Round(a * b + c), где функција Round обавља заокруживање, омогућавајући да се резултат смести у регистар одредишта у случају да има више значајних бита него што може да стане у одредиште.

Облик са четири операнда (FMA4) омогућава a, b, c и d да буду у четири различита регистра, док облик са три операнда (FMA3) захтева да операнд d буде у истом регистру као неки од операнада a, b или c. FMA3 производи много краћи код који олакшава лакшу хардверску имплементацију, док FMA4 доприноси већој флексибилности током програмирања.

FMA3 инструкциони сет

Процесори који имплементирају FMA3

  • Интел
  • АМД
    • Компанија АМД је са Piledriver архитектуром започела подршку FMA3 ради веће компатибилности.[2][3] Друга генерација APU процесора заснованим на "Trinity" (32 nm), који су подржавали FMA3 је представљена 15. маја 2012. године. Друга генерација процесора Bulldozer језгрима који подржавају инструкциони сет FMA3 је представљена 23. октобра 2012. године.

Извод из FMA3

Мнемотехника (AT&T) Операнди Операција
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 инструкциони сет

Процесори који имплементирају FMA4

  • АМД
    • Bulldozer језгро је представљено 12. октобра 2011. г.[4]
    • Piledriver[5]
  • Интел
    • Неивесно је да ли ће будући Интел процесори подржати FMA4 након што је Интел објавио прелазак на FMA3.

Извод из FMA4

Мнемотехника (at & т) Операнди Операција
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

Историјат

Некомпатибилност између Интеловог FMA3 и АМД-овог FMA4 се догодила зато што су обе компаније промениле план без међусобне координације у детаљима кода. Компанија АМД је променила своје планове из FMA3 у FMA4, док је Интел је променио своје планове из FMA4 у FMA3 у скоро исто време. Прича може се сажети на следећи начин:

  • Август 2007. године: АМД најављује SSE5 скуп инструкција, који обухвата FMA инструкцију са 3 операнда. Нова шема кодирања (DREX) је представљена, омогућавајући инструкцијама да имају три операнда.[6]
  • Април 2008: Интел најављује њихове AVX и FMA скупове инструкција, укључујући FMA4 инструкције. Кодирање ових инструкција користи нове VEX шеме кодирања, које су флексибилније од АМД-ових DREX шема.[7]
  • Децембар 2008: Интел мења спецификацију својих FMA инструкција са оне са четири операнда, на инструкције са 3 операнда. VEX шема се и даље користи.[8]
  • Маја 2009: АМД мења спецификацију својих FMA упутстава са FMA3 DREX форме на FMA4 VEX облик, која је компатибилна са априлском спецификацијом Интела из 2008, уместо спецификације из децембра 2008.[9]
  • Октобар 2011: АМД Buldozer процесор подржава FMA4.[10]
  • Јануар 2012.: компанија АМД наговештава подршку FMA3 у будућим процесорима под називима Trinity и Vishera који су базирани на Piledriver архитектури.[11]
  • Маја 2012: АМД Piledriver процесор подржава FMA3, такође и FMA4.[10]
  • Јун 2013: Интел Haswell процесор подржава FMA3.[12]

Компанија АМД је открила да ће Zen, трећа генерација архитектуре x86-64, у свом првом издању (znver1 – Zen, верзија 1) престати да подржава FMA4 у закрпи за GNU Binutils пакет.[13] Испрва је постојала збуњеност, везана за то да ли ће FMA4 бити имплементиран или не, због грешака у првобитној закрпи, која је од тада поправљен.[14]

Компајлери и асемблери који подржавају FMA

Различити компајлери пружају различите нивое подршке за FMA4:

  • GCC подржава FMA4 са -mfma4 од верзије 4.5.0[15] и FMA3 са -mfma од верзије 4.7.0.
  • Microsoft Visual C++ 2010 SP1 подржава FMA4 инструкције.[16]
  • Microsoft Visual C++ 2012 подржава FMA3 инструкције (ако процесор такође подржава додатак скупа инструкција AVX2).
  • Microsoft Visual C++ 2013
  • Microsoft Visual C++ 2015
  • PathScale подржава FMA4 са -mfma.[17]
  • LLVM 3.1 додаје подршку FMA4.[18]
  • Open64 5.0 додаје "лимитирану подршку".
  • Интел компајлери подржавају само реализацију FMA3 инструкција.[15]
  • NASM подржава реализацију FMA3 инструкције од верзије 2.03 и FMA4 инструкције од 2.06.
  • Yasm подржава FMA3 од верзије 0.8.0 и FMA4 од верзије 1.0.0.
  • ФАСМ подржава FMA3 и FMA4 инструкције.

Референце

  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. Приступљено 8. 5. 2009. [мртва веза]
  3. ^ Maffeo, Robin. „AMD and the Visual Studio 11 Beta”. AMD. Приступљено 19. 4. 2012. [мртва веза]
  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. Архивирано из оригинала 15. 1. 2008. г. Приступљено 28. 1. 2008. 
  7. ^ „Intel Advanced Vector Extensions Programming Reference”. Intel. Архивирано из оригинала (PDF) 07. 08. 2011. г. Приступљено 5. 4. 2008. 
  8. ^ „Intel Advanced Vector Extensions Programming Reference”. Intel. Приступљено 6. 5. 2009. 
  9. ^ „Striking a balance”. Dave Christie, AMD Developer blogs. 7. 5. 2009. Архивирано из оригинала 05. 04. 2012. г. Приступљено 8. 5. 2009. 
  10. ^ а б „New Bulldozer and Piledriver Instructions” (PDF). AMD. Приступљено 25. 7. 2013. 
  11. ^ „Software Optimization Guide for AMD Family 15h Processors” (PDF). AMD. Приступљено 19. 4. 2012. 
  12. ^ „Intel Architecture Instruction Set Extensions Programming Reference” (PDF). Intel. Приступљено 25. 7. 2013. 
  13. ^ Gopalasubramanian, G - [PATCH] add znver1 processor
  14. ^ Pawar, Amit - [PATCH] Remove CpuFMA4 From Znver1 CPU Flags
  15. ^ а б Latif, Lawrence (14. 11. 2011). „AMD Bulldozer only FMA4 and XOP instructions are supported by GCC Intel still mute”. The Inquirer. Архивирано из оригинала 17. 11. 2011. г. Приступљено 05. 06. 2016. 
  16. ^ „FMA4 Intrinsics Added for Visual Studio 2010 SP1”. 
  17. ^ „EKOPath man doc”. Архивирано из оригинала 23. 06. 2016. г. Приступљено 05. 06. 2016. 
  18. ^ „LLVM 3.1 Release Notes”.