とりあえず、ARM用JITコンパイラでSakura2VMの全命令をVFPやNEON命令に変換できるようにしたので、以前にパフォーマンステストに使用した物と同じ物をARMで実行してみました。
4x4行列とベクトルの積を連続的に計算して所要時間から実効FLOPSを求めるものです。
右端の列がC++コンパイラで出力したネイティブバイナリで、その左が同じコードを詞葉コンパイラでコンパイルしたSakura2バイナリ、その左はSakura2VM用の手書きインラインアセンブリコードによるものです。
(※JIT ARMv5 は実際の ARMv5 で実行するとこの10倍ほど遅くなる可能性があります。JIT コンパイラが ARMv5 用コードを出力する場合、浮動小数点命令は関数の呼び出しコードを出力するのですが、ARMv7 の場合その関数が VFP 命令を使用しています)
結果をザックリ見ると、Atom 1.86GHz と ARM 1GHz がおおよそ近い速度となっていますね。C++コンパイラによるネイティブバイナリの結果はだいぶ違いますが。
あと、手元にある唯一の NEON 環境である APQ8055 はどうにも NEON 命令の出来が悪そうですね。
NEON 命令を出力した場合、そうでない場合よりずっと少ない命令数になっているのにそうでない場合より遅いという…。
一つ前の日記でも書きましたが、CPU側が「なんちゃってSIMD」実装になっていたり、特定の命令がパイプライン化されていないために寧ろ遅くなっている感触です。理屈上はこの数倍のパフォーマンスが出ても不思議ではないのですが…。
実機が Android2.2 とか 2.3 なのでいい加減 Android4 も買って新しいCPUで試してみたいところではありますが、そのためだけに買おうと言う気もしないところです…(汗)
|