armv7 ISA(およびバリアント)の場合
NEONは整数および浮動小数点データ用のSIMDおよび並列データ処理ユニットであり、VFPは完全にIEEE-754互換の浮動小数点ユニットです。特にA8では、VFPがパイプライン化されていないため、高度に並列化されたデータがない場合でも、NEONユニットはほぼすべての処理ではるかに高速です。
では、なぜVFPを使用するのでしょうか。
最も大きな違いは、VFPが倍精度浮動小数点を提供することです。
第二に、VFPが提供するいくつかの特殊な指示があり、NEONユニットには同等の実装はありません。SQRTが思い浮かびますが、おそらくいくつかの型変換です。
しかし、Cosminの回答で言及されていない最も重要な違いは、NEON浮動小数点パイプラインが完全にIEEE-754に準拠していないことです。違いの最も良い説明は、FPSCRレジスタの説明にあります。
IEEE-754に準拠していないため、完全な準拠に関心がないことをコンパイラに通知しない限り、コンパイラはこれらの命令を生成できません。これはいくつかの方法で行うことができます。
- 組み込み関数を使用してNEONを強制的に使用します。たとえば、GCCネオン組み込み関数リストを参照してください。
- 非常にうまくコンパイラに聞いてください。を指定しない限り、新しいGCCバージョンでも
-mfpu=neon
浮動小数点NEON命令は生成されません-funsafe-math-optimizations
。
armv8 + ISA(およびバリアント)の場合[更新]
NEONは現在IEE-754に完全に準拠しており、プログラマー(およびコンパイラー)の観点からは、実際にはそれほど大きな違いはありません。倍精度はベクトル化されています。マイクロアーキテクチャの観点からは、それらが異なるハードウェアユニットでさえあるのではないかと思います。ARMはスカラー命令とベクトル命令を別々に文書化しますが、どちらも「AdvancedSIMD」の一部です。