,例如,使用输入
ymm
向量x
和位索引。
在AVX512
i
寄存器,我可以写下以下内容,但是AVX2及以下没有
i
寄存器,那么您认为什么是最好的方法?
k
这里是一种使用变量偏移(仅创建掩码)的方法:
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;
}
)由AVX2引入,它通过可变量的位移动每个32位元素。如果(未签名的)移位点大于31(即,对于签名的负数),则相应的结果为0.。
godbolt链接与小测试代码:
https://godbolt.org/z/a5xfqtcgs
这里是另一种方法。不确定它一定会更好,这取决于CPU模型和周围代码,但可能是。
_mm256_sllv_epi32
vpsllvd