iPhone(3GS以降)でSIMDユニットを利用したゲーム用のベクター/マトリックスライブラリーを作成しています。これどうやってするの?私はこれについて検索しました、今私はいくつかのオプションを知っています:
- Apple(iPhone OS 4)のフレームワーク(BLAS + LAPACK + ...)を高速化
- ARMのOpenMAX実装ライブラリ
- GCC自動ベクトル化機能
ゲーム用のベクトル/マトリックスライブラリに最適な方法は何ですか?
GCCはコードを自動ベクトル化しないと想定する必要があります。これは、発生する可能性が非常に低いように思われるためです。
Paulが言ったように、iPhoneのパフォーマンスを最大限に引き出すには、NEONSIMD命令を使用して独自のARMアセンブリコードをできるだけ多く作成する必要があります。ただし、これは、ARMアセンブリ言語とNEON、タイミング遅延などを理解していることを前提としています。したがって、ARMアセンブリ言語を学びたくない場合は、AppleのAccelerateフレームワークとARMのOpenMAXライブラリの両方に、ARMアセンブリですでに記述されている多数の関数があります。 NEONSIMD命令を使用した言語。
したがって、AccelerateまたはOpenMAXのいずれかを使用できる場合は、それらのいずれかが非常に優れているはずです。どちらが実際に速いかを確認するために2つを比較していませんが、ARMがNEON仕様を設計したため、ARMのOpenMAXはAppleの実装よりもわずかに速いと思います。ただし、どちらも非常に高速に実行されるはずです。
時間とともに新しい答えが来ます:
弾丸物理エンジンは、AppleによってNEONSIMD用に最適化されました。http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=8490
それをうまく行うには、おそらく独自のSIMDルーチンを作成する必要があります。これを行う手間を軽減するために、アセンブラーではなくgccでNeonC組み込み関数を使用してください。
インラインASMを使用して、NEONに最適化されたMat*MatおよびMat*Vecルーチンをいくつか作成しました。これらはOolongEngineの一部ですが、MITライセンスの下にあるため、次のように使用できます。
Appleは現在<simd/simd.h>
、あなたが言及したAccelerateフレームワークの一部として、小さなベクトル、行列、およびクォータニオン用に最適化された数学ルーチンのライブラリを持っています。それが今日のおそらく最も簡単な方法のようです。
https://developer.apple.com/documentation/accelerate/simd?language=objc