積和演算

読み:せきわえんざん
外語: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という積差演算の命令が搭載された。

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club