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

标签 c x86 simd avx avx2

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

相关文章:

assembly - 如何在 GNU 汇编程序中使用字符串文字作为直接操作数(并将其移动到地址)?

optimization - 使用 SSE 优化有限差分

c++ - 将SSE矩阵 vector 乘法代码转换为AVX

c - 如何查看/保存格式为 AV_PIX_FMT_YUVJ420P 的 AVFrame 到文件

c++ - Windows:如何让子进程在不关闭输入匿名管道的情况下读取它?

从指针转换为整数。到底发生了什么?

c - C中的快速随机数生成函数

linux - 需要了解基本 assembly 的指导

c++ - 使用 SIMD (AVX2) 进行稀疏数组压缩

javascript - 某些 Javascript 在 64 位 Internet Explorer 中无法正常运行