MMX
読み:エムエムエックス
外語:MMX: Multi Media eXtension
1997(平成9)年にIntelが発表した
マルチメディア命令
で、マルチメディア系のデータ処理に適した機能をマイクロプロセッサーに取り込む技術。及びそれにより追加された命令の仕様。
目次
概要
機能
機能の有無判別
特徴
発想
命令セット
用例
FPUとの切り換え
新命令
概要
機能
1命令で複数のデータをまとめて演算する
SIMD
命令セットを用意し、行列演算や
複素数
演算、多次元計算などを高速に行なうことができる。
また多量のデータを効率よく処理するためのパイプライン技術やキャッシュ技術などの性能向上も図られている。
機能の有無判別
機能の有無は、EAXレジスターに1を代入して
CPUID命令
を実行し、EDXレジスターに得られたフラグのビット23が1かどうかで確認できる。
特徴
発想
x86系プロセッサーには8087の時代から、
FPU
(数値演算コプロセッサー)用として80ビットの専用レジスターが用意されていた。しかし80ビットもあるにも関わらず、この機能は殆ど使われていなかった。
また、MMXを設計するにあたり、少なくとも64ビットの長さのレジスターが必要だった。
Pentium
は32ビットCPUなので、整数用レジスターは32ビットだが、これを64ビットに拡張するのは容易なことではない。
そこでIntelの技術者はFPUレジスターに目を付け、これを有効活用することにした。このため、MMX技術はFPU用のレジスターと共用となっており、同じ内部物理レジスターにマッピングされている。MMXでは、80ビットあるうちの64ビットを使用する。
命令セット
この機能を実現するために57個の新命令が追加された。
従来のラップアラウンド(桁溢れした時には溢れた部分が切り捨てられる)に加え、サチュレーション演算(=
飽和演算
; 飽和時は限界点である最大値や最小値が返される)という新しい算術演算も追加された。
これは色空間の変換などに有用であるが、命令セット自体が拡張されているものなので、この拡張命令を使用した専用のアプリケーションやドライバーを用意しない限り、殆ど性能向上の恩恵には預かれない。この辺の事情は数値演算コプロセッサー(FPU)と同様である。
用例
64ビット幅のMMXレジスターに8ビット×8、16ビット×4、32ビット×2、64ビット×1の何れかの整数値データを入れ、そのデータ全てに対して同じ演算を一度に行なうことができる。
例えば、256ドット×256ドットのフルカラー(RGB各8ビット)の画像を明るくしたい場合、RGBそれぞれに同じ値を足すことになる。
実際の演算のみで考えると、MMXが無い場合、演算回数は256×256×3=196,608回となるが、MMX命令を使えば8ビット×8のデータを1度の演算で処理することができるので、演算回数は256×256×3÷8=24,576回で済む。
その上、MMXには飽和演算があるため、最大値に補正する処理の分も更に速くなる。このようにMMXを駆使すれば2D/3Dグラフィック処理や、ソフトウェア
MPEG
再生処理を高速化することが可能である。
FPUとの切り換え
通常の
MMX Pentium
では数値演算コプロセッサー(FPU)と切り替えて利用するなどの仕様から、実数演算(FPU)を用いる処理と併用すると逆に効率が落ちることがあるという問題がある。
一方、AMD K6ではMMXの並列動作ができない代わり、実数演算(FPU)との並列動作を可能とした。K6-2から対応された
3DNow!
では、MMX命令の並列動作も可能としている。
Intelでは、MMX命令と
x87 FPU
命令は排他的に使用されるが、MMX命令を使用した場合、次のような動作をする。
浮動小数点のスタックポインタは、TOS=0になる
ST(0)〜ST(7)の内容が書き換えられる (mm0〜mm7と領域が重複するため)
全てのタグフィールドは、00B(無効)に設定される
MMX命令を使用後、x87 FPU命令を使用するためには、FPUレジスターが利用できる状態に戻す必要があり、このための命令がemms命令である。emms命令はタグフィールドを11B(有効)に設定する。
新命令
MMXでは57命令が追加された。ニーモニックのルールは次の通りである。
命令の最後のb、w、d、qはそれぞれ、byte、word、dword、qword
sは符号付き、usは符号なしの
飽和演算
。それ以外は
ラップアラウンド
また、
SSE2
からは、
XMMレジスター
に対しても可能。
MMXで追加された新命令は、次の通りである。
転送
movd
movq
加算
paddb
paddw
paddd
paddsb
paddsw
paddusb
paddusw
減算
psubb
psubw
psubd
psubsb
psubsw
psubusb
psubusw
乗算
pmull
pmulh
積和演算
pmadd
比較
pcmpeqb
pcmpeqw
pcmpeqd
pcmpgtpb
pcmpgtpw
pcmpgtpd
パック
packsswb
packssdw
packuswb
アンパック
punpckhbw
punpckhwd
punpckhdq
punpcklbw
punpcklwd
punpckldq
論理演算
pand
pandn
por
pxor
シフト
左に論理
psllw
pslld
psllq
右に論理
psrlw
psrld
psrlq
右に算術
psraw
psrad
FPUとの切り替え
emms
再検索