« Theora のデコードをもっと速く その2 | メイン | Theora のデコードをもっと速く その4 »

2007年11月07日

動画再生エンジン開発日誌:: Theora のデコードをもっと速く その3

    

高速化版 IJG JPEG library のIDCT を持ってこれないかと考えた。
ソースを見てみたが、すんなりとは行きそうにない。
今度は、libavcodec の vp3dsp_sse2.c のはどうか? と考えた。
Athlon に比べて Core2Duo の方が差が激しいのは、SSE2 によるものではないかと思ったので、SSE2 を使うコードなら速くなるのではないかと。
こちらはかなり似通っていたので、簡単に持って行けそうと言うことで、とりあえず差し替えてみる。
何事もなかったかのように再生できる。
いきなりうまくいったので、なんだか不審に思いその箇所をコメントアウトしてみる。
絵がぐちゃぐちゃになった。
ちゃんとそこを通っているようだ。
で、肝心のCPU負荷はと言うと、大差なし。
これではだめか。

VLC のソースを見ていると、libtheora に対するパッチが入っていたので当ててみる。
見た感じ、コンパイルオプションとかその辺りだが効果があるかもしれない。
結果変わらず。

mplayer を見てみてると _ilog に defined in many places in theora/lib/ とコメントされている。
libtheora の中では、oc_ilog で int ret; for(ret=0;_v;ret++)_v>>=1; return ret; と実装されている。
と言うことで、これを _BitScanReverse を使うようにしてみた。
結果変わらず。

libtheora のヘッダーで OC_SQRTFなどは sqrt をキャストする形になっている。
これを sqrtf などに変えてみた。
結果変わらず。

やはり、libavcdoec/format なのかなぁと思ったが、mplayer で再生した時よく見ると、libavcdoec のは選択されていない様子。
あれ? やっぱり違うのかと思って、libavcdoec を作る時に libtheora を使うようにしてみた。
速くなった。
直に使うよりは遅いが、libavcdoec に入っているのを使うよりかなり速い。
libavcdoec は消えたか……

プロファイラが使えるといいのになぁと思いながらいろいろ調べている時、VTune を使っているブログ記事を見た。
便利そうだ。
いいなぁ。
なんかないかと探すと、GNU には gprof と言うものがあるようだ。
( 参考 : GNUプロファイラーによるコード処理速度の向上 )
使えるかもしれない。
でも…… と気付く。VC2005 もプロファイルして最適化できるんだから、そのプロファイル結果を見ることはできないかと。
使い方があった。 Microsoft Visual C++ 2005 での PGO。最適化に関する説明もある。
なるほど、コマンドラインでやればいいのか。
その上位いくつかをピックアップすると以下のような感じ。

関数名entry countstatic instrdynamic instr% totalrun total
_oc_dec_frags_recon_mcu_plane150864139514360200613.213.2
_oc_dec_ac_coeff_unpack396018126460218187211.825.0
_theora_look116339060164442830498211.436.4
_oc_frag_pred_dc24147386124398491448010.246.7
_theora_read762865368833803838048.755.3
_oc_huff_token_decode1015152202632848897008.463.8

IDCT 周りはインラインアセンブラがあるので MinGW でコンパイルしているためか入っていない。
そこも結果が見れるようにSIMDの関数版に置き換えて計測してみたいところだが、それはベータが取れてからかな。
でも、やはりビットの読み込み部分はかなりの率を占めているようだ。
他のは、中に手を入れないとどうもならないよなぁ。



投稿者 Takenori : 2007年11月07日 17:30



コメント

いつも楽しく拝見しております.

他のプロファイラとしては, AMD CodeAnalyst (http://developer.amd.com/cawin.jsp) というものもあります.

投稿者 eijit [TypeKey Profile Page] : 2007年11月08日 00:53

eijitさん、こんばんは。

なるほど、AMD も出していたのですね。
ありがとうございます。

投稿者 takenori : 2007年11月08日 01:55


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