長い長〜〜〜い苦悩に満ちたデバッグ作業を超えて、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ほどです。
|