1

128 個の 32 ビット値 (0 から 127 までの番号が付けられています) があり、次のように並べ替えています。

0, 32, 64, 96, 1, 33, 65, 97, ... 31, 63, 95, 127

この順序で、4 つのグループで NEON レジスタにロードして、計算を実行します (このような順序が必要です)。したがって、私はq0 = (0, 32, 64, 96)...などを持っています。

それらを自然な順序でメモリに保存する簡単な方法があるかどうか疑問に思っていました(0 1 2 3 ...)

言い換えれば、これを行うための簡単な方法やトリックはありますか?

vst1.u32 {d0[0]}, [r0]
vst1.u32 {d0[1]}, [r0,#128]
vst1.u32 {d1[0]}, [r0,#256]
vst1.u32 {d1[1]}, [r0,#384]
vst1.u32 {d2[0]}, [r0,#4]
vst1.u32 {d2[1]}, [r0,#132]
...

および命令を@alignment含む接尾辞の使用がよくわかりません。役に立つケースではないでしょうか。vstxvldx

4

1 に答える 1

2

アラインメント (@128、@256) は、読み取り/書き込みがキャッシュ ラインを超えていないことをプロセッサに示唆するために使用されます。そのような場合、実行されるマイクロ操作 (および最終的に使用されるサイクル) の数を減らすことができます。

代わりに、アプリケーションは、列の保存/読み込みを可能にする命令形式の恩恵を受けるでしょう。Arm マニュアルでは、サブセクション ( N 要素構造の単一レーンをメモリに格納する) のようにこれらのレーンを呼び出します。

この形式は、連続するレジスタ {d0,d1,d2,...} と 1 つのレジスタをスキップする {d0,d2,d4,...} の両方をサポートします。

 mov #128, r1  // initialize value for increment
 vst4.32 { d0[0], d2[0], d4[0], d6[0] }, [r0], r1   // columns 0..1
 vst4.32 { d0[1], d2[1], d4[1], d6[1] }, [r0], r1   // store at offset 128
 vst4.32 { d1[0], d3[0], d5[0], d7[0] }, [r0], r1   // columns 2..3
 vst4.32 { d1[1], d3[1], d5[1], d7[1] }, [r0], r1   // columns 2..3
 ... etc ...

すべてを適切にシャッフルするのに十分なレジスタがないため、これがおそらく最善の方法です。32 個の Q レジスタが必要になると思います。

于 2013-04-28T06:30:46.980 に答える