マルチプロセッサで実現したH.264ビデオ・デコーダ ――コンフィギャラブル・プロセッサのユーザ定義命令とオンチップ・バスを活用
● DMAでデータを移動する
RISCプロセッサの命令語は,レジスタ上のデータのみを処理します.したがって,メモリ上のデータはロード,ストア命令でレジスタとやりとりする必要があります.また,マルチプロセッサでは,プロセッサ間でデータのやりとりが必要になります.
設計したデコーダでは,大ざっぱに図13に示すようなデータのやりとりが必要になります.
図13 デコード処理におけるデータ移動
膨大なデータをプロセッサ-メモリ間で移動,または二つのプロセッサで共有する必要がある.DMAを用いることで,外部メモリを介さずにデータ移動が行える.また演算を並列化できる.
プロセッサ間でデータを共有するとなると,キャッシュ・データの不一致の問題が生じます.それを避けるいちばん手っ取り早い手法は,共有データについてキャッシュを介さないことです.ただし,この場合,プロセッサの性能が大きく低下します(すべてのロードがキャッシュ・ミスということになる).また,共有データを適切に同期させなくてはなりません.こうしたことをソフトウェアで処理すると,大きなオーバヘッドにつながります.デコード・フローにはまったく現れないデータの移動になるためです.そこで筆者らは,プロセッサ間,プロセッサとメイン・メモリの間のデータのやりとりをDMAで実行することにしました.
Xtensaは,データ・メモリや命令メモリを外部DMAが直接アクセスできるようなプロセッサ・インターフェースを備えています.デコード・フロー上では複数のデータがやりとりされますから,独立した複数のDMAチャネルを用意しました.個々のDMAチャネルはソフトウェアで完全に制御できます.DMAアクセスのオーバヘッドを極力最適化できるように,DMAは開始・終了をソフトウェア・ポーリング(DMAステータスをリードする),または割り込みの二つの手法で知ることができるようになっています.
ソフトウェアでマルチバッファを構成し,データ処理とDMAによるデータ移動を並列化することで,データ移動のオーバヘッドを隠ぺいしています.