最適化は続くよどこまでも

VGAに近いサイズでもMPEG-1ならあと一息で24fpsが出る感じだったので、libmpeg2を最適化してる。gprofでプロファイル取ってみると、最適化する余地はまだまだある模様。結構ARMアセンブラを覚えてきた。

ARMv5TEの拡張命令とXScaleDSP命令って微妙に使う機会がないなぁ。

  • -

SL-Cの動画がしょぼいのはLinuxだからではなく、ハードウェアのせいですよ、っと……。

  • -

XScaleのサイクルカウンタを操作するカーネルモジュールを作った。これで正確なパフォーマンス測定ができる。gprofは最適化を切らないと落ちるので、正確とは言えない。

  • -

コンテキストスイッチがあるから、完璧な測定は無理だった。それでも誤差は10サイクル程度(たまに+200サイクルとかになるが)なので十分か。

とある動画を再生したとき、233万回コールされる関数 MC_put_o_16_cを最適化。145サイクルを70サイクルまで削減。

ただ単に16x16バイトのコピーを行なうだけなんだが、ソース側が32bit境界にアラインされていないのが問題。ワードロードとシフトを駆使した結果、単純にバイトで読み書きするより速くなった。

適用前


BENCHMARKs: VC: 58.574s VO: 63.262s A: 10.110s Sys: 4.793s = 136.739s
BENCHMARK%: VC: 42.8367% VO: 46.2648% A: 7.3936% Sys: 3.5050% = 100.0000%
BENCHMARKn: disp: 2695 (19.71 fps) drop: 594 (18%) total: 3289 (24.05 fps)

適用後


BENCHMARKs: VC: 48.016s VO: 70.613s A: 10.082s Sys: 7.986s = 136.697s
BENCHMARK%: VC: 35.1257% VO: 51.6564% A: 7.3756% Sys: 5.8422% = 100.0000%
BENCHMARKn: disp: 3003 (21.97 fps) drop: 286 (8%) total: 3289 (24.06 fps)