FMA скуп инструкција је проширење на 128 и 256-то битне инструкције Streaming SIMD Extensions у оквиру сета инструкција за x86 микропроцесор. FMA служи за истовремено обављање операција множења и сабирања."FMA3 and FMA4 are not instruction sets, they are individual instructions -- fused multiply add. Постоје две варијанте: 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 Интел Интел је започео хардверску реализацију FMA3 у процесорима почев од архитектуре Хасвелл у 2013. години. АМД Компанија АМД је са Piledriver архитектуром започела подршку FMA3 ради веће компатибилности. Друга генерација APU процесора заснованим на "Trinity" (32 nm), који су подржавали FMA3 је представљена 15. маја 2012. године. Друга генерација процесора Bulldozer језгрима који подржавају инструкциони сет FMA3 је представљена 23. октобра 2012. године.

Извод из FMA3 Мнемотехника (AT&T) Операнди ОперацијаVFMADD132PDyymm, ymm, ymm/m256 $0 = $0×$2 + $1VFMADD132PSyVFMADD132PDxxmm, xmm, xmm/m128VFMADD132PSxVFMADD132SDxmm, xmm, xmm/m64VFMADD132SSxmm, xmm, xmm/m32VFMADD213PDyymm, ymm, ymm/m256$0 = 1$×$0 + $2VFMADD213PSyVFMADD213PDxxmm, xmm, xmm/m128VFMADD213PSxVFMADD213SDxmm, xmm, xmm/m64VFMADD213SSxmm, xmm, xmm/m32VFMADD231PDyymm, ymm, ymm/m256$0 = 1$×2 $+ $0VFMADD231PSyVFMADD231PDxxmm, xmm, xmm/m128VFMADD231PSxVFMADD231SDxmm, xmm, xmm/m64VFMADD231SSxmm, xmm, xmm/m32

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

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

Извод из FMA4 Мнемотехника (at & т) Операнди ОперацијаVFMADDPDxxmm, xmm, xmm/m128, xmm/m128 $0 = 1$×2 $+ $3VFMADDPDyymm, ymm, ymm/m256, ymm/m256 VFMADDPSxxmm, xmm, xmm/m128, xmm/m128 VFMADDPSyymm, ymm, ymm/m256, ymm/m256 VFMADDSDxmm, xmm, xmm/m64, xmm/m64 VFMADDSSxmm, xmm, xmm/m32, xmm/m32

Историјат Некомпатибилност између Интеловог FMA3 и АМД-овог FMA4 се догодила зато што су обе компаније промениле план без међусобне координације у детаљима кода. Компанија АМД је променила своје планове из FMA3 у FMA4, док је Интел је променио своје планове из FMA4 у FMA3 у скоро исто време. Прича може се сажети на следећи начин: Август 2007. године: АМД најављује SSE5 скуп инструкција, који обухвата FMA инструкцију са 3 операнда. Нова шема кодирања (DREX) је представљена, омогућавајући инструкцијама да имају три операнда. Април 2008: Интел најављује њихове AVX и FMA скупове инструкција, укључујући FMA4 инструкције. Кодирање ових инструкција користи нове VEX шеме кодирања, које су флексибилније од АМД-ових DREX шема. Децембар 2008: Интел мења спецификацију својих FMA инструкција са оне са четири операнда, на инструкције са 3 операнда. VEX шема се и даље користи. Маја 2009: АМД мења спецификацију својих FMA упутстава са FMA3 DREX форме на FMA4 VEX облик, која је компатибилна са априлском спецификацијом Интела из 2008, уместо спецификације из децембра 2008. Октобар 2011: АМД Buldozer процесор подржава FMA4. Јануар 2012.: компанија АМД наговештава подршку FMA3 у будућим процесорима под називима Trinity и Vishera који су базирани на Piledriver архитектури. Маја 2012: АМД Piledriver процесор подржава FMA3, такође и FMA4. Јун 2013: Интел Haswell процесор подржава FMA3. Компанија АМД је открила да ће Zen, трећа генерација архитектуре x86-64, у свом првом издању (znver1 – Zen, верзија 1) престати да подржава FMA4 у закрпи за GNU Binutils пакет.Gopalasubramanian, G - [PATCH] add znver1 processor Испрва је постојала збуњеност, везана за то да ли ће FMA4 бити имплементиран или не, због грешака у првобитној закрпи, која је од тада поправљен.Pawar, Amit - [PATCH] Remove CpuFMA4 From Znver1 CPU Flags

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

Референце

Категорија:AMD