ARM Cortex-A8:VFPとネオンの違いは何ですか
質問
ARM Cortex-A8プロセッサでは、ネオンが何であるかを理解しています。それはSIMDの共同プロセッサです。
しかし、共同プロセッサでもあるVFP(Vectorフローティングポイント)ユニットは、SIMDプロセッサとして機能しますか?もしそうなら、どちらを使用する方が良いですか?
次のようなリンクをいくつか読みました
しかし、それらが何を意味するのかはあまり明確ではありません。彼らは、VFPがSIMDに使用することを意図したものではなく、 ウィキ 私は次のことを読みました - 」VFPアーキテクチャは、短いベクター命令の実行もサポートしていますが、これらは各ベクトル要素で順番に動作するため、真のSIMD(単一命令の複数データ)の並列性のパフォーマンスを提供しません。"
何を信じるべきかはそれほど明確ではありません、誰かがこのトピックについてもっと詳しく説明できますか?
解決
2つにはかなりの違いがあります。 Neonは、ARMコアの一部としてSIMD(単一命令複数データ)アクセラレータプロセッサです。つまり、1つの命令の実行中、同じ操作が並行して最大16のデータセットで発生することを意味します。ネオンには並列処理があるため、ネオンからより多くのMIPやフロップをネオンから得ることができます。
ネオンの最大の利点は、ベクター、つまりビデオエンコード/デコードを使用して操作を実行する場合です。また、単一の精度フローティングポイント(FLOAT)操作を並行して実行できます。
VFPは、古典的なフローティングポイントハードウェアアクセラレータです。ネオンのような並行アーキテクチャではありません。基本的に、1つの入力セットで1つの操作を実行し、1つの出力を返します。それは、浮動小数点計算をスピードアップすることです。単一および二重精度の浮動小数点をサポートします。
ネオンを使用する可能性は3つあります。
- Intrinsics関数を使用#include "arm_neon.h"
- アセンブリコードにインラインします
- GCCに提供することによって最適化を行わせてください
-mfpu=neon
議論として(GCC 4.5はこれについて良いです)
他のヒント
建築的には、VFP(Vector Floating Point for Nothingとは呼ばれませんでした)には、単一の命令で浮動小数点ベクトルを操作するための規定があります。実際に複数の操作を同時に実行することはないと思いますが(True SIMDのように)、コードサイズを保存する可能性があります。ただし、サメのヘルプでアームアーキテクチャリファレンスマニュアルを読むと(ネオンの紹介で説明しているように、質問のリンク1)、セクションA2.6でVFPのベクトル特徴がARMV7で非推奨されていることがわかります。 (これはCortex A8が実装するものです)、ソフトウェアは浮動小数点ベクトル操作に高度なSIMDを使用する必要があります。
さらに悪いことに、Cortex A8の実装では、VFPはVFP Lite実行ユニット(特徴が少ないほどではなく、より小さなシリコン表面を占めるとLiteを読み取ります)で実装されています。幸いなことに、ほとんどのシングルエシジョンVFP命令はNeonユニットによって実行されますが、Vector VFP操作が確信していません。そして、たとえそうであっても、彼らは確かにネオンの指示よりも遅く実行されます。
それが物事をクリアすることを願っています!
ARMV7 ISA(およびバリアント)の場合
Neonは、整数データおよび浮動小数点データのSIMDおよび並列データ処理ユニットであり、VFPは完全にIEEE-754互換フローティングポイントユニットです。特にA8では、VFPが非微細であるため、非常に並列データがない場合でも、Neonユニットはほぼすべての方がはるかに高速です。
では、なぜVFPを使用するのでしょうか?!
最も大きな違いは、VFPが二重精度の浮動小数点を提供することです。
第二に、VFPがネオンユニットに同等の実装がないことを提供するいくつかの専門的な指示があります。 SQRTが思い浮かび、おそらくいくつかのタイプの変換です。
しかし、コスミンの答えで言及されていない最も重要な違いは、ネオンフローティングポイントパイプラインが完全にIEEE-754に準拠していないということです。違いの最良の説明はにあります FPSCRレジスタの説明.
IEEE-754準拠ではないため、コンパイラに完全なコンプライアンスに興味がないことをコンパイラに伝えない限り、コンパイラはこれらの指示を生成できません。これはいくつかの方法で実行できます。
- 本質的な関数を使用してネオンの使用を強制します。たとえば、 GCCネオン固有関数リスト.
- コンパイラに非常にうまく尋ねてください。さらに新しいGCCバージョン
-mfpu=neon
あなたも指定しない限り、フローティングポイントネオンの指示を生成しません-funsafe-math-optimizations
.
ARMV8+ ISA(およびバリアント)の場合 アップデート
Neonは現在、完全にIEE-754に準拠しており、プログラマー(およびコンパイラ)の観点からは、実際にはあまり違いはありません。二重精度がベクトル化されています。マイクロアーキテクチャの観点から、私はそれが異なるハードウェアユニットでさえあることを疑います。 ARMはスカラーとベクトルの命令を個別に文書化しますが、どちらも「高度なSIMD」の一部です。
IIRC、VFPは、順番に動作する浮動小数点コップロセッサです。
これは、SIMDのような動作のためにフロートのベクトルに関する命令を使用できることを意味しますが、内部的には、ベクトルの各要素で命令が実行されます 順番通りに.
単一の負荷命令により、命令に必要な全体の時間はこれにより短縮されますが、VFPはベクトルのすべての要素を処理するために時間が必要です。
True Simdはより多くのネットフローティングポイントパフォーマンスを獲得しますが、VFPを使用すると、ベクトルを使用すると、純粋にシーケンシャルを使用するよりも高速です。