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

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 POLYinstrukce 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ů:

Reference