SL-C3000いじり2 (随時追記)

SL-C3000固有の機能をいじるのはしばらく置いといて、mplayerで学んだことをもとにしてローテートBitBltの最適化をしようと思う。Imageon 100ではハードウェアローテートがあったんで、やる気がおきなかった。

その前に単純なメモリ間コピーの方法による速度の違いを真面目に計測してみる。libcのmemcpy(gccのbuiltinかも)、LDM/STMのよるコピー、バッファのアラインメント、ARMv5TEのPLD命令の有無による違いが気になる。

以下の表は320x240 16bppのバッファを1秒間に何回コピー出来るかを測定したもの。LDM/STMではr0-r7を用いて32バイト単位でコピーを行なっている。alignedとなっている項目は、XScaleのデータキャッシュラインのサイズにあわせて、バッファのアラインメントを調整したもの。32バイト境界にアラインされている。

方法fps
memcpy237
LDM/STM133
LDM/STM / PLD316
LDM/STM / src aligned294
LDM/STM / src aligned / PLD434
LDM/STM / src and dst aligned / PLD434

うは、ここまで違う!?

  • コピー元はなにがなんでも32バイト境界にアラインするべし
  • コピー先のアラインメントは無関係

90度回転の場合、コピー元とコピー先のどちらがメモリを連続的に走査するかで2通りのパターンあるが、上記の結果からコピー元を連続的に走査したほうが有利なのは容易に想像出来る。一応、検証してみた。

方法fps
コピー元を連続的に走査153
コピー先を連続的に走査72

まったく最適化していないので相対的な数字のみを参考に。