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

Efficiently combine masks in arm neon

本文关键字:有效地 组合 面膜 霓虹灯      更新时间:2023-10-16

作为我计算的一部分,我最终将 2 个掩码存储在 2 个uint32x4_t变量中。这些来自VCEQ。为了进一步处理,我想将它们组合成一个 q-reg 或 d-reg。手臂霓虹灯的首选方法是什么?

简单的解决方案:

uint16x8_t combineMasks(uint32x4_t mask_lo, uint32x4_t mask_hi)
{
uint16x4_t lo = vmovn_u32(mask_lo);
uint16x4_t hi = vmovn_u32(mask_hi);
return vcombine_u16(lo, hi);
}

有没有更好的方法?就我而言,稍后我vand一些值的结果掩码来查找最小/最大元素的位置。

// aarch32
vuzp.16     mask_lo, mask_hi        // you can use either one.
// aarch64
uzp1        result.8h, mask_lo.8h, mask_hi.8h

另一个关于intrinsux无用的例子:如果你的目标包含aarch32vuzp1不会编译。换句话说,如果您想要最大的性能,无论如何都必须用intrinsux编写两个版本。

intrinsux的意义何在?与残酷简单的汇编编码相比,这太令人头疼了。