c++ - 在 ARM NEON 中有效地结合面具

标签 c++ arm intrinsics neon

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

Simple solution :

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 结果掩码与一些值 find position of a min/max element .

最佳答案

// 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 有什么意义?与残酷简单的汇编编码相比,这太令人头疼了。

关于c++ - 在 ARM NEON 中有效地结合面具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49952509/

相关文章:

c++ - 在派生模板类中专门化方法形式基类

c++ - 在通用 Linux 上构建 sipXtapi - 安装错误

javascript - armv6l 上的 meteor (树莓派)

x86 - 如何使用 _mm_mul_ps 指定对齐方式

c++ - SIMD 内部函数 : _mm_stream_load_si128 vs _mm_load_si128

c++ - 使用带有返回值的 boost::bind 和 boost::thread

c++ - 无法从继承类调用析构函数

debugging - 有哪些可用的可执行二进制格式和模拟器?

函数参数的C地址?

c++ - 为什么 SSE set (_mm_set_ps) 会颠倒参数的顺序