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
- Интел
- Интел је започео хардверску реализацију FMA3 у процесорима почев од архитектуре Хасвелл у 2013. години.
- АМД
- Компанија АМД је са 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 инструкције.
Референце
|
|