You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含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]时:

  1. 左移31位后,元素变为[0, 0x80000000, 0x80000000, 0, 0, 0x80000000, 0x80000000, 0];
  2. _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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 05:26:15