将 4 个整数同时反向相乘
Multiply 4 ints simultaneously reversed
我编写了一个函数,它使用 SSE 将数组中的四个整数同时相乘。唯一的问题是同时乘以的四个整数在数组中颠倒过来。我该如何解决这个问题?例如,如果我在 {1,2,3,4,5,6,7,8} 上调用函数并乘以 2,我得到 {8,6,4,2,16,14,12,10}而不是 {2,4,6,8,10,12,14,16}。
int * integerMultiplication(int *a, int c, int N) {
__m128i X, Y;
X = _mm_set1_epi32(c);
for (int i=0;i<N;i+=4) {
Y = _mm_set_epi32(a[i], a[i+1], a[i+2], a[i+3]);
__m128i tmp1 = _mm_mul_epu32(X,Y); /* mul 2,0*/
__m128i tmp2 = _mm_mul_epu32( _mm_srli_si128(X,4), _mm_srli_si128(Y,4)); /* mul 3,1 */
__m128i ans = _mm_unpacklo_epi32(_mm_shuffle_epi32(tmp1, _MM_SHUFFLE (0,0,2,0)), _mm_shuffle_epi32(tmp2, _MM_SHUFFLE (0,0,2,0)));
_mm_store_si128((__m128i*)&a[i], ans);
}
return a;
}
您对 Y 的初始化不正确(顺序相反)并且效率很低。
变化:
Y = _mm_set_epi32(a[i], a[i+1], a[i+2], a[i+3]);
至:
Y = _mm_load_si128(&a[i]);
我编写了一个函数,它使用 SSE 将数组中的四个整数同时相乘。唯一的问题是同时乘以的四个整数在数组中颠倒过来。我该如何解决这个问题?例如,如果我在 {1,2,3,4,5,6,7,8} 上调用函数并乘以 2,我得到 {8,6,4,2,16,14,12,10}而不是 {2,4,6,8,10,12,14,16}。
int * integerMultiplication(int *a, int c, int N) {
__m128i X, Y;
X = _mm_set1_epi32(c);
for (int i=0;i<N;i+=4) {
Y = _mm_set_epi32(a[i], a[i+1], a[i+2], a[i+3]);
__m128i tmp1 = _mm_mul_epu32(X,Y); /* mul 2,0*/
__m128i tmp2 = _mm_mul_epu32( _mm_srli_si128(X,4), _mm_srli_si128(Y,4)); /* mul 3,1 */
__m128i ans = _mm_unpacklo_epi32(_mm_shuffle_epi32(tmp1, _MM_SHUFFLE (0,0,2,0)), _mm_shuffle_epi32(tmp2, _MM_SHUFFLE (0,0,2,0)));
_mm_store_si128((__m128i*)&a[i], ans);
}
return a;
}
您对 Y 的初始化不正确(顺序相反)并且效率很低。
变化:
Y = _mm_set_epi32(a[i], a[i+1], a[i+2], a[i+3]);
至:
Y = _mm_load_si128(&a[i]);