積和演算
読み:せきわえんざん
外語:MAC: Multiply and ACcumulation

 を求める演算。つまり、二つの値の積を累算中の値に加算する演算。
目次

概要
 DSPの得意とする処理であり、かつ信号処理では必須の処理となる。
 積和演算は、式で書くと、次のようになる。
 a ← b + (c × d)
 このままだと4項演算だが、aとbを同じにして3項演算とし、累算に特化した実装も多い。
 a ← a + (b × c)
 極めて単純明快な演算ではあるが、この演算速度が信号処理における最大の律速要因になり、信号処理速度そのものを決めてしまうので侮れない。
 この積和演算速度を表わすために、MMACS(メガ積和演算/秒)やGMACS(ギガ積和演算/秒)といった単位も存在するほどである。
 従って、全てのDSPには汎用のMPUにはない高速乗算器とともに積和演算器が搭載され、積和演算命令(MAC命令)が用意されている。これにより、ほぼ全てのDSPはこの演算を1命令サイクルで実行するのである。

特徴

呼称
 一般的には、Multiply and ACcumulationからMACという。
 Intelは、Fused Multiply addからFMAと呼んでいる。

DSPの場合
 DSPでも様々な実装があり、それぞれに特徴がある。一般的には、ニーモニックで次のように書くことが多いようではある。
 MAC A,B,SUM
 AとBが二つの値で、SUMが累算する積和演算レジスターである。
 積和演算レジスターが一つしかないようなDSPの場合は、これは省略されることになるだろう。

SuperHの場合
 SuperHなど汎用のプロセッサーでも、積和演算器が組み込まれた製品がある。こういったプロセッサーでは汎用レジスターよりも大きな値を扱う必要があるため、積和演算レジスターとして、専用にレジスターを持っていることが多い。
 SuperHの場合は2つの汎用レジスターで16または32ビットの値二つのポインターを示して使う。積和演算レジスターは一つしかないので指定する必要が無い。例えば次のようになる。
 MAC.L @R0+,@R1+
 演算終了後、レジスターは自動で増分される。このため、メモリー上に連続してデータを用意しておけば、連続して命令を実行することができる。
 SuperHの場合は汎用レジスターが32ビット、積和演算レジスターは64ビットなので、積和演算レジスターの上位・下位32ビットごとに分けて、汎用レジスターやメモリーに複写する命令が存在する。

ARMの場合
 ARMも汎用のプロセッサーだが、組み込みを想定していることから、積和演算回路を搭載している。しかもARMの場合、4項演算が可能など、非常に贅沢な作りとなっている。
 MLA{<cond>}{S} Rd, Rm, Rs, Rn ; Rd = (Rm * Rs) + Rn
 UMLAL{<cond>}{S} RdLo, RdHi, Rm, Rs ; RdHi:RdLo += (Rm * Rs)
 SMLAL{<cond>}{S} RdLo, RdHi, Rm, Rs ; RdHi:RdLo += (Rm * Rs)
 MLAは、32ビットで演算し、結果を32ビットで返す命令である。
 UMLALとSMLALは、32ビット× 32ビットを実行し64ビットの整数に加算した結果を返す命令で、うちUは無符号、Sは符号付きを意味する。Sは、Rm, Rs, Rdの3値全てが符号ありとして扱われる。
 ちなみにARMv6T2以降には、MLSという積差演算の命令が搭載された。

再検索