矢量化:乘以_m256i元素

时间:2018-01-22 08:24:56

标签: 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

我还没有找到替代指令,任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:3)

如果使用_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位输出的低位作为结果。