FMA (set di istruzioni)
Il set di istruzioni FMA è un'estensione delle istruzioni a 128 e 256 bit per le estensioni Streaming SIMD Extensions dell'Instruction set dei microprocessori x86 per eseguire operazioni FMA (Fused Multily-add).[1] Ci sono due varianti:
- FMA4 è supportato nei processori AMD a partire dall'architettura Bulldozer. FMA4 è stato realizzato in hardware prima di FMA3.
- FMA3 è supportato nei processori AMD a partire dall'architettura Piledriver e Intel a partire dai processori Haswell e Broadwell dal 2014.
Nuove istruzioni
Le istruzioni FMA3 e FMA4 hanno funzionalità quasi identiche ma non sono compatibili. Entrambe contengono istruzioni fused multiply–add (FMA) per operazioni SIMD e scalari in virgola mobile, ma le istruzioni FMA3 hanno tre operandi mentre quelle FMA4 ne hanno quattro. L'operazione FMA ha la forma d = round (a · b + c) dove la funzione round esegue un arrotondamento per consentire al risultato di adattarsi al registro di destinazione se ci sono troppi bit significativi per adattarsi alla destinazione.
La forma a quattro operandi (FMA4) permette a, b, c e d di essere quattro diversi registri, mentre la forma a tre operandi (FMA3) richiede che d sia lo stesso registro di a, b o c. La forma a tre operandi rende il codice più breve e l'implementazione hardware leggermente più semplice, mentre la forma a quattro operandi fornisce maggiore flessibilità di programmazione.
Si veda il set di istruzioni XOP per ulteriori discussioni sui problemi di compatibilità tra Intel e AMD.
Set di istruzioni FMA3
CPU con FMA3
- AMD
- AMD ha introdotto il supporto FMA3 nei processori a partire con l'architettura Piledriver per motivi di compatibilità.[2][3] I processori APU di seconda generazione basati su istruzioni FMA3 "Trinity" (32 nm) sono stati lanciati il 15 maggio 2012. I processori Bulldozer di seconda generazione con core Piledriver che supportano le istruzioni FMA3 sono stati lanciati il 23 ottobre 2012.
- Intel
- Intel ha introdotto l'hardware FMA3 nei processori basati su Haswell nel corso del 2013.
Estratto da FMA3
Mnemonico (AT&T) | Operandi | Operazione |
---|---|---|
VFMADD132PDy | ymm, ymm, ymm/m256 | a = a·c + b |
VFMADD132PSy | ||
VFMADD132PDx | xmm, xmm, xmm/m128 | |
VFMADD132PSx | ||
VFMADD132SD | xmm, xmm, xmm/m64 | |
VFMADD132SS | xmm, xmm, xmm/m32 | |
VFMADD213PDy | ymm, ymm, ymm/m256 | a = b·a + c |
VFMADD213PSy | ||
VFMADD213PDx | xmm, xmm, xmm/m128 | |
VFMADD213PSx | ||
VFMADD213SD | xmm, xmm, xmm/m64 | |
VFMADD213SS | xmm, xmm, xmm/m32 | |
VFMADD231PDy | ymm, ymm, ymm/m256 | a = b·c + a |
VFMADD231PSy | ||
VFMADD231PDx | xmm, xmm, xmm/m128 | |
VFMADD231PSx | ||
VFMADD231SD | xmm, xmm, xmm/m64 | |
VFMADD231SS | xmm, xmm, xmm/m32 |
Set di istruzioni FMA4
CPU con FMA4
- AMD
- Processori per "lavori pesanti"
- Bulldozer, processore base, è stato lanciato il 12 ottobre 2011[4]
- Piledriver, processore base[5]
- Steamroller, processore base
- Excavator, processore base (incluso "v2")
- Zen: i test di WikiChip mostrano che FMA4 sembra ancora funzionare (alle condizioni dei test) nonostante non sia ufficialmente supportato e nemmeno riportato da CPUID. Questo è stato confermato anche da Agner,[6] ma altri test hanno dato risultati errati.[7] Il sito web ufficiale AMD ha pubblicato una nota di supporto per FMA4 indicando come processori compatibili gli ZEN= AMD ThreadRipper 1900x, R7 Pro 1800, 1700, R5 Pro 1600, 1500, R3 Pro 1300, 1200, R3 2200G, R5 2400G[8][9][10]
- Processori per "lavori pesanti"
- Intel
- Non è certo che i futuri processori Intel supporteranno FMA4, a causa dell'annunciato cambiamento di Intel in FMA3.
Estratto da FMA4
Mnemonico (AT&T) | Operandi | Operazione |
---|---|---|
VFMADDPDx | xmm, xmm, xmm/m128, xmm/m128 | a = b·c + d |
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 |
Storia
L'incompatibilità tra FMA3 di Intel e FMA4 di AMD è dovuta al fatto che entrambe le aziende cambiano i piani senza coordinare tra loro i dettagli di codifica. AMD ha cambiato i suoi piani da FMA3 a FMA4 mentre Intel ha cambiato i suoi da FMA4 a FMA3 quasi contemporaneamente. La storia può essere riassunta come segue:
- Agosto 2007: AMD annuncia il set di istruzioni SSE5, che include istruzioni per 3 operandi e FMA. Viene introdotto un nuovo schema di codifica (DREX) per consentire alle istruzioni di avere tre operandi[11]
- Aprile 2008: Intel annuncia i set di istruzioni AVX e FMA, comprese le istruzioni per l'uso a 4 operandi e FMA. La codifica di queste istruzioni utilizza il nuovo schema di codifica VEX,[12] che è più flessibile dello schema DREX di AMD
- Dicembre 2008: Intel cambia le specifiche per le istruzioni FMA da 4 operandi a 3 operandi. Lo schema di codifica VEX è ancora in uso[13]
- Maggio 2009: AMD cambia le specifiche delle istruzioni FMA dal modulo 3-operandi DREX al modulo 4-operandi VEX, compatibile con le specifiche Intel dell'aprile 2008 piuttosto che con le specifiche Intel del dicembre 2008[2]
- Ottobre 2011: il processore AMD Bulldozer supporta FMA4[5]
- Gennaio 2012: AMD annuncia il supporto di FMA3 nei futuri processori Trinity e Vishera, che si basano sull'architettura Piledriver[14]
- Maggio 2012: il processore AMD Piledriver supporta sia FMA3 che FMA4[5]
- Giugno 2013: il processore Intel Haswell supporta FMA3[15]
- Febbraio 2017: la prima generazione di processori AMD Ryzen supporta ufficialmente FMA3, ma non FMA4 secondo le istruzioni della CPUID.[16] C'è stata confusione riguardo al fatto che FMA4 sia stato implementato o meno su questo processore a causa di errori nella patch iniziale del pacchetto GNU Binutils che da allora è stato corretto.[17][18] Secondo alcuni test le istruzioni di FMA4 sembrano funzionare, anche se possono dare risultati errati.[7] Inoltre, le CPU Ryzen iniziali potrebbero andare in crash a causa di una particolare sequenza di istruzioni FMA3. Da allora è stato risolto con un aggiornamento del mcrocode della CPU.[19]
Compilatori e assemblatori supportati
Diversi compilatori forniscono diversi livelli di supporto per FMA4:
- GCC supporta FMA4 con -mfma4 dalla versione 4.5.0[20] e FMA3 con -mfma dalla versione 4.7.0
- Microsoft Visual C++ 2010 SP1 supporta l'istruzione FMA4[21]
- Microsoft Visual C++ 2012 supporta le istruzioni FMA3 (se il processore supporta anche l'estensione del set di istruzioni AVX2)
- Microsoft Visual C++ 2013
- Microsoft Visual C++ 2015
- Microsoft Visual C++ 2017
- PathScale supporta FMA4 con -mfma[22]
- LLVM 3.1 aggiunge il supporto FMA4,[23] insieme al supporto preliminare FMA3[24]
- Open64 5.0 aggiunge "supporto limitato"
- I compilatori Intel supportano solo le istruzioni FMA3[20]
- NASM supporta le istruzioni FMA3 dalla versione 2.03 e le istruzioni FMA4 dalla versione 2.06
- Yasm supporta le istruzioni FMA3 dalla versione 0.8.0 e le istruzioni FMA4 dalla versione 1.0.0.0
- FASM supporta sia le istruzioni FMA3 che FMA4
Note
- ^ (EN) George (Prime95) Woltmann, Intel AVX and GIMPS, su Mersenne Forum, Great Internet Mersenne Prime Search (GIMPS) project. URL consultato il 18 ottobre 2018.
- ^ a b (EN) Dave Christie, Striking a Balance, su developer.amd.com, AMD, 6 maggio 2009. URL consultato il 18 ottobre 2018 (archiviato dall'url originale il 9 novembre 2013).
- ^ (EN) Robin Maffeo, AMD and the Visual Studio 11 Beta, su developer.amd.com, AMD, 1º marzo 2012. URL consultato il 18 ottobre 2018 (archiviato dall'url originale il 9 novembre 2013).
- ^ (EN) AMD64 Architecture Programmer’s Manual Volume 6:128-Bit and 256-Bit XOP and FMA4 Instructions (PDF), su amd.com, vol. 6, AMD, novembre 2009. URL consultato il 18 ottobre 2018.
- ^ a b c (EN) Brent Hollingsworth, New “Bulldozer” and “Piledriver” Instructions (PDF), su developer.amd.com, AMD, ottobre 2012. URL consultato il 18 ottobre 2018.
- ^ (EN) Agner, Test results for AMD Ryzen, su Agner's CPU blog, 2 maggio 2017. URL consultato il 18 ottobre 2018.
- ^ a b (EN) Ryzen has undocumented support for FMA4, su Reddit. URL consultato il 18 ottobre 2018.
- ^ (EN) FMA4 CPU Results, su products.amd.com, AMD. URL consultato il 18 ottobre 2018.
- ^ (EN) AMD Ryzen™ 5 2400G, su products.amd.com, AMD. URL consultato il 18 ottobre 2018.
- ^ (EN) AMD Ryzen™ 3 2200G, su products.amd.com, AMD. URL consultato il 18 ottobre 2018.
- ^ (EN) 128-Bit SSE5 Instruction Set, su developer.amd.com, AMD. URL consultato il 18 ottobre 2018 (archiviato dall'url originale il 15 gennaio 2008).
- ^ (EN) Intel® Advanced Vector Extensions Programming Reference (PDF), su softwarecommunity.intel.com, Intel, marzo 2008 (archiviato dall'url originale il 7 agosto 2011).
- ^ (EN) ISA Extensions Intel AVX, su software.intel.com, Intel. URL consultato il 18 ottobre 2018.
- ^ (EN) Software Optimization Guide for AMD Family 15h Processors (PDF), su support.amd.com, AMD, gennaio 2012. URL consultato il 18 ottobre 2018 (archiviato dall'url originale l'11 maggio 2012).
- ^ (EN) Intel Architecture Instruction Set Extensions Programming Reference (PDF), su software.intel.com, Intel, luglio 2013. URL consultato il 18 ottobre 2018 (archiviato dall'url originale il 29 settembre 2013).
- ^ (EN) Agner Fog, The microarchitecture of Intel, AMD and VIA CPUs (PDF), su agner.org, 15 settembre 2018. URL consultato il 18 ottobre 2018.
- ^ (EN) [PATCH] add znver1 processor, su Sourceware, 10 marzo 2015. URL consultato il 18 ottobre 2018.
- ^ (EN) [PATCH] Remove CpuFMA4 From Znver1 CPU Flags, su Sourceware, 7 agosto 2015. URL consultato il 18 ottobre 2018.
- ^ (EN) AMD Ryzen Machine Crashes to a Sequence of FMA3 Instructions, in TechPowerUp, 16 marzo 2017. URL consultato il 18 ottobre 2018.
- ^ a b (EN) Lawrence Latif, AMD Bulldozer only FMA4 and XOP instructions are supported by GCC | TheINQUIRER, in The Inquirer, 14 novembre 2011. URL consultato il 18 ottobre 2018 (archiviato dall'url originale il 18 ottobre 2018).
- ^ (EN) FMA4 Intrinsics Added for Visual Studio 2010 SP1, su docs.microsoft.com, Microsoft, 2 aprile 2013. URL consultato il 18 ottobre 2018.
- ^ (EN) EKOPath man doc, su pathscale.com. URL consultato il 18 ottobre 2018 (archiviato dall'url originale il 25 maggio 2012).
- ^ (EN) LLVM 3.1 Release Notes, su releases.llvm.org. URL consultato il 18 ottobre 2018.
- ^ (EN) Enable detection of AVX and AVX2 support through CPUID. Add AVX/AVX2 to corei7-avx, core-avx-i, and core-avx2 cpu names, su llvm.org. URL consultato il 18 ottobre 2018 (archiviato dall'url originale il 26 luglio 2014).
V · D · M | |
---|---|
SIMD (RISC) | Alpha (MVI) · ARM (NEON · SVE) · MIPS (MDMX · MIPS-3D · MXU · MIPS SIMD) · PA-RISC (MAX) · Power ISA (VMX) · SPARC (VIS) |
SIMD (x86) | MMX (1996) · 3DNow! (1998) · SSE (1999) · SSE2 (2001) · SSE3 (2004) · SSSE3 (2006) · SSE4 (2006) · |
Manipolazione dei bit | BMI (ABM: 2007, BMI1: 2012, BMI2: 2013, TBM: 2012) · ADX (2014) |
Istruzioni compresse | Thumb · MIPS16e ASE |
Sicurezza e crittografia | AES-NI (2008); 32 e 64 bit ARMv8 ha anche istruzioni AES · CLMUL (2010) · RdRand (2012) · SHA (2013) · MPX (2015) · SGX (2015) |
Memoria transazionale | TSX (2013) · ASF |
Virtualizzazione | VT-x (2005) · AMD-V (2006) |
Le estensioni non più utilizzate sono |
![](http://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Computer_n_screen.svg/24px-Computer_n_screen.svg.png)