11

これは特に ARM Neon SIMD コーディングに関連しています。ビデオデコーダーの特定のモジュールにARM Neon instrinsicsを使用しています。次のようなベクトル化されたデータがあります。

Neon レジスタには 4 つの 32 ビット要素 (Q0 など) があり、サイズは 128 ビットです。

3B 3A 1B 1A

他の Neon レジスタには、サイズが 128 ビットの Q1 など、さらに 4 つの 32 ビット要素があります。

3D 3C 1D 1C

以下に示すように、最終データを整理したいと思います。

1D 1C 1B 1A
3D 3C 3B 3A

目的のデータ順序を実現できる Neon 組み込み関数はどれですか?

4

4 に答える 4

11

このようなものはどうですか:

  int32x4_t q0, q1;

  /* split into 64 bit vectors */
  int32x2_t q0_hi = vget_high_s32 (q0);
  int32x2_t q1_hi = vget_high_s32 (q1);
  int32x2_t q0_lo = vget_low_s32 (q0);
  int32x2_t q1_lo = vget_low_s32 (q1);

  /* recombine into 128 bit vectors */
  q0 = vcombine_s32 (q0_lo, q1_lo);
  q1 = vcombine_s32 (q0_hi, q1_hi);

理論的には、vget_highとvget_lowは128ビットのQレジスタを2つの64ビットのDレジスタとして再解釈するため、これは2つのmove命令にコンパイルされるはずです。vcombine otohは、1つまたは2つの移動にコンパイルされます(レジスタ割り当てによって異なります)。

ああ-そして出力の整数の順序は正確に間違った方法である可能性があります。その場合は、引数をvcombine_s32に交換してください。

于 2010-04-17T04:08:53.003 に答える
4

各 q レジスタは 2 つの d レジスタで構成されていることに注意してください。たとえば、q0 の下位部分は d0 で上位部分は d1 です。したがって、実際には、この操作は d0 と d3 (または d1 と d2、データ表示から完全には明らかではありません) を交換するだけです。1つの命令でそれを行うスワップ命令さえあります!

免責事項: Neon の組み込み関数については知りません (アセンブリで直接コーディングしています)。

于 2010-05-12T13:03:01.427 に答える
3

VTRNこれには命令 (例: )を使用できるはずですvtrnq_u32

于 2010-04-11T07:23:26.177 に答える
2

ピエールは正しい。

vswp d0、d3

それでいい。

@Pierre : 数か月前にあなたのブログで NEON に関する投稿を読みました。私のような人がいて、ARM と NEON の両方で最適化されたアセンブリ コードを手作業で書いていることに驚きました。お会いできてうれしいです。

于 2011-10-31T13:51:07.787 に答える