iPhone simd floatユニットを使用したフロートから整数変換
-
16-09-2019 - |
質問
私は現在、SharkでいくつかのDSP関連コードを最適化しようとしていますが、フロートから整数への変換で多くの時間を無駄にしていることがわかりました。
SInt16 nextInt = nextFloat * 32768.0f + 0.5f;
iPhoneにはARM11 FPの共同プロセッサがあるように見えるので、コードをFTOSI命令に置き換えることができるかどうか疑問に思っています。いくつかあります ドキュメンテーション ARM Webサイトで入手できますが、手の最適化されたアセンブリを挿入する経験はありません。誰かが前にそれをしたことがありますか?
コードをインライン化できると思います
__asm__ volatile
しかし、命令が利用可能かどうかを確認するにはどうすればよいですか?
どうすれば自分の価値を渡すことができますか?
Edit1:ルイがすでに指摘したように、「コンパイルフォーサム」とコンパイルしていることを忘れてしまいました。
edit2:フロートを署名されていないint16に署名されていないINTに変換したいので、ARM命令をFTOUIからFtosiに変更しました。これは元の投稿の間違いでした。
解決
これは明らかな質問かもしれませんが、あなたは腕をターゲットにしていると確信していますか?デフォルトでは、iPhone SDKはすべてのアプリをサム用にコンパイルし、ソフトウェアフローティングポイントを使用します(Float/INT変換を含む)。
とにかく、デバイスにVFPコプロセッサがある場合、命令があります。 FPSIDレジスタを読み取り、サポートされているモデルであることを確認することにより、適切なコプロセッサがあるかどうかを確認できます。
すべてのiPhoneがそれをサポートしていると想定しても安全だと思います。とりわけAppleのアセンブラーがOpCodeをサポートしており、LLVM ARM Backendはタイプ変換に使用します。つまり、Appleが最終的に電話でLLVMをサポートすると、コンパイラがFTOUIの指示を生成します。