refine_subpelの検証

前日のちょっとがっくりな結果をもう少し調べる。

まずはSPUで処理した場合とPPUで処理した場合の違い。

  • SPU
    • 2.20 fps 815.859 sec
  • PPU
    • 5.59 fps 320.839 sec
  • PPU+SPU
    • 1.96 fps 913.871 sec

ということは、913-815の98秒がrefine_subpelのPPUでの実行時間。全体が320秒なので、98/320=0.30、つまり全体の30%の処理となる。2月にgprofでとったプロファイルの結果とほぼ同じなので、妥当な値だろう。

逆に913-320の593秒がrefine_subpelをSPUで実行した時間。PPUが98秒だから6倍も時間がかかっている。うー。遅すぎ。で、どこがネックか。

  • PPU+SPU(呼び出すだけ)
    • 4.54 fps 394.674 sec
  • PPU+SPU(呼び出してMEM->LS転送するだけ)
    • 3.33 fps 539.166 sec

呼び出すだけというのはmbox経由でSPUに処理を渡して、何もせずに戻るだけにした場合の時間。394-320で74秒。呼び出してMEM->LS転送するだけというのは、SPU側でメインメモリからLSにメモリを転送するだけで何も処理せず戻る時間。539-320で219秒。すると592-219の373秒がSPUによる処理時間ということになる。PPUの4倍弱。PPU側はAltivecだけどSPU側は普通のコードだしなー。メモリ転送も遅いなー。ブロック単位でちょこまかコピーしているからなー。

まずSPUの処理をSIMD化して、メモリ転送ももう少し考えなければ。もっと上の関数からSPU化して呼び出し回数減らさないとなー。AltivecのコードはそのままSPUでビルド通るんだっけなー。