如何将含0/1的__m256i寄存器转换为__mmask8?
将__m256i打包的32位0/1值转换为__mmask8
实现思路
利用AVX2指令集的位操作与掩码提取指令,把每个32位元素的0/1值映射到对应掩码位:
- 先将每个32位元素的有效位(最低位,因元素仅为0或1)移动到该元素的最高位;
- 再通过掩码提取指令,将每个元素的最高位拼接成
__mmask8类型结果。
代码实现
#include <immintrin.h> __mmask8 convert(__m256i reg) { // 将每个32位元素的最低位(0/1)左移31位到最高位 __m256i shifted = _mm256_slli_epi32(reg, 31); // 提取每个32位元素的最高位,组合为8位掩码 return (__mmask8)_mm256_movemask_epi32(shifted); }
验证示例
输入寄存器值为[0 1 1 0 0 1 1 0]时:
- 左移31位后,元素变为
[0, 0x80000000, 0x80000000, 0, 0, 0x80000000, 0x80000000, 0]; _mm256_movemask_epi32提取每个元素的最高位,得到二进制0b01100110(十进制102),与预期结果一致。
替代实现(基于比较指令)
若需要更直观的逻辑,可先比较元素是否为1,再提取掩码:
#include <immintrin.h> __mmask8 convert(__m256i reg) { __m256i ones = _mm256_set1_epi32(1); // 与1比较,相等的元素变为全1(0xFFFFFFFF),否则为全0 __m256i cmp_result = _mm256_cmpeq_epi32(reg, ones); // 提取每个元素的最高位作为掩码位 return (__mmask8)_mm256_movemask_epi32(cmp_result); }
注意事项
- 代码依赖AVX2指令集支持,编译时需开启对应选项(如GCC/Clang的
-mavx2,MSVC的/arch:AVX2); __mmask8是AVX-512引入的掩码类型,主流编译器(GCC、Clang、MSVC)均支持该类型。
内容的提问来源于stack exchange,提问作者fwefew 4t4tg
相关产品推荐
相关产品推荐

