c++ - AVX2:有没有办法实现 _mm256_mul_epi8 函数的 2 的恒定幂?

标签 c++ simd intrinsics avx avx2

我想对 8 位元素实现以下操作:_a = _b * 8 + _c与 vector 。对于加号,显然是_mm256_add_epi8但我找不到 _mm256_mul_epi8或与 8 位元素相乘的东西。我还试图找到一个左移 3 的函数,但没有运气。
感谢您的帮助!

最佳答案

您只需添加即可做到这一点:

__m256i _b2 = _mm256_add_epi8(_b,_b);
__m256i _b4 = _mm256_add_epi8(_b2,_b2);
__m256i _b8 = _mm256_add_epi8(_b4,_b4);
__m256i _a = _mm256_add_epi8(_b8,_c);

如果您屏蔽每个字节的高位以模拟移出,您也可以使用任何移位来执行此操作:
// not needed if _b values are smaller than 32
__m256i _b_low = _mm256_and_si256(_b,_mm256_set1_epi8(0x1F));

__m256i _b8 = _mm256_slli_epi32(_b_low,3);
__m256i _a = _mm256_add_epi8(_b8,_c);

关于c++ - AVX2:有没有办法实现 _mm256_mul_epi8 函数的 2 的恒定幂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68983613/

相关文章:

C++ 构造函数采用成员初始值设定项

c++ - 有没有办法通过共享内存中的指针到达某个字节?

c++ - 英特尔存储故意重叠内存区域的指令

c - intel intrinsics - 加载/存储的函数指针

assembly - Intel 列出的 "throughput"是按线程还是按核心?

c++ - 围绕对象中心的 SFML 旋转

c++ - 在 OpenGL (C++) 中绘制条纹

c++ - 加速收集

c - 使用 AVX-512 收集/分散 16 位整数

x86 - SSE 乘法 16 x uint8_t