2016-05-07 6 views
1

Ich habe eine Funktion geschrieben, die vier Eingänge gleichzeitig in einem Array mit SSE multipliziert. Das einzige Problem ist, dass die vier Ints, die zur selben Zeit multipliziert werden, im Array umgekehrt zurückkommen. Wie kann ich das lösen? Zum Beispiel, wenn ich die Funktion auf {1,2,3,4,5,6,7,8} rufe und mit 2 multipliziere, bekomme ich {8,6,4,2,16,14,12,10} anstelle von {2,4,6,8,10,12,14,16}.Multiplizieren 4 Eingänge gleichzeitig umgekehrt

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; 
} 
+2

_mm_setr_epi32? Eigentlich sollten Sie wahrscheinlich eine '_mm_load *' Anweisung verwenden. –

Antwort

2

Sie sind initialisiert falsch Y (umgekehrte Reihenfolge) und sehr ineffizient.

Wechsel:

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

zu:

Y = _mm_load_si128(&a[i]);