如何在霓虹灯中执行 8 路去交错

Posted

技术标签:

【中文标题】如何在霓虹灯中执行 8 路去交错【英文标题】:How to perform a 8-way de-interleave in neon 【发布时间】:2016-07-13 10:35:54 【问题描述】:

在neonintrinsic中,有四个intrinsics(vld1 vld2 vld3 vld4)来执行1-way to 4-way de-interleave。但是如何实现8-way de-interleave呢?

比如数据是:

uint8_t src[64] = 0,1,2,3,4,5,6,7,```63;

将数据加载到neon寄存器中,进行8路解交织后,我希望src_reg1和src_reg2的值可以是这样的:

uint8x8x4_t src_reg1;
uint8x8x4_t src_reg2;
src_reg1.val[0] = 0,8, 16,24,32,40,48,56
src_reg1.val[1] = 1,9, 17,25,```
src_reg1.val[2] = 2,10,18,26,```
src_reg1.val[3] = 3,11,19,27,```
src_reg2.val[0] = 4,12,20,28,```
src_reg2.val[1] = 5,13,21,29,```
src_reg2.val[2] = 6,14,22,30,```
src_reg2.val[3] = 7,15,23,31,39,47,55,63

有人知道如何实现吗?非常感谢!

【问题讨论】:

【参考方案1】:

这就像执行两个 4 元素加载以获得两组 4 路去交织数据一样简单,然后通过其中一个寄存器交织操作进一步将这些集合相互去交织,例如:

uint8x8x4_t src_reg1 = vld4_u8(src);
uint8x8x4_t src_reg2 = vld4_u8(src + 32);
for (int i = 0; i < 4; i++) 
    // This a bit of a faff thanks to the intrinsic datatypes, but
    // compiling at -O3 tidies it all up into sensible code
    uint8x8x2_t tmp = vuzp_u8(src_reg1.val[i], src_reg2.val[i]);
    src_reg1.val[i] = tmp.val[0];
    src_reg2.val[i] = tmp.val[1];

【讨论】:

以上是关于如何在霓虹灯中执行 8 路去交错的主要内容,如果未能解决你的问题,请参考以下文章

在单臂霓虹灯寄存器中有效地将 8 位数字扩展到 12 位

向量中的内在霓虹灯交换元素

在手臂霓虹灯中有效地组合面具

这个霓虹灯代码的速度在ndk中不稳定

如何在具有霓虹内在函数的多核处理器中有效地使用所有霓虹灯单元

摘要 SAD(绝对差和)的霓虹灯实现总线错误