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:

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]

CPU con FMA3

[modifica | modifica wikitesto]

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]

CPU con FMA4

[modifica | modifica wikitesto]

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

Storia

[modifica | modifica wikitesto]

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:

Compilatori e assemblatori supportati

[modifica | modifica wikitesto]

Diversi compilatori forniscono diversi livelli di supporto per FMA4:

Note

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