MMX
読み:エムエムエックス
外語:MMX: Multi Media eXtension

 1997(平成9)年にIntelが発表したマルチメディア命令で、マルチメディア系のデータ処理に適した機能をマイクロプロセッサーに取り込む技術。及びそれにより追加された命令の仕様。
目次

概要

機能
 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命令を使用した場合、次のような動作をする。
 MMX命令を使用後、x87 FPU命令を使用するためには、FPUレジスターが利用できる状態に戻す必要があり、このための命令がemms命令である。emms命令はタグフィールドを11B(有効)に設定する。

新命令
 MMXでは57命令が追加された。ニーモニックのルールは次の通りである。
 また、SSE2からは、XMMレジスターに対しても可能。
 MMXで追加された新命令は、次の通りである。

再検索