46

ARM Cortex-A8プロセッサでは、NEONとは何かを理解しています。これは、SIMDコプロセッサです。

しかし、コプロセッサーでもあるVFP(Vector Floating Point)ユニットはSIMDプロセッサーとして機能しますか?もしそうなら、どちらを使用するのが良いですか?

私は次のようないくつかのリンクを読みました-

  1. Link1

  2. Link2

しかし、それらが何を意味するのかはあまり明確ではありません。彼らは、VFPがSIMDに使用されることを意図したものではなかったと言っていますが、Wikiで次のように読んでいます-「VFPアーキテクチャは短いベクトル命令の実行もサポートしていますが、これらは各ベクトル要素で順番に動作するため、真のSIMDのパフォーマンスを提供しません(シングルインストラクションマルチデータ)並列処理。

何を信じるべきかはそれほど明確ではありませんが、誰かがこのトピックについてもっと詳しく説明できますか?

4

4 に答える 4

46

2つの間にかなりの違いがあります。ネオンは、ARMコアの一部としてのSIMD(単一命令複数データ)アクセラレータプロセッサです。これは、1つの命令の実行中に、最大16個のデータセットに対して同じ操作が並行して発生することを意味します。ネオンの内部には並列処理があるため、同じクロックレートで実行されている標準のSISDプロセッサよりも多くのMIPSまたはFLOPSをネオ​​ンから取得できます。

Neonの最大の利点は、ベクトルを使用して操作を実行する場合、つまりビデオのエンコード/デコードを行う場合です。また、単精度浮動小数点(浮動小数点)演算を並行して実行できます。

VFPは、古典的な浮動小数点ハードウェアアクセラレータです。Neonのような並列アーキテクチャではありません。基本的に、1セットの入力に対して1つの操作を実行し、1つの出力を返します。目的は、浮動小数点の計算を高速化することです。単精度および倍精度浮動小数点をサポートします。

ネオンを使用するには3つの可能性があります。

  • 組み込み関数を使用する#include"arm_neon.h"
  • アセンブリコードをインライン化する
  • 引数として提供することにより、gccに最適化を実行させ-mfpu=neonます(gcc 4.5はこれに適しています)
于 2010-11-04T13:53:48.367 に答える
17

アーキテクチャ上、VFP(Vector Floating Pointとは呼ばれていませんでした)には、1つの命令で浮動小数点ベクトルを操作するための機能があります。実際に複数の操作を同時に実行することはないと思いますが(真のSIMDのように)、コードサイズをいくらか節約できます。ただし、SharkヘルプのARMアーキテクチャリファレンスマニュアルを読むと(NEONの紹介で説明したように、質問のリンク1)、セクションA2.6で、VFPのベクトル機能がARMv7で非推奨になっていることがわかります。 (これはCortex A8が実装するものです)、ソフトウェアは浮動小数点ベクトル演算にAdvancedSIMDを使用する必要があります。

さらに悪いことに、Cortex A8の実装では、VFPはVFP Lite実行ユニット(機能が少ないというよりも小さなシリコン表面を占めるものとしてliteを読み取る)で実装されます。つまり、実際にはARM11よりも低速です。幸い、ほとんどの単精度VFP命令はNEONユニットによって実行されますが、ベクトルVFP演算が実行されるかどうかはわかりません。そして、たとえそうだとしても、それらは確かにNEON命令よりも実行が遅くなります。

それが物事をクリアすることを願っています!

于 2010-11-05T09:33:42.793 に答える
17

armv7 ISA(およびバリアント)の場合

NEONは整数および浮動小数点データ用のSIMDおよび並列データ処理ユニットであり、VFPは完全にIEEE-754互換の浮動小数点ユニットです。特にA8では、VFPがパイプライン化されていないため、高度に並列化されたデータがない場合でも、NEONユニットはほぼすべての処理ではるかに高速です。

では、なぜVFPを使用するのでしょうか。

最も大きな違いは、VFPが倍精度浮動小数点を提供することです。

第二に、VFPが提供するいくつかの特殊な指示があり、NEONユニットには同等の実装はありません。SQRTが思い浮かびますが、おそらくいくつかの型変換です。

しかし、Cosminの回答で言及されていない最も重要な違いは、NEON浮動小数点パイプラインが完全にIEEE-754に準拠していないことです。違いの最も良い説明は、FPSCRレジスタの説明にあります。

IEEE-754に準拠していないため、完全な準拠に関心がないことをコンパイラに通知しない限り、コンパイラはこれらの命令を生成できません。これはいくつかの方法で行うことができます。

  1. 組み込み関数を使用してNEONを強制的に使用します。たとえば、GCCネオン組み込み関数リストを参照してください。
  2. 非常にうまくコンパイラに聞いてください。を指定しない限り、新しいGCCバージョンでも-mfpu=neon浮動小数点NEON命令は生成されません-funsafe-math-optimizations

armv8 + ISA(およびバリアント)の場合[更新]

NEONは現在IEE-754に完全に準拠しており、プログラマー(およびコンパイラー)の観点からは、実際にはそれほど大きな違いはありません。倍精度はベクトル化されています。マイクロアーキテクチャの観点からは、それらが異なるハードウェアユニットでさえあるのではないかと思います。ARMはスカラー命令とベクトル命令を別々に文書化しますが、どちらも「AdvancedSIMD」の一部です。

于 2013-02-07T22:46:13.063 に答える
4

IIRC、VFPは、順次動作する浮動小数点コプロセッサーです。

これは、SIMDのような動作のためにフロートのベクトルに対して命令を使用できることを意味しますが、内部的には、命令はベクトルの各要素に対して順番に実行されます。

単一のロード命令により、命令に必要な全体的な時間はこれによって短縮されますが、VFPはベクトルのすべての要素を処理するための時間を必要とします。

真のSIMDは、より多くの正味浮動小数点パフォーマンスを獲得しますが、ベクトルでVFPを使用する方が、純粋にシーケンシャルで使用するよりも高速です。

于 2010-11-04T13:47:41.243 に答える