例如,对于输入ymm向量x和位索引i,我希望输出向量只保留第i位,其他都归零.

使用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.

带小测试代码的拉杆:https://godbolt.org/z/a5xfqTcGs

C++相关问答推荐

Bison解析器转移/减少冲突

当包含头文件时,gcc会发出隐式函数声明警告

gcc已编译的可执行文件TSB是否同时暗示最低有效字节和最低有效位?

无效使用未定义类型'structsquare'?

在C中使用强制转换将uint16_t转换为uint8_t [2]是否有效?

不同到达时间的轮询实现

使用C时,Windows CMD中的argc参数是否包含重定向命令?

使用scanf在C中读取和存储文件中的值

防止规范模式在C++中 echo 特殊字符

在创建动态泛型数组时,通过realloc对故障进行分段

在C中访问数组中的特定值

C I/O:在Windows控制台上处理键盘输入

如何在GDB中查看MUSL的源代码

C堆栈(使用动态数组)realloc内存泄漏问题

为什么电路板被循环删除?

如何摆脱-WIMPLICIT-Function-声明

&stdbool.h&q;在嵌入式系统中的使用

在列表中查找素数

为什么INT_MIN是在c语言的头文件limits.h中定义的(-INT_MAX-1)而不是直接使用-2147483648

全局变量 y0 与 mathlib 冲突,无法编译最小的 C 代码