c++ - 矢量化 : multiply _m256i elements

标签 c++ x86 simd intrinsics avx2

我希望使用 SIMD 指令一次将寄存器中的所有 32 位整数相乘,这是我目前尝试的方法:

  int32_t a [8] = {1, 2, 3, 4, 5, 6, 7, 8};
  int32_t b [8] = {1, 2, 3, 4, 5, 6, 7, 8};
  __m256i tmp1 = _mm256_loadu_si256((__m256i*) a);
  __m256i tmp2 = _mm256_loadu_si256((__m256i*) b);

  __m256 tmp3 = _mm256_mul_epi32(tmp1,tmp2);

遗憾的是它没有产生正确的结果,这基本上是我得到的: 1、0、9、0、25、0、49、0

我还没有找到替代说明,如有任何帮助,我们将不胜感激。

最佳答案

如果使用 _mm256_mul_epi32 乘以 32 位整数,您将得到 64 位输出。 _mm256_mul_epi32 工作原理如下

a[0] * b[0] = tmp3[1:0]    1 * 1 = 1
a[2] * b[2] = tmp3[3:2]    3 * 3 = 9
a[4] * b[4] = tmp3[5:4]    5 * 5 = 25
a[6] * b[6] = tmp3[7:6]    7 * 7 = 49

tmp3 中你有 4 个结果。

你可以尝试使用_mm256_mullo_epi32,这条指令将a数组的每个元素乘以b数组的相应元素,但只有32低64 位输出的位作为结果存储。

关于c++ - 矢量化 : multiply _m256i elements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48377308/

相关文章:

c - 即使我有错误,GCC 也不会在我的内联 asm 函数调用周围推送寄存器

assembly - 如何更改字符串的前景色(32 位汇编内核)?

c - DMA 传输 RAM 到 RAM

c++ - 为什么下面的代码只在 a = 1 时返回 true?

c++ - 旋转一个矩形

algorithm - acosf() 的精确矢量化实现

arm - 优化 ARM NEON 中的水平 bool 减少

c++ - 为什么使用较大数组的 SIMD 内在函数可以获得比标量更大的相对加速比?

c++ - 从 64 位整数中提取 32 位

c++ - 特定类型的可变参数模板