close
Vai al contenuto

FMA (set di istruzioni)

Da Wikipedia, l'enciclopedia libera.

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 Multiply-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

[modifica | modifica wikitesto]

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

[modifica | modifica wikitesto]
  • 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

[modifica | modifica wikitesto]
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

[modifica | modifica wikitesto]
  • AMD
    • Processori per "lavori pesanti"
    • 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]
  • Intel
    • Non è certo che i futuri processori Intel supporteranno FMA4, a causa dell'annunciato cambiamento di Intel in FMA3.

Estratto da FMA4

[modifica | modifica wikitesto]
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

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

[modifica | modifica wikitesto]

Diversi compilatori forniscono diversi livelli di supporto per FMA4:

  1. (EN) George (Prime95) Woltmann, Intel AVX and GIMPS, su Mersenne Forum, Great Internet Mersenne Prime Search (GIMPS) project. URL consultato il 18 ottobre 2018.
  2. 1 2 (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).
  3. (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).
  4. (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.
  5. 1 2 3 (EN) Brent Hollingsworth, New “Bulldozer” and “Piledriver” Instructions (PDF), su developer.amd.com, AMD, ottobre 2012. URL consultato il 18 ottobre 2018.
  6. (EN) Agner, Test results for AMD Ryzen, su Agner's CPU blog, 2 maggio 2017. URL consultato il 18 ottobre 2018.
  7. 1 2 (EN) Ryzen has undocumented support for FMA4, su Reddit. URL consultato il 18 ottobre 2018.
  8. (EN) FMA4 CPU Results, su products.amd.com, AMD. URL consultato il 18 ottobre 2018.
  9. (EN) AMD Ryzen™ 5 2400G, su products.amd.com, AMD. URL consultato il 18 ottobre 2018.
  10. (EN) AMD Ryzen™ 3 2200G, su products.amd.com, AMD. URL consultato il 18 ottobre 2018.
  11. (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).
  12. (EN) Intel® Advanced Vector Extensions Programming Reference (PDF), su softwarecommunity.intel.com, Intel, marzo 2008 (archiviato dall'url originale il 7 agosto 2011).
  13. (EN) ISA Extensions Intel AVX, su software.intel.com, Intel. URL consultato il 18 ottobre 2018.
  14. (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).
  15. (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).
  16. (EN) Agner Fog, The microarchitecture of Intel, AMD and VIA CPUs (PDF), su agner.org, 15 settembre 2018. URL consultato il 18 ottobre 2018.
  17. (EN) [PATCH] add znver1 processor, su Sourceware, 10 marzo 2015. URL consultato il 18 ottobre 2018.
  18. (EN) [PATCH] Remove CpuFMA4 From Znver1 CPU Flags, su Sourceware, 7 agosto 2015. URL consultato il 18 ottobre 2018.
  19. (EN) AMD Ryzen Machine Crashes to a Sequence of FMA3 Instructions, in TechPowerUp, 16 marzo 2017. URL consultato il 18 ottobre 2018.
  20. 1 2 (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).
  21. (EN) FMA4 Intrinsics Added for Visual Studio 2010 SP1, su docs.microsoft.com, Microsoft, 2 aprile 2013. URL consultato il 18 ottobre 2018.
  22. (EN) EKOPath man doc, su pathscale.com. URL consultato il 18 ottobre 2018 (archiviato dall'url originale il 25 maggio 2012).
  23. (EN) LLVM 3.1 Release Notes, su releases.llvm.org. URL consultato il 18 ottobre 2018.
  24. (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).
  Portale Informatica: accedi alle voci di Wikipedia che trattano di Informatica