小编him*_*him的帖子

AVX512 - 如何将所有设置位移至右侧?

如何将掩码寄存器的所有设置位向右移动?(到底部,最不重要的位置)。

例如:

__mmask16 mask = _mm512_cmpeq_epi32_mask(vload, vlimit); // mask = 1101110111011101
Run Code Online (Sandbox Code Playgroud)

如果我们将所有设置位向右移动,我们将得到:1101110111011101 -> 0000111111111111

我怎样才能有效地实现这一目标?

您可以在下面看到我如何尝试获得相同的结果,但效率很低:

__mmask16 mask = 56797;
// mask: 1101110111011101
__m512i vbrdcast = _mm512_maskz_broadcastd_epi32(mask, _mm_set1_epi32(~0));
// vbrdcast: -1 0 -1 -1 -1 0 -1 -1 -1 0 -1 -1 -1 0 -1 -1
__m512i vcompress = _mm512_maskz_compress_epi32(mask, vbrdcast);
// vcompress:-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 0 0 0 
__mmask16 right_packed_mask =   _mm512_movepi32_mask(vcompress);   
// right_packed_mask: 0000111111111111                         
Run Code Online (Sandbox Code Playgroud)

做这个的最好方式是什么?

c bit-manipulation simd intrinsics avx512

3
推荐指数
1
解决办法
611
查看次数

标签 统计

avx512 ×1

bit-manipulation ×1

c ×1

intrinsics ×1

simd ×1