乘以4个整数同时反转

时间:2016-05-07 14:48:17

标签: c x86 sse simd

我编写了一个函数,它使用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;
}

1 个答案:

答案 0 :(得分:2)

您正在错误地初始化Y(逆序)并且效率非常低。

变化:

    Y = _mm_set_epi32(a[i], a[i+1], a[i+2], a[i+3]);

为:

    Y = _mm_load_si128(&a[i]);