web-dev-qa-db-ja.com

ARM Cortex-A8:VFPとNEONの違いは何ですか

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

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

次のようないくつかのリンクを読んだ-

  1. Link1

  2. Link2

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

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

43

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

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

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

Neonを使用する3つの可能性があります。

  • 組み込み関数を使用する#include "arm_neon.h"
  • アセンブリコードをインライン化する
  • 引数として-mfpu=neonを提供することにより、gccに最適化を行わせます(gcc 4.5はこれに適しています)
42
Cosmin Cojocar

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

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

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

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

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

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

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

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

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

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

16
Peter M

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

さらに悪いことに、Cortex A8の実装では、VFPはVFP Lite実行ユニットで実装されます(ライトは、より小さなシリコン表面を占有しますが、機能が少ないとは見なされません)。幸いなことに、ほとんどの単精度VFP命令はNEONユニットによって実行されますが、ベクターV​​FP操作が実行されるかどうかはわかりません。そして、たとえそれらが実行されても、NEON命令よりも確実に実行が遅くなります。

これで問題が解決することを願っています!

16

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

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

ロード命令が1つであるため、命令に必要な全体の時間はこれによって短縮されますが、VFPはベクターのすべての要素を処理する時間を必要とします。

True SIMDを使用すると、ネット浮動小数点のパフォーマンスが向上しますが、VFPをベクターで使用する方が、純粋にシーケンシャルに使用するよりも高速です。

2
sum1stolemyname