« 逆量子化 と ジグザグ | メイン | 自分自身へトラックバック »

2007年11月29日

動画再生エンジン開発日誌:: MMX2 と逆量子化

    

libtheora で MMX2 ( 拡張 MMX ) にある丸め平均を使えばさらに高速化できるかと思ったのだが、theora の場合は四捨五入ではなく端数切捨てだった ( 丸め平均は、( a + b + 1 ) / 2 という処理を行うが、theora は ( a + b ) / 2 となっている ) 。
そのためどちらかかが奇数の時、1 誤差が発生する。
1 ぐらいかまわないと思ったのだが、誤差の発生した画像を使って後の画像が作られるせいか、誤差が蓄積し少しずつ色が変わっていき、キーフレームに到達すると元に戻るという動作をする。
明らかにこれはまずい。
で、誤差を相殺するために次のようにした。
AVG = ( a + b + 1 ) / 2;
AVG -= ( a + b ) & 0x01;
そして、これと 非 MMX2 で速度を計るとほとんど差がない。
Core 2 Duo ではわずかに遅くなっている。
Athlon 64 X2 では、少し速くなった。
Core 2 Duo の方は誤差とも言える位なので、使おうと思うが…… もう少しうまく誤差を相殺できないかなぁ。と書いていて気付いた。
初めにどちらかから 1 引いておけばいいんだ。
つまり、以下のようにする。
a -= 1;
AVG = ( a + b + 1 ) / 2;
この場合、上のものと比べて、a == 0 で b が奇数の時、1 誤差が発生するが、上のものよりも速いはず。

実際の動画で確認したところ、特に画像がおかしくなるようには感じられない。
誤差の発生条件がかなり限定されているためだろう。
わざとこの誤差が発生し蓄積されるような動画を作れば結果はかわると思うが。
計測した結果では、Athlon 64 X2 では 約 0.5 % 速くなった。
Core 2 Duo では、やはりわずかに遅くなっている。誤差ともいえるぐらいだが。


逆量子化の MMX 化対応を行ってみた。
単純に、いつも MMX側でやるようにしたら遅くなった。
DCT 係数の数が少ない時は、MMX を使わないほうが掛け算の回数が少なくなるからだろう。
と言う事で、MMX 版では 16 回掛け算が行われることから、とりあえず 20回で MMX を使うかどうかを分けてみることにした。
結果 Core 2 Duo では 約 1.5% 高速化された。より高画質で圧縮されていればさらに速くなりそうだ。
逆に Athlon 64 X2 では 約 0.5 % 遅くなった。
回数を多くすると Athlon 64 X2 側の速度低下は少なくなるが、遅いのには変わりない。
Athlon 64 X2 では、逆量子化の MMX 化は行わないほうがよさそうだ。
でも、CPU 別最適化とか入れるのはなぁ……



投稿者 Takenori : 2007年11月29日 02:32




comments powered by Disqus
Total : Today : Yesterday : なかのひと