21

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 を適切に使用する方法と、どのコンパイル フラグを使用する必要があるかについて、誰かが光を当てることができますか?

4

3 に答える 3

9

この質問はいくつかに分割して、いくつかのコード例を追加し、ターゲット プラットフォームと使用されているツールチェーンのバージョンを詳述する必要があると思います。

しかし、混乱の一部をカバーするには、「NEON を FPU として使用する」という推奨事項は誤解のように聞こえます。NEON は SIMD エンジンで、VFP は FPU です。最大 4 つの単精度値に対する単精度浮動小数点演算に NEON を並列で使用できます。これは (可能な場合) パフォーマンスに優れています。

-mfpu=neonの省略形と見なすことができます-mfpu=neon-vfpv3

詳細については、http: //gcc.gnu.org/onlinedocs/gcc/ARM-Options.htmlを参照してください。

于 2011-09-13T11:49:45.450 に答える
3

私はVFPには近づきません。これは Thmub モードと同じです。これは、コンパイラー向けのものです。それらを最適化しても意味がありません。

失礼に聞こえるかもしれませんが、NEON 組み込み関数にも意味がありません。それは助けよりも面倒です - もしあれば。

基本的な ARM アセンブリに 2 ~ 3 日を費やすだけで済みます。ループの制御/終了に関するいくつかの命令を学ぶだけで済みます。

その後、コンパイラが大量のエラー/警告を吐き出すアストラルな何かを行うことを心配することなく、ネイティブ NEON コードの記述を開始できます。

NEON 命令を学習することは、これらすべての組み込みマクロよりも簡単です。さらに、結果ははるかに優れています。

完全に最適化された NEON ネイティブ コードは通常、適切に作成された組み込み関数よりも 2 倍以上高速に実行されます。

下のリンクで OP のバージョンと私のバージョンを比較するだけで、私の言いたいことがわかるでしょう。

NEON を使用した RGBA8888 から RGB565 への変換の最適化

よろしく

于 2011-11-01T13:41:12.693 に答える