例如,对于输入 ymm
vector x
和位索引 i
我想要一个输出 vector 只有 i
保留第 1 位,其他一切归零。
使用 AVX512 k
寄存器,我可以编写以下内容,但 AVX2 及以下版本没有 k
寄存器,所以您认为最好的方法是什么是吗?
__m512i m512i_maskBit(__m512i x, unsigned i) {
__mmask8 m = _cvtu32_mask8(1u << i / 64);
__m512i vm = _mm512_maskz_set1_epi64(m, 1ull << i % 64);
return _mm512_and_si512(x, vm);
}
最佳答案
这是一种使用可变移位的方法(只是创建掩码):
__m256i create_mask(unsigned i) {
__m256i ii = _mm256_set1_epi32(i);
ii = _mm256_sub_epi32(ii,_mm256_setr_epi32(0,32,64,96,128,160,192,224));
__m256i mask = _mm256_sllv_epi32(_mm256_set1_epi32(1), ii);
return mask;
}
_mm256_sllv_epi32
(vpsllvd
) 是由 AVX2 引入的,它将每个 32 位元素移位可变的位数。如果(无符号)移位量大于 31(即,也适用于有符号负数),则相应的结果为 0。
带有小测试代码的Godbolt链接:https://godbolt.org/z/a5xfqTcGs
关于c - 在 AVX2 中屏蔽单个位的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72424660/