c++ - 有没有办法用 AVX2 编写 _mm256_shldi_epi8(a,b,1) ? ( vector 之间每 8 位元素移动一位)

标签 c++ avx avx2

我需要将 b 的每个元素的最高位移至 a 相应元素的底部,例如 AVX512VBMI2 _mm256_shldi_epi16/32/64计数为 1

有人知道如何改变这种方式吗?

示例:

__m256i x = { 11001100, 00110011, 11001100, 00110011,... x16 }
__m256i y = { 10111100, 10001011, 11000010, 01100111,... x16 }
__m256i res = _mm256_shldi_epi16(x,y);

然后 res 包含:

10011001011001111001100101100110、...x16

(编者注:之前的问题将其描述为 _mm256_sllv_epi8sllv 是一个可变计数移位,其中每个元素的计数来自另一个元素中的相应元素源,并且与双类完全不同。)

最佳答案

显然,任务是将a的字节左移1,同时从b中的相应字节移入最高位,就像一个带有a的微小漏斗移位固定距离为 1。左移可以通过字节加法来完成,然后从 b 复制该位:

__m256i funnel_left1_epi8(__m256i a, __m256i b) {
    __m256i a2 = _mm256_add_epi8(a, a);
    __m256i bit_from_b = _mm256_and_si256(_mm256_srli_epi16(b, 7), _mm256_set1_epi8(1));
    return _mm256_or_si256(a2, bit_from_b);
}

关于c++ - 有没有办法用 AVX2 编写 _mm256_shldi_epi8(a,b,1) ? ( vector 之间每 8 位元素移动一位),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51475971/

相关文章:

c++ - 从包含的类调用容器类中定义的回调函数的推荐方法是什么?

c++ - 将 char * 转换为字符串文字

c - 如何清除__m256值的高128位?

c++ - 在 64 位 x 64 位乘法中使用 Karatsuba 算法真的很高效吗?

c++ - 如何在 Qt 中一次将输入掩码和 QValidator 设置为 QLineEdit?

intel - 将多个 _mm128 与单个条目 _mm256 相乘

c - 矢量化代码随机减速的原因

intrinsics - 将每个 AVX 32 位元素的低 16 位存储到内存

assembly - 使用 AVX-512 或 AVX-2 对大数据进行 1 位计数(总体计数)

c++ - 矩阵中的嵌套 while 循环