矢量化:乘以 _m256i 元素
vectorization : multiply _m256i elements
我希望使用 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
数组的对应元素,但是只存储了64位输出的低32位结果。
我希望使用 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
数组的对应元素,但是只存储了64位输出的低32位结果。