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

[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. ^ 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).
  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. ^ 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.
  6. ^ (EN) Agner, Test results for AMD Ryzen, su Agner's CPU blog, 2 maggio 2017. URL consultato il 18 ottobre 2018.
  7. ^ a b (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. ^ 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).
  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