最终掩盖了AVX2中的一点的方法?

问题描述 投票:0回答:3

,例如,使用输入

ymm
向量
x
和位索引。
在AVX512
i
寄存器,我可以写下以下内容,但是AVX2及以下没有
i

寄存器,那么您认为什么是最好的方法?

k

    
这里是一种使用变量偏移(仅创建掩码)的方法:

k
c x86 simd avx avx2
3个回答
4
投票
__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


1
投票
如何最简单的方法:

vpsllvd
    

1
投票
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.