Cortex A9 ARM プロセッサ (具体的には OMAP4) 用のライブラリを構築しようとしていますが、浮動小数点演算と SIMD のコンテキストで NEON と VFP のどちらを\いつ使用するかについて少し混乱しています。 . 私は2つのハードウェアコプロセッサユニットの違いを知っていることに注意してください(SO でここでも概説されているように)、それらの適切な使用法に関して誤解があります。
これに関連して、次のコンパイル フラグを使用しています。
GCC
-O3 -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=softfp
-O3 -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=softfp
ARMCC
--cpu=Cortex-A9 --apcs=/softfp
--cpu=Cortex-A9 --fpu=VFPv3 --apcs=/softfp
私は ARM のドキュメント、多くの wiki (このようなもの)、フォーラム、ブログの投稿を読みましたが、NEON を使用することは、VFP を使用することや、少なくとも NEON を混合することよりも優れていることに誰もが同意しているようです (たとえば、組み込み関数を使用していくつかのアルゴリズムを実装する) SIMD で) VFP はあまり良い考えではありません。これがアプリケーション\ライブラリ全体のコンテキストに適用されるのか、それともコード内の特定の場所 (関数) にのみ適用されるのかは、まだ 100% わかりません。
したがって、組み込み関数も使用したいので、アプリケーションの FPU としてネオンを使用しています。その結果、私は少し問題を抱えており、Cortex A9 でこれらの機能 (NEON と VFP) を最適に使用する方法についての混乱は、解決するのではなく、さらに深まります。アプリのベンチマークを行うコードがいくつかあり、計算が倍精度浮動小数点に基づくカスタムメイドのタイマー クラスを使用します。FPU として NEON を使用すると、完全に不適切な結果が得られます (これらの値を出力しようとすると、ほとんど inf と NaN が出力されます。x86 用にビルドすると、同じコードが問題なく動作します)。そのため、NEON は倍精度浮動小数点を処理しないことが文書化されているため、単精度浮動小数点を使用するように計算を変更しました。. 私のベンチマークではまだ適切な結果が得られません (最悪なのは、x86 で動作しなくなったことです。精度が失われたためだと思いますが、よくわかりません)。したがって、私はほとんど完全に迷っています: 一方では SIMD 機能に NEON を使用したいのですが、FPU として使用すると適切な結果が得られず、他方では VFP と混合することはあまり良い考えではないようです。この分野でのアドバイスは大歓迎です!!
上記のwikiの記事で、NEONのコンテキストで浮動小数点の最適化のために何をすべきかの要約を見つけました:
"
- 単精度浮動小数点のみを使用する
- ボトルネックとなる FP 関数が見つかった場合は、常に NEON 組み込み関数 / ASM を使用してください。コンパイラよりもうまくできます。
- 条件分岐を最小限に抑える
- RunFast モードを有効にする
ソフトFPの場合:
- インライン浮動小数点コード (非常に大きい場合を除く)
- 値ではなくポインターを介して FP 引数を渡し、関数呼び出しの間で整数処理を行います。
"
利用可能なライブラリとリンクできないため、float ABI にはハードを使用できません。ほとんどの推奨事項は私には理にかなっています (「実行モード」は正確には何をすべきか理解していないことと、現時点ではコンパイラよりもうまくできるという事実を除いて)、一貫性のない結果が得られ続けています。今のところ何もわかりません。
Cortex A9/A8 で浮動小数点と NEON を適切に使用する方法と、どのコンパイル フラグを使用する必要があるかについて、誰かが光を当てることができますか?