SIMD 実装

ビデオデコーダーの実用的な実装においては、処理するデーター量が非常に大きいため、 効率的な実装が不可欠である。

一般にビデオデコーダーの実装では、複数のデーターに対して同一の処理を繰り返すという 処理が多いため、SIMD (Single Instruction Multiple Data) 機能の活用が効果的である。

Intel アーキテクチャー (x86) のプロセッサーでは、SIMD 命令体系として、 MMX, SSE, SSE2, SSE3, SSE4 というテクノロジーが実装されている。

MMX は、64 bit 整数データーを扱う拡張命令で、現在使用されているほとんどのプロセッサー で使用できる。そのため、適用範囲の広い応用で、活用されている。

SSE は、128 bit (32 bit 実数 x 4) のデーターを扱う拡張命令で、Pentium III 以降の プロセッサーで使用できる。実数演算のみを扱うため、整数演算の多いビデオデコーダーでは、 活用範囲が限られる。

SSE2 は、SSE で実数しか扱えなかったものを、整数も扱えるようにした拡張命令で、Pentium 4 以降 のプロセッサーで使用できる。Intel 純正プロセッサーのみでなく、AMD 等互換プロセッサーでも 広く実装されているので、現在では、非常に実用度の高い機能であるといえる。

SSE3 以降のテクノロジーは、Intel の近年の純正プロセッサーに搭載されているもので、インストール ベースを考慮すると、全面的に活用を行うには、適用範囲が限られてしまうかもしれない。

本ライブラリーでは、実用度を鑑み SSE2 相当の命令セットを使用した、SIMD ルーティンの実装を行う。

Compiler Intrinsics

SIMD 拡張命令の使用方法としては、アセンブリープログラミングが一般的だが、x86 では、アセンブリー 命令の使用に必要なレジスターの数が、8つと少なく、レジスターのやり繰りに非常に苦労する。

そこで、レジスターの割り当てをコンパイラーの最適化アルゴリズムに任せて、コンパイラーの組み込み 関数として、SIMD 命令を使用できるようにしたのが、Compiler Intrinsics である。

コンパイラーの生成コードは、熟達したコーダーの最適化されたコーディングに及ばない部分もある。 が、そのようなコードは、ほぼ解読、保守不能となるため、些少なパフォーマンスロスを気にしなければ、 Compiler Intrinsics は、アセンブリーレベルの最適化コードを記述する有力なツールである。

実装の詳細

iDCT の SSE2 実装

動き補償の SSE2 実装

Loop Filter の SIMD 実装