11

这与 ARM Neon SIMD 编码特别相关。我正在为视频解码器中的某些模块使用 ARM Neon instrinsics。我有一个矢量化数据如下:

Neon 寄存器中有四个 32 位元素 - 例如 Q0 - 大小为 128 位。

3B 3A 1B 1A

在其他 Neon 寄存器中还有另外四个 32 位元素,例如 Q1,其大小为 128 位。

3D 3C 1D 1C

我希望最终数据有序,如下所示:

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

什么 Neon instrinsics 可以实现所需的数据顺序?

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 寄存器重新解释为两个 64 位 D 寄存器。vcombine otoh 仅编译为一两次移动(取决于寄存器分配)。

哦 - 输出中整数的顺序可能完全是错误的。如果是这样,只需将参数交换为 vcombine_s32。

于 2010-04-17T04:08:53.003 回答
4

请记住,每个 q 寄存器由两个 d 寄存器组成,例如 q0 的低部分是 d0,高部分是 d1。所以其实这个操作只是交换d0和d3(或者d1和d2,从你的数据呈现上看不太清楚)。甚至还有一条交换指令可以在一条指令中完成!

免责声明:我不知道 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 回答