マルチプロセッサで実現したH.264ビデオ・デコーダ ――コンフィギャラブル・プロセッサのユーザ定義命令とオンチップ・バスを活用
● ユーザ定義のステートと命令で制御フローを高速化
XtensaがMMXなどのマルチメディア拡張命令を備えたプロセッサと大きく異なる点の一つは,制御フローを拡張命令で高速化できることです.CABACを例に示します.図12には,条件分岐やループが多数見られます.演算そのものは単純ですが,SIMDタイプの演算は不適格であるため,演算の並列度を上げて処理能力を高めるというMMX型のアプローチはとれません.条件が多いということは,プロセッサ・パイプラインにハザードを生じやすく,やっかいです.
Xtensaはユーザ定義のステート(状態)を設計できます.通常,プロセッサは,プログラム・カウンタをはじめ,GPR(general purpose register)のほかにいくつものステートを記憶しています.Xtensaでは,プロセッサが最初から持つステートのほかに,ユーザが独自のステートを定義できます.ユーザ定義のステートは,ユーザ定義の命令で参照・更新できます.ステートはダイレクトに参照されるので,GPRを参照する際に必要なオペランド・フィールドは不要です.つまり,命令語は自由にステートを使えます.もちろんステートもハードウェア・モジュールですから,むやみにステートを定義するとコスト面に影響します.
CABAC用の命令を設計するにあたり,ユーザ定義のステートを活用しました.ステートを用いてCABACフローの条件分岐とループをすべて1命令に収めたのです.ステート・マシンをソフトウェアの命令語にしたことになります.ステートはCABACに特化したものではありません.実際,筆者らの設計では同じステートはCAVLC(CABACと並ぶもう一つの圧縮手法)などを取り扱う命令語でも使用しています.
図12 CABACデコード・フローの一部(2)
膨大なデータをプロセッサ-メモリ間で移動,または二つのプロセッサで共有する必要がある.DMAを用いることで,外部メモリを介さずにデータ移動が行える.また演算を並列化できる.