在手臂霓虹灯中有效地组合面膜
Efficiently combine masks in arm neon
作为我计算的一部分,我最终将 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
无用的例子:如果你的目标包含aarch32
,vuzp1
不会编译。换句话说,如果您想要最大的性能,无论如何都必须用intrinsux
编写两个版本。
intrinsux
的意义何在?与残酷简单的汇编编码相比,这太令人头疼了。
相关文章:
- 有效地使用std::unordered_map来插入或增加键的值
- 如何有效地在 std::vector 中插入一对?
- 有效地计算多维数组的累积和?
- 如何有效地计算将单位立方体映射到自身的反射和旋转?
- 有效地将大数存储为 2 的幂用于路径问题
- 如何在C++中写入 1000 个文件时有效地缓冲
- 如何有效地找到数组中三元组和的最小差异?
- 如何在C++中有效地将数字值重新分配给字符数组
- C++有效地找到向量中第一个最接近的匹配值?
- 如何有效地操作满足给定谓词的向量中的所有项目?
- 有效地将数据加载到 std::vector 中<char>
- 如何在使用 cin 请求 int 时有效地使用户输入万无一失?
- C++:有效地将Sha256摘要放入OpenSSL Bignum?
- 如何有效地收集给定数组中的重复元素?
- 如何有效地修剪和合并四叉树中的节点?
- 在手臂霓虹灯中有效地重新洗牌和组合 16 个 3 位数字
- 在手臂霓虹灯中有效地组合面膜
- 如何有效地组合有限元稀疏矩阵
- 如何有效地将数字矢量列表组合到一个大数字向量中
- 如何有效地计算给定数字的所有不同组合的按位异或值之和