長い長〜〜〜い苦悩に満ちたデバッグ作業を超えて、ARM用JITコンパイラがかなり出来上がってきました。
まだ Sakura2VM 用の全 SIMD 命令をネイティブに変換できるわけではありませんが(しかし大半は完了)、色々テストしたりは出来ています。
で、パフォーマンスを調べたのですが…………………orz
いえ、JITコンパイルせず、逐次実行した場合よりは高速に走ります。それは確かです。が、NEONを使用した場合の期待された速度の数分の1しか出ていない…。
詳しく見てみると、どうもいくつかの命令が「なんちゃってSIMD」実行されている(又はパイプライン化されていない)ような気配。(ある特定の命令だけ10〜20クロック掛かっているような感じ)
とりあえずテストしている環境が結構古いCPUなので、なんちゃってSIMDはありえるので無視して進めようかと思います…。
因みに、実行速度はどんな感じかと言えば、逐次実行 1500ms → ARMv5用ネイティブ化 600ms → ARMv7用ネイティブ化 150ms → NEON用ネイティブ化 140ms みたいな感じです。
一応、ARMv6からの古いSIMD命令があるので、ARMv7用のJITコンパイルではSIMD命令が使用されるのですが、レジスタ数の都合によるロードストアの頻度やその他の理由による命令密度の差だけで考えても少なくとも3倍、SIMD命令の効果も含め5倍はNEONの方が高速になるだろうはずだったのですが、………この有様です。
因みに上の例の同じ処理のC++コード版をgccでネイティブにコンパイルしたものを実行した場合は60ms程度です。VC++でx86にした物をCore2で実行した場合(クロック比で補正して)20msほどで、SSE2用JITコンパイラで実行した場合も20msほどです。
そういえば WindowsXP のサポートが終了しますね。完全に意識の範囲外でしたが。
現在、EntisGLS4s のディストリビューションには Visual Studio 6 用のライブラリが含まれているのですが、Visual
Studio 6 は Windows Vista では動かせないこともない、Windows7 に至ってはIDEは起動するけどコンパイルできない、というレベルで、外してもいいのかなと言う気が、ついこの前してきましたw(遅っ)
現状 Visual Studio 2005 なのですが、そろそろ 2012 でも買いましょうかね。WindowsMobile 用に 2005 を買ったのですが(Mobileでは実際には少し遊んだ程度でしたが)、Windows8(Metroアプリ)で遊ぶには新しいのが必要ですし…。
まあ、メインではVS2005をまだ当分使うつもりなのですが…。
MSの製品はバージョンアップすると劣化する場合があるので、すぐには使わなくてもヨサゲなバージョンがあったら、とりあえず確保しておく必要があるのがあれだなぁ〜。そういえば、Windows7のライセンスは今の内にもう一つくらい確保しておいた方がいいのかなぁ…。Windows XP x64 のライセンスは結局余ったままですがw
とりあえず、ARM用JITコンパイラのデバッグ作業に入りました。
ARM用JITコンパイラは結局ARMv4以降の対応となりました。つまり、Android機ではJITコンパイラは常に有効です。ただ、パフォーマンスが最大限得られるようになるのはNEON搭載機になります。これはx86用JITコンパイラでSSE2以降でないと十分なパフォーマンスが得られないのと同じです。
最近のAndroid機ではARMv7、VFPv3、NEONはいずれも搭載していると思うので(手持ちのAndroid2.2ですらARMv7ですし………ただTegra-2はNEON搭載CPUにも関わらず(VFPv3-D16のせいだと思いますが)CPUの実装機能としてNEONが取得できないので、ARMv7+VFPv3になりますが…)パフォーマンス的に問題にはならないでしょう…。
いや〜、しかし Android はデバッグ大変だなぁ…(吐血)(因みにもちろん逐次実行の方は動いてます)。でもこれさえ出来ればWindowsでデバッグしてそのままAndroidで(そこそこ高速)実行も可能になるので………ぐぬぬ
|