如何使用AVX2指令获取非零32位整数通道对应的8位掩码
AVX2环境下最高效实现方案
该需求可通过2条核心AVX2指令完成,完全兼容英特尔、AMD全系列支持AVX2的处理器,是当前理论最优的实现:
实现逻辑
- 先对8个32位整数通道逐位做大于0的比较,符合条件的通道会被标记为全1(
0xFFFFFFFF),不符合的标记为全0(0x00000000) - 直接提取每个32位通道的最高位,拼接为8位整数掩码
代码实现(C语言内置函数版本)
#include <immintrin.h> #include <stdint.h> uint8_t get_nonzero_i32_mask(__m256i input_vec) { const __m256i zero_vec = _mm256_setzero_si256(); // 逐32位通道比较:input_vec[i] > 0时对应通道为全1,否则为全0 const __m256i cmp_result = _mm256_cmpgt_epi32(input_vec, zero_vec); // 类型cast无任何指令开销,提取每个32位通道最高位拼成8位掩码 const int raw_mask = _mm256_movemask_ps(_mm256_castsi256_ps(cmp_result)); /* 如果你需要的位序与示例一致(首个通道对应掩码最高位), 取消下一行注释即可,编译器会自动生成单条位反转指令 */ // return __builtin_bitreverse8((uint8_t)raw_mask); return (uint8_t)raw_mask; }
兼容性与性能说明
- 用到的
_mm256_cmpgt_epi32、_mm256_movemask_ps均为AVX2规范强制要求的指令,英特尔Haswell及更新架构、AMD Excavator及更新架构100%支持 - 整个实现仅需2条实际执行的指令,现代处理器上延迟不超过4个周期,吞吐量可达每周期执行1次以上
内容的提问来源于stack exchange,提问作者drip
相关产品推荐
相关产品推荐

