Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 矢量化:乘以m256i元素_C++_X86_Simd_Intrinsics_Avx2 - Fatal编程技术网

C++ 矢量化:乘以m256i元素

C++ 矢量化:乘以m256i元素,c++,x86,simd,intrinsics,avx2,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 = _

我希望使用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


我还没有找到替代指令,希望您能提供帮助。

如果您使用
\u mm256\u mul\u epi32
将32位整数相乘,您将获得64位输出<代码>\u mm256\u mul\u 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个结果


您可以尝试使用
\u mm256\u mullo\u epi32
,此指令将
a
数组的每个元素乘以
b
数组的相应元素,但结果只存储64位输出的32个低位

如果这种命名似乎有点倒退(即纯32x32->32位乘法不应该有简单的
mul
名称吗?),那么请记住,内在函数是以SSE2
pmuldq
/
pmuldq
命名的,几年后,SSE4.1
pmulld
给了我们
mullo
\uuuum256i
版本当然是同时推出的,带有AVX2。