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 |
memcpy | 237 |
LDM/STM | 133 |
LDM/STM / PLD | 316 |
LDM/STM / src aligned | 294 |
LDM/STM / src aligned / PLD | 434 |
LDM/STM / src and dst aligned / PLD | 434 |
うは、ここまで違う!?
- コピー元はなにがなんでも32バイト境界にアラインするべし
- コピー先のアラインメントは無関係
90度回転の場合、コピー元とコピー先のどちらがメモリを連続的に走査するかで2通りのパターンあるが、上記の結果からコピー元を連続的に走査したほうが有利なのは容易に想像出来る。一応、検証してみた。
方法 | fps |
コピー元を連続的に走査 | 153 |
コピー先を連続的に走査 | 72 |
まったく最適化していないので相対的な数字のみを参考に。