gpt4 book ai didi

c - 在 AVX2 中屏蔽单个位的最佳方法?

转载 作者:行者123 更新时间:2023-12-05 01:04:16 26 4
gpt4 key购买 nike

例如,对于输入 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com