Operace násobení - akumulace - Multiply–accumulate operation
V oblasti výpočetní techniky , zejména zpracování digitálního signálu , je operace násobení-akumulace ( MAC ) nebo násobení-přidání ( MAD ) běžným krokem, který vypočítá součin dvou čísel a přidá tento produkt do akumulátoru . Hardwarová jednotka, která provádí operaci, je známá jako multiplikátor – akumulátor ( jednotka MAC ); samotná operace se také často nazývá MAC nebo MAC operace. Operace MAC upravuje akumulátor a :
Když je hotovo s čísly s plovoucí desetinnou čárkou , může být provedeno se dvěma zaokrouhleními (typické pro mnoho DSP ) nebo s jedním zaokrouhlováním. Pokud se provádí s jediným zaokrouhlováním, nazývá se to fúzované násobení – přidání ( FMA ) nebo fúzované násobení – akumulace ( FMAC ).
Moderní počítače mohou obsahovat vyhrazený MAC, skládající se z multiplikátoru implementovaného v kombinační logice následovaného sčítačem a registrem akumulátoru, který ukládá výsledek. Výstup registru je přiváděn zpět na jeden vstup sčítače, takže v každém hodinovém cyklu je výstup multiplikátoru přidán do registru. Kombinační multiplikátory vyžadují velké množství logiky, ale dokážou vypočítat produkt mnohem rychleji než metoda řazení a přidávání typická pro dřívější počítače. Percy Ludgate byl první, kdo počal MAC ve svém analytickém stroji z roku 1909, a první, kdo využil MAC pro dělení (pomocí násobení nasazeného recipročně, prostřednictvím konvergentní řady (1+ x ) −1 ). Prvními moderními procesory, které byly vybaveny jednotkami MAC, byly procesory digitálního signálu , ale tato technologie je nyní běžná také u procesorů pro všeobecné použití.
V aritmetice s plovoucí desetinnou čárkou
Když je operace provedena s celými čísly , operace je obvykle přesná (vypočítaný modulo nějaký výkon dvou ). Nicméně, s plovoucí desetinnou čárkou čísla mají jen určité množství matematickou přesností . To znamená, že digitální aritmetika s pohyblivou řádovou čárkou obecně není asociativní ani distribuční . (Viz Plovoucí desetinná čárka § Problémy s přesností .) Proto je ve výsledku rozdíl, zda se násobení – přidání provádí se dvěma zaokrouhleními, nebo v jedné operaci s jediným zaokrouhlením (tavené násobení – přidání). IEEE 754-2008 uvádí, že musí být provedeno s jedním zaokrouhlováním, čímž se získá přesnější výsledek.
Fúzované násobení - přidejte
Kondenzovaný vícenásobně doplněk ( FMA nebo fmadd ) je s plovoucí desetinnou čárkou vícenásobně doplněk operace provedena v jednom kroku, s jedním zaoblením. To znamená, že tam, kde by nefúzované násobení – přidání vypočítalo součin b × c , zaokrouhlilo ho na N významných bitů, přidalo výsledek na a a zaokrouhlilo zpět na N významných bitů, fúzované násobení – přidání by vypočítalo celý výraz a + ( b × c ) s plnou přesností před zaokrouhlováním konečného výsledku dolů na N významných bitů.
Rychlá FMA může zrychlit a zlepšit přesnost mnoha výpočtů, které zahrnují akumulaci produktů:
- Tečkovaný produkt
- Násobení matice
- Polynomiální hodnocení (např. S Hornerovým pravidlem )
- Newtonova metoda pro hodnocení funkcí (z inverzní funkce)
- Konvoluce a umělé neuronové sítě
- Násobení dvojitou a dvojitou aritmetikou
Fúzované násobení – přidání se obvykle dá spolehnout na přesnější výsledky. Nicméně, William Kahan poukázal, že to může způsobovat problémy, pokud jsou použity bezmyšlenkovitě. Pokud je x 2 - y 2 vyhodnoceno jako (( x × x ) - y × y ) (podle Kahanovy doporučené notace, ve které nadbytečné závorky nasměrují kompilátor tak, aby nejprve zaokrouhlil ( x × x ) termín) pomocí fúzovaného násobení – přidání, pak výsledek může být negativní, i když x = y v důsledku prvního násobení, které zahodí bity nízké významnosti. To by pak mohlo vést k chybě, pokud se například vyhodnotí druhá odmocnina výsledku.
Když je implementován uvnitř mikroprocesoru , může být FMA rychlejší než operace násobení s následným přidáním. Standardní průmyslové implementace založené na původním návrhu IBM RS/6000 však vyžadují 2 N -bitový sčítač pro správné vypočítání částky.
Další výhodou zahrnutí této instrukce je, že umožňuje efektivní softwarovou implementaci operací dělení (viz algoritmus dělení ) a odmocniny (viz metody výpočtu odmocnin ), čímž se eliminuje potřeba vyhrazeného hardwaru pro tyto operace.
Tečkovaný návod k produktu
Některé stroje kombinují vícenásobné fúzní operace přidání do jednoho kroku, např. Provádění čtyřprvkového bodového produktu na dvou 128bitových registrech SIMDa0×b0 + a1×b1 + a2×b2 + a3×b3
s propustností jednoho cyklu.
Podpěra, podpora
Operace FMA je součástí IEEE 754-2008 .
Digital Equipment Corporation (DEC) VAX ‚s POLY
instrukce se používá pro vyhodnocení polynomů s pravidlem Hornera pomocí posloupnost násobit a přidat kroky. Popisy pokynů neurčují, zda se násobení a přidávání provádí pomocí jednoho kroku FMA. Tato instrukce je součástí sady instrukcí VAX od její původní implementace 11/780 v roce 1977.
Standardní 1999 v programovacím jazyce C podporuje fungování FMA přes fma()
standardní funkce matematická knihovna a standardní pragmas ( #pragma STDC FP_CONTRACT
) ovládající optimalizace založené na FMA.
Operace fused multiply – add byla v procesoru IBM POWER1 (1990) zavedena jako „multiply – add fused“ , ale od té doby byla přidána do mnoha dalších procesorů:
- HP PA-8000 (1996) a vyšší
- Hitachi SuperH SH-4 (1998)
- SCE - Toshiba Emotion Engine (1999)
- Intel Itanium (2001)
- STI Cell (2006)
- Fujitsu SPARC64 VI (2007) a novější
- ( Kompatibilní s MIPS ) Loongson -2F (2008)
- Elbrus-8SV (2018)
- Procesory x86 s instrukční sadou FMA3 a/nebo FMA4
- AMD Bulldozer (2011, pouze FMA4)
- AMD Piledriver (2012, FMA3 a FMA4)
- AMD Steamroller (2014)
- AMD Excavator (2015)
- AMD Zen (2017, pouze FMA3)
- Intel Haswell (2013, pouze FMA3)
- Intel Skylake (2015, pouze FMA3)
- Procesory ARM s VFPv4 a/nebo NEONv2:
- ARM Cortex-M4F (2010)
- ARM Cortex-A5 (2012)
- ARM Cortex-A7 (2013)
- ARM Cortex-A15 (2012)
- Qualcomm Krait (2012)
- Apple A6 (2012)
- Všechny procesory
ARMv8
- Fujitsu A64FX má „ čtyřoperandový FMA s předponou “.
- IBM z/Architecture (od roku 1998)
- GPU a desky GPGPU:
-
Advanced Micro Devices GPU (2009) a novější
- TeraScale 2 „Evergreen“ -série založená
- Grafické jádro další -založené
- GPU NVidia (2010) a novější
- GPU Intel od Sandy Bridge
- Intel MIC (2012)
- ARM Mali T600 Series (2012) a novější
-
Advanced Micro Devices GPU (2009) a novější
- Vektorové procesory: