我编写了一个函数,它使用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;
}
答案 0 :(得分:2)
您正在错误地初始化Y(逆序)并且效率非常低。
变化:
Y = _mm_set_epi32(a[i], a[i+1], a[i+2], a[i+3]);
为:
Y = _mm_load_si128(&a[i]);