私とマルチメディアVIDEO-ITを取り巻く市場と技術MXFラボ

TOP
TOP > MPEGラボ > 第12回

WinPCLabs これでわかった!動画の秘密“MPEG”

2002年7月号掲載

第12回 MPEGエンコードが速くなるPentium4のSSE2命令の実力

SSE2命令は、Pentium 4で拡張された命令群だ。3次元グラフィックスやデジタルビデオなどの処理の高速化を目的としている。SSE2命令では、1命令で同様の複数のデータを計算することで高速化を図っている。

IntelのCPUには、オリジナルのx86命令をベースにしたもののほかに、「MMX」「SSE」「SSE2」と呼ばれる拡張命令がある。MMX命令は、Pentium MMX、Pentium Proで実装された命令群だ。浮動小数点用のレジスターを整数計算に使えるようにし、1命令で複数のデータに同じ計算(SIMD:Single Instruction,Multiple Data)を実行する。繰り返し処理の一部を並列に実行することで、処理を高速化する。

SSE命令は、Pentium IIIでMMX命令を拡張した命令群。整数計算だけでなく浮動小数点数の計算も並列処理できるようにするためのものだ。MMXでは何かと制約が多かったレジスターも増え、長さも拡張されており、並列処理できる範囲が広がった。SSE2命令は、Pentium 4でさらに拡張された命令群で、SSEに命令を追加し、16バイト(128ビット)単位で、一括処理できるようになっている。

同様の拡張命令にAMDの「3D Now!」がある。3D Now!は拡張され、Athron XPでは「3D Now! Professional」という名称になりSSE相当+αの機能を持っている。以下、MMX、SSE、SSE2、3D Now!などの拡張命令を総称して、SIMD拡張と呼ぶことにする。

では、SIMD拡張でどういった処理が高速化できるのだろうか。これらの拡張命令で高速化できる処理は限定される。行列計算のように同じ演算を同時に複数の要素に対して行う場合にのみ有効だ。つまり並列性を持つ処理ということになる。並列処理で計算できるといっても、同時に並列処理できるのはせいぜい数個なため、要素数が大きな場合は、うまく分割して処理する必要がある。また、並列処理するデータは1ヵ所にまとめて存在しなくてはならない。

このように、SIMD拡張には制約が多い。具体的に高速化できる用途は、以下のようなものだ。

 ・3次元グラフィックス
 ・ビデオ、オーディオの圧縮・伸長
 ・ビデオ、オーディオのフィルタ処理
 ・音声認識
 ・暗号化

■MPEGエンコードではDCT計算に大きく寄与

ソフトウェアMPEGエンコーダのいくつかは、SSE2命令に対応することで高速化している。実際にどの処理をSSE2命令に対応させているかは、エンコーダごとに異なるため、ここでは一般論を述べる。

MPEGエンコード処理の中で、SSE2命令が有効なのは、主にDCT(離散コサイン変換)計算、逆DCT計算、動き探索(Motion Estimation)処理、動き補正(Motion Compensation)の4点だ。エンコード前段階のフィルタ処理にも有効な場合がある。

DCT計算はJPEG、MPEGに共通の処理で、画像中の高い周波数成分、つまり細かな部分を除去し、情報量を減らす。エンコード時には、画像を8×8ピクセルのブロックと呼ばれる要素に分け、ブロックごとにDCT計算を行う。DCT計算は、掛け算と足し算の繰り返し処理となる。DCTを使った圧縮処理の原理は図1のようなものだ。DCT計算の結果、ブロックごとに64個の数値が得られる。

64個の数値は画像を再構成するために重要な順に規則的に並べることができる。周波数成分の低い部分が重要で、高い部分は重要でないという判断だ。周波数の高い部分を省略すると、画像としてはぼやけてくる。圧縮時は、圧縮率にあわせて、重要度の低い数値を捨てる。圧縮率を高くしたい場合は、情報量をより減らす必要があるためたくさん捨てることになり、圧縮率が低くて良い場合は、多くの数値を残す。DCT計算は、ブロックごとに独立して計算すればよい。このため、並列化しやすい。

多くのソフトウェアMPEGエンコーダでは、MMX命令を使った高速化は最初から実装済と考えてよい。SSE2命令を使うことで、さらに高速化できる。これは、SSE2で128ビット幅のレジスタが使えるようになったことが貢献する。

逆DCT計算は、DCT計算の逆の処理を行い、DCT計算の結果から元の画像を復元する計算だ。つまりデコード処理の一環だが、エンコード時にも必要な計算だ。DCT計算と同様に、掛け算と足し算の繰り返し処理となり、一般にはMMX命令を使って高速化されている。SSE2命令を使うことで、さらに高速化が可能となる。

■MPEGエンコードの動き検索処理も速くなる

これまでにも何度か書いたように、MPEGではフレーム間の差分を計算することで、圧縮率を上げている。差分のデータ量を減らすために、動きベクトルと呼ばれる技術を採用している。動きベクトルは、画面上の物体が別の場所に移動したことを検出して、その移動量を記録する。エンコード時には、何がどこに移動したかを調べなくてはならない。

どうやって調べるかは、MPEG規格では規定されておらず、エンコーダの工夫に任されている。単純な処理では、16×16ピクセルのマクロブロックと呼ばれる単位で、そのブロックがどう移動しかたを1ピクセルずつずらしながら、しらみつぶしに調べることになる。類似度を計算し、類似度が一番高い点を移動先とする。

MPEG-2で解像度が720×480ドットの場合、マクロブロックは全部で1,350個に達する。この1つずつについて調べるため、全体の計算量は膨大なものになる。動き探索は、MPEGエンコード処理の中で、一番計算量が多いといってよい。

画面の隅から隅までを探索する場合を全探索と呼ぶ。全探索すると、大変な量の計算になるため、ソフトウェアエンコーダでは計算量を減らすよう工夫している。普通の映像では前後のフレームでの物体の移動量は大きくないため、マクロブロックの周囲に限定して調べることにして、計算量を減らすことが多い。

類似度の計算は、16×16ピクセル同士の差の絶対値の合計をとる計算だ。SSEで拡張された命令を使うと、この計算が高速化できる。特に絶対値を求める処理は、普通にプログラムすると分岐命令が必要となり、処理速度低下の原因となるが、このSSEの命令を使うと分岐命令なしで実現できる。

SSE2により、どのくらいMPEGエンコード処理が高速化されるか、複数のエンコーダで実測した。どのエンコーダでも、SSEを使った場合から10%〜15%程度の向上に留まった。これは、メモリーアクセスのオーバーヘッドが原因だ。動き検索処理では、1ピクセルごとに対象領域をずらしながら類似度を計算していくが、このため、Pentium 4で高速に処理できる16バイト単位のメモリー境界をまたがった読み込みが必要となる。ここに時間がかかってしまうのが、期待したほどに高速化されない原因と考えられる。

  汎用レジスタ 命令内容
MMX MMX(64ビット) X 8 整数演算(MMX レジスター)
SSE MMX(64ビット) X 8
XMM(128ビット) X 8
整数演算(MMX レジスター)
浮動小数点演算(XMM レジスター、32ビット X 4)
SSE2 MMX(64ビット) X 8
XMM(128ビット) X 8
整数演算(MMX レジスター、XMMレジスター)
浮動小数点演算(XMM レジスター、32ビット X 4、64ビット X 2)
3D Now! MMX(64ビット) X 8 整数演算(MMX レジスター)
浮動小数点演算(XMM レジスター、32ビット X 2)

表1 拡張命令の比較。MMXでは何かと制約が多かったレジスターが増え、長さも拡張されてきている。

図1 DCT計算の原理。8個の波形の合成で元の波形をあらわすように計算で分解し、x1〜x8を求める。圧縮率を高める場合は、x8から逆順に省略する。

 

(文/ 竹松 昇、(株)朋栄アイ・ビー・イー) ※編集の関係上、雑誌掲載内容と少し異なる個所があります。

製品・システム・技術に関するお問い合わせ