今日の作業

9:59

add_pixels_clamped_armをiWMMXtで書き直し。4%ぐらい高速化。

あとbswap_32も速そうなコードを見つけたので変更。2%ぐらい高速化。

昨日は129%まで速度が上がったと書いたけど、あれ以来120%を超えることが無い。なんだったんだろうか。

10:14

現時点でのプロファイルを貼ってみる。サンプルはXQ。

  %   cumulative   self              self     total
 time   seconds   seconds    calls   s/call   s/call  name
 23.36     65.02    65.02                             mcount_internal
 10.36     93.87    28.85   105690     0.00     0.00  bvdd_draw_slice_420_rotate3
  6.79    112.78    18.91 22177272     0.00     0.00  mpeg4_decode_block
  6.43    130.68    17.90  4227600     0.00     0.00  ff_mpeg4_decode_mb
  4.21    142.41    11.73  6684480     0.00     0.00  mpeg4_pred_ac
  3.31    151.62     9.21                             ippiDCT8x8Inv_Video_16s8u_C1R
  3.10    160.24     8.62  4227600     0.00     0.00  MPV_decode_mb
  2.83    168.13     7.89  2735958     0.00     0.00  MPV_motion
  2.04    173.82     5.69  3508748     0.00     0.00  h263_pred_motion
  2.03    179.47     5.65                             ippiDCT8x8Inv_Video_16s_C1I
  1.97    184.96     5.49 57731729     0.00     0.00  unaligned32
  1.86    190.14     5.18  6684480     0.00     0.00  ff_mpeg4_pred_dc
  1.84    195.25     5.11                             memset
  1.79    200.22     4.97  7017496     0.00     0.00  h263_decode_motion
  1.78    205.18     4.96 57731729     0.00     0.00  unaligned32_be
  1.72    209.96     4.78  4227600     0.00     0.00  mpeg4_is_resync
  1.69    214.66     4.70  6684480     0.00     0.00  mpeg4_decode_dc
  1.41    218.59     3.93  4227600     0.00     0.00  ff_h263_update_motion_val
  1.33    222.30     3.71   276066     0.00     0.00  ff_emulated_edge_mc
  1.22    225.70     3.40  1355601     0.00     0.00  put_no_rnd_pixels8_xy2_iwmmxt
  1.17    228.97     3.27  1421651     0.00     0.00  put_pixels8_xy2_iwmmxt
  1.16    232.20     3.23                             read
  1.12    235.31     3.11  6684480     0.00     0.00  dct_unquantize_h263_intra_iwmmxt
  1.12    238.42     3.11  3953695     0.00     0.00  add_pixels_clamped_iwmmxt
  1.07    241.41     2.99     3523     0.00     0.05  decode_slice
このへんより下は最適化する価値なし

上位の mpeg4_decode_block, ff_mpeg4_decode_mb, mpeg4_pred_ac あたりに最適化の余地がありそうなんだけど、どれもCで数百行の関数、かつiWMMXtが有効に機能するようなものでもない。ここはコンパイラの最適化に頼るしか無いね。

i386系でMMXバージョンが用意されているような関数は一通りiWMMXtに移植したし、もう速度は打ち止めかなぁ……。

10:21

あぁそうだ、IDCTをIPPからFFmpegのモノに変更してみようかな。意外と速くなったりして。IPPを使わないのであれば、VFPにこだわる理由も無くなって楽になるし。

10:29

昨日は129%まで速度が上がったと書いたけど、あれ以来120%を超えることが無い。なんだったんだろうか。

再現した。

BENCHMARKs: VC: 124.514s VO:   0.139s A:   0.000s Sys:   9.682s =  134.334s
BENCHMARKs: VC: 124.617s VO:   0.139s A:   0.000s Sys:   1.806s =  126.562s

まったく同じバイナリでこれだけの違いが出た。どうもSys欄は信用してはいけないようだ。VCは毎回安定した値を出してくれるので、こちらを使うようにしよう。

10:58

iWMMXtのキーワードを作ってみた。

14:01

gcc-4.0と格闘していたらこんな時間に。ビルドを仕掛けておいて寝る。