7

これは質問を参照しています: 組み込み関数におけるネオンのチェックサムコードの実装

リンクにリストされているサブ質問を個別の質問として開きます。複数の質問はシングルスレッドの一部として尋ねられるべきではないので。

とにかく質問に来る:

ARMNEON(arm cortex-a8アーキテクチャの観点から言えば)は実際に並行して動作できますか?どうすればこれを達成できますか?

誰かが私を指さしたり、ARM-NEONの相互運用を一緒に使用するいくつかのサンプル実装(理論的な実装ペーパーや講演ではなく、擬似コード/アルゴリズム/コード)を共有できますか?(組み込み関数またはインラインasmのいずれかを使用した実装で十分です。)

4

1 に答える 1

13

答えはARMCPUによって異なります。たとえば、Cortex-A8は、コプロセッサを使用してNEONおよびVFP命令を実装します。これらの命令は、FIFOを介してARMコアに接続されます。命令デコーダは、NEONまたはVFP命令を検出すると、それをFIFOに配置するだけです。NEONコプロセッサはFIFOから命令をフェッチし、それらを実行します。したがって、NEON / VFPコプロセッサは、Cortext-A8では最大20サイクル程度遅れます。

通常、NEON / VFPコプロセッサーからメインARMコアにデータを転送しようとしない限り、その遅延はその遅延を気にしません。(NEON / VPFからARMレジスタに移動するか、NEON命令によって最近書き込まれたARM命令を使用してメモリを読み取るかは、それほど重要ではありません)。その場合、メインARMコアは、NEONコアがFIFOを空にするまで、つまり最大20サイクル程度までストールします。

ARMコアは通常、NEON/VPFコプロセッサが実行できるよりも速くNEON/VPF命令をエンキューできます。これを利用して、命令を適切にインターリーブすることにより、両方のコアを並行して動作させることができます。たとえば、2つまたは3つのNEON命令のブロックごとに1つのARM命令を挿入します。または、ARMの二重発行機能も活用したい場合は、2つのARM命令を使用することもできます。これを行うには、インラインアセンブリを使用する必要があります。組み込み関数を使用する場合、命令の正確なスケジューリングはコンパイラー次第であり、命令を適切にインターリーブする機能があるかどうかは、誰もが推測できます。コードは次のようになります

<neon instruction>
<neon instruction>
<neon instruction>
<arm instruction>
<arm instruction>
<neon instruction>
...

手元にコードサンプルはありませんが、ARMアセンブリにある程度精通している場合は、命令のインターリーブはそれほど難しいことではありません。完了したら、必ず命令レベルのプロファイラーを使用して、実際に意図したとおりに機能することを確認してください。ARM命令に費やされる時間はほとんどないはずです。

他のARMv7実装は、NEONを完全に異なる方法で実装する可能性があることに注意してください。たとえば、Cortex A-9はNEONをARMコアに近づけており、NEON/VFPからARMに戻るデータの移動に対するペナルティははるかに低いようです。これが命令の並列スケジューリングに影響を与えるかどうかはわかりませんが、注意が必要です。

于 2012-09-05T15:52:25.443 に答える