将 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]);