積和演算
積和演算 (せきわえんざん) は、演算のひとつで、積の和を求める、つまり乗算の結果を順次加算する演算である。乗累算 (じょうるいざん) とも言う。MAD/MADD (multiply-add) もしくは MAC/MACC (multiply-accumulate) と呼ばれることもある。演算式は以下のように表される。
a ← a + b × c {\displaystyle a\leftarrow a+b\times c}
積和演算はデジタル信号処理において非常に多く使用される演算で、デジタルシグナルプロセッサでは積和算命令を1クロックで実行できる専用の演算回路を持つ。また、1秒間にこの積和演算を何回実行できるか、がプロセッサの性能指標として使われることもある。
なお、和ではなく差を用いる場合は、積差演算(multiply-subtract)と呼ばれる。
a ← a − b × c {\displaystyle a\leftarrow a-b\times c}
積和演算はドット積の計算に現れる。ベクトル v {\displaystyle {\boldsymbol {v}}} と w {\displaystyle {\boldsymbol {w}}} のドット積は「アキュムレータ y {\displaystyle y} に対し要素の積 v i × w i {\displaystyle v_{i}\times w_{i}} を足し込む」という積和演算を要素分繰り返すことで得られる。行列積(GEMM)の各要素は行と列のドット積で計算されるため、行列積は積和演算の集まりと言える。
積和の演算式において、途中の積算 b × c {\displaystyle b\times c} の演算結果を浮動小数点数の値としていったん丸めてしまうと、最終演算結果に大きな誤差が発生する。途中の積算を丸めず、積和演算を1命令で行なってしまうことで、最終演算結果の誤差を小さくするのが融合積和演算 (fused multiply-add, FMA/FMAD) である。FMAはIEEE 754規格の2008年改訂版 (IEEE 754-2008) で標準化されている。
CPUでは、HPのPA-RISC、IBMのメインフレームコンピュータ3090のVF拡張、IBMのPowerプロセッサ、インテルのItaniumプロセッサ、インテルx86系プロセッサの拡張命令であるFMA命令セット、ARMの拡張命令であるVFPv4やNEONv2で、このFMA命令が実装されている。CPUやDSPに限らず、GPU(NVIDIA製やAMD製やインテル製など)でもFMA命令がサポートされている。