ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
積の和を求める演算。つまり、二つの値の積を累算中の値に加算する演算。
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と呼んでいる。
SuperHなど汎用のプロセッサーでも、積和演算器が組み込まれた製品がある。こういったプロセッサーでは汎用レジスターよりも大きな値を扱う必要があるため、積和演算レジスターとして、専用にレジスターを持っていることが多い。
SuperHの場合は2つの汎用レジスターで16または32ビットの値二つのポインターを示して使う。積和演算レジスターは一つしかないので指定する必要が無い。例えば次のようになる。
MAC.L @R0+,@R1+
演算終了後、レジスターは自動で増分される。このため、メモリー上に連続してデータを用意しておけば、連続して命令を実行することができる。
SuperHの場合は汎用レジスターが32ビット、積和演算レジスターは64ビットなので、積和演算レジスターの上位・下位32ビットごとに分けて、汎用レジスターやメモリーに複写する命令が存在する。
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という積差演算の命令が搭載された。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます