12

次のように見えるかもしれません: ARM と NEON は並行して動作できますか? 、しかしそうではありません、私は他の問題を抱えています(私の理解に問題があるかもしれません):

プロトコル スタックでは、GPP で行われるチェックサムの計算中に、関数の一部としてそのタスクを NEON に引き渡します。

以下は、私が NEON の一部として作成したチェックサム関数で、Stack Overflow に投稿されています: Checksum code implementation for Neon in Intrinsics

ここで、Linux からこの関数が呼び出されたとします。

ip_csum(){
  …
  …
  csum = do_csum(); //function call from arm
  …
  …
}


do_csum(){
  …
  …
  //NEON optimised code
  …
  …
  returns the final checksum to ip_csum/linux/ARM
}

この場合.. NEON が計算を行っているとき、ARM はどうなりますか? ARMはアイドル状態ですか?それとも他の操作に進みますか?

ご覧のとおり、do_csum が呼び出され、その結果を待っています (または、それがどのように見えるか)。

ノート:

  1. cortex-a8で言えば
  2. リンクからわかるように do_csum は組み込み関数でコーディングされています
  3. gnu ツールチェーンを使用したコンパイル
  4. これらの相互操作が発生したときに、マルチスレッドやその他の関連する概念を取り入れたり、絵に描いたりすると良いでしょう。

質問:

  1. NEON が操作を行っている間、ARM はアイドル状態になりますか? (この特定のケースでは)
  2. それとも、現在の ip_csum 関連のコードを棚上げして、NEON が完了するまで別のプロセス/スレッドを使用しますか? (私はここで何が起こるかについてほとんどばかです)
  3. アイドル状態である場合、NEON が完了するまで、ARM を他の何かで動作させるにはどうすればよいでしょうか?
4

3 に答える 3

14

ここに画像の説明を入力

( TI Wiki Cortex A8からの画像)

NEON 命令の処理中、ARM (または整数パイプライン) はアイドル状態になりません。Cortex A8 では、NEON はプロセッサ パイプラインの「最後」にあり、命令はパイプラインを流れ、ARM 命令の場合はパイプラインの「最初」で実行され、NEON 命令は最後に実行されます。クロックごとに命令がパイプラインにプッシュされます。

上の図の読み方のヒントを次に示します。

  • 可能であれば、すべてのサイクルで、プロセッサは命令ペア (2 つの命令) をフェッチします。
  • フェッチはパイプライン処理されるため、命令がデコード ユニットに伝播するのに 3 サイクルかかります。
  • 命令のデコードには 5 サイクル (D0 ~ D4) かかります。繰り返しますが、これはすべてパイプラインであるため、レイテンシには影響しますが、スループットには影響しません。可能であれば、より多くの命令がパイプラインを流れ続けます。
  • ここで、実行/ロード ストアの部分に到達します。NEON 命令はこの段階を通過します (ただし、他の命令が実行されている可能性がある間に実行されます)。
  • NEON 部分に到達します。13 サイクル前にフェッチされた命令が NEON 命令であった場合、デコードされ、NEON パイプラインで実行されます。
  • これが発生している間、その命令に続く整数命令は、整数パイプラインで同時に実行できます。
  • パイプラインはかなり複雑で、複数サイクルの命令もあれば、依存関係があり、それらの依存関係が満たされない場合に停止する命令もあります。分岐などのその他のイベントは、パイプラインをフラッシュします。

100% NEON 命令のシーケンスを実行している場合 (通常、いくつかの ARM レジスタ、制御フローなどが関与するため、これは非常にまれです)、整数パイプラインが何も役に立たない期間があります。ほとんどのコードでは、少なくともしばらくの間、2 つが同時に実行されますが、巧妙に設計されたコードは、適切な命令の組み合わせでパフォーマンスを最大化できます。

Cortex A8 用のこのオンライン ツールCycle Counterは、アセンブリ コードのパフォーマンスを分析するのに最適で、どのユニットで何が実行され、何がストールしているかについての情報を提供します。

于 2012-10-19T07:07:58.237 に答える
7

ではApplication Level Programmers’ Model、ARM ユニットと NEON ユニットを実際に区別することはできません。

NEON は別個のハードウェア ユニット (Cortex-A シリーズ プロセッサのオプションとして利用可能) ですが、それを厳密に駆動するのは ARM コアです。これは、非同期で通信できる個別の DSP ではありません。

両方のユニットでパイプラインを十分に活用することでより良いコードを書くことができますが、これは別のコアを持つことと同じではありません。

NEON ユニットが存在するのは、低周波数で ARM ユニットよりもはるかに高速に一部の操作 (SIMD) を実行できるためです。

これは、数学が得意な友人がいるようなもので、難しい質問があるときはいつでも彼に尋ねることができます. 答えを待っている間、答えがこれである場合はこれを行うか、代わりにそれを行う必要があるなど、いくつかの小さなことを行うことができますが、その答えに依存している場合は、先に進む前に彼の答えを待つ必要があります. 答えを自分で計算することもできますが、すべての計算を自分で行うよりも、2 人のコミュニケーション時間を含めてもはるかに高速です。このアナロジーは、「その友人にお弁当を買う必要もありますが (エネルギー消費)、多くの場合、それだけの価値があります」のように拡張することもできると思います。

NEON コアがその作業を行っている間に ARM コアが他のことを実行できると言っている人は、タスク レベルの並列処理のようなものではなく、命令レベルの並列処理について話しているのです。

于 2012-10-19T07:03:41.247 に答える
6

NEON操作の実行中、ARMは「アイドル」ではありませんが、それらを制御します。
両方のユニットの能力を十分に活用するために、インターリーブされた一連の操作を慎重に計画することができます。

loop:
SUBS r0,r0,r1  ; // ARM operation
addpq.16 q0,q0,q1  ; NEON operation
LDR r0, [r1, r2 LSL #2];   // ARM operation
vld1.32 d0, [r1]!  ; // NEON operation using ARM register
bne loop;         // ARM operation controlling the flow of both units...

ARM cortex-A8は、最大2命令までの各クロックサイクルで実行できます。両方が独立したNEON操作である場合、ARM命令を間に入れても意味がありません。OTOH VLD(ロード)のレイテンシーが大きいことがわかっている場合は、ロードとロードされた値の最初の使用の間に多くのARM命令を配置できます。ただし、いずれの場合も、組み合わせた使用法を事前に計画し、インターリーブする必要があります。

于 2012-10-19T07:03:08.190 に答える