2

アセンブラと NEON プログラミングは初めてです。私の仕事は、NEON 命令を使用してアルゴリズムの一部を C から ARM アセンブラーに変換することです。このアルゴリズムは int32 配列を取り、この配列からさまざまな値をロードし、ビットシフトと Xor を実行して、結果を別の配列に書き込みます。後で 64 ビット値の配列を使用しますが、今はコードを書き直してみるだけです。

C Pseudo code:

out_array[index] = shiftSome( in_array[index] ) ^ shiftSome( in_array[index] );

NEON命令に関する私の質問は次のとおりです。

1.) 次のようなレジスタをロードした場合:

vld1.32 d0, [r1]

メモリから 32 ビットのみをロードするのか、それとも 2x32 ビットをロードして 64 ビットのネオン D レジスタを埋めるのか?

2.) D レジスタの 2/4/8 (i32、i16、i8) 部分にアクセスするにはどうすればよいですか?

3.) オフセットを使用して配列から異なる値を読み込もうとしていますが、うまくいかないようです...何が間違っているのでしょうか...これが私のコードです:(これは整数配列なので、私は'たとえば、オフセットが 64 ビット = 8 バイトの 3 要素をロードしようとしている場合)

asm volatile(
"vld1.32 d0, [%0], #8 \n"     
"vst1.32 d0, [%1]" : : "r" (a), "r" (out): "d0", "r5");

ここで、「a」は配列で、「out」は整数へのポインターです (デバッグ用)。

4.) 配列から値をロードした後、右にシフトする必要がありますが、うまくいかないようです:

vshr.u32 d0, d0, #24     // C code:   x >> 24;

5.) 必要な 1 バイトだけを取得するために何かをシフト/マスクする必要がないように、Neon レジスタに 1 バイトだけをロードすることは可能ですか?

6.) インライン アセンブラを使用する必要がありますが、最後の行が何のためにあるのかわかりません。

input list : output list : what is this for?

7.) コード例を含む適切な NEON リファレンスを知っていますか?

プログラムは、違いがある場合、Samsung Galaxy S2、cortex-A9 プロセッサで実行する必要があります。助けてくれてありがとう。

- - - - - - - - 編集 - - - - - - - - - -

それが私が見つけたものです:

  1. 常に完全なレジスタ (64 ビット) をロードします。
  2. 「vmov」命令を使用して、ネオン レジスタの一部をアーム レジスタに転送できます。
  3. オフセットはアーム レジスタにある必要があり、メモリ アクセス後にベース アドレスに追加されます。
  4. それは「破壊された登録リスト」です。入力リストにも出力リストにもない、使用されているすべてのレジスタをここに書き込む必要があります。
4

2 に答える 2

11

あなたの質問のほとんどに答えることができます: (更新: 「レーン」の問題を明確にしました)

1) NEON 命令は、一度にメモリとの間でレジスタ全体 (64 ビット、128 ビット) のみをロードおよびストアできます。単一の「レーン」を ARM レジスタとの間で移動できるようにする MOV 命令バリアントがあります。

2) NEON MOV 命令を使用して、シングル レーンに影響を与えることができます。単一要素の操作が多すぎると、パフォーマンスが低下します。NEON 命令は、ベクトル (float/int のグループ) に対して並列操作を実行することで、アプリケーションのパフォーマンスを向上させます。

3) ARM アセンブリ言語の即値オフセットは、要素/レジスタではなくバイトです。NEON 命令は、即値ではなく、レジスタによるポスト インクリメントを許可します。通常の ARM 命令の場合、ポスト インクリメントを 8 にすると、ソース ポインタに 8 (バイト) が追加されます。

4) NEON のシフトは、ベクトルのすべての要素に影響します。vshr.u32 を使用して 24 ビットを右にシフトすると、両方の 32 ビット符号なし long が 24 ビットシフトされ、シフトアウトされたビットが捨てられます。

5) NEON 命令では、通常の ARM レジスタに出入りする単一要素を移動できますが、メモリから「レーン」に直接ロードまたはストアすることはできません。

6) ?

7) ここから始めてください: http://blogs.arm.com/software-enablement/161-coding-for-neon-part-1-load-and-stores/ ARM サイトには、NEON に関する優れたチュートリアルがあります。

于 2012-02-16T22:15:34.913 に答える