如何在C中用AVX intrinsics比较双精度向量并转换__mmask8?
解决
__mmask8转打包整数向量及统计True数量的方法 1. 把__mmask8转成打包整数向量
AVX512有专门的硬件指令直接完成掩码到向量的转换,不用手动构造:
- 转成64位整数向量(每个True对应全1的64位值,False对应0),用
_mm512_movm_epi64:__mmask8 cmp_mask = _mm512_mask_cmple_pd_mask(0x0F, a, b); // a、b为__m512d类型的双精度向量 __m512i int_vec = _mm512_movm_epi64(cmp_mask); - 如果需要32位整数向量,可以先转64位再用
_mm512_cvtepi64_epi32截断,或者直接用_mm512_movm_epi32(__mmask8高位补0即可适配__mmask16参数)。
2. 统计掩码中True的数量
其实没必要先转向量再统计,直接用_mm_popcnt_u32就能快速数出掩码里的置位数量:
__mmask8 cmp_mask = _mm512_mask_cmple_pd_mask(0x0F, a, b); uint32_t true_count = _mm_popcnt_u32((uint32_t)cmp_mask);
如果一定要转成向量后再归约求和,也可以用_mm512_reduce_add_epi64:
__m512i int_vec = _mm512_movm_epi64(cmp_mask); uint64_t sum = _mm512_reduce_add_epi64(int_vec); uint32_t true_count = sum / UINT64_MAX; // 每个True对应全1的64位值,除以最大值得到数量
额外说明
__mmask8本质是8位整数,每一位对应512位双精度向量中一个元素的比较结果(1为True,0为False)。直接统计掩码的置位数量是效率最高的方案,省去了向量转换的开销。
内容的提问来源于stack exchange,提问作者Jofre
相关产品推荐
相关产品推荐

