2016-05-07 1 views
1

J'ai écrit une fonction qui multiplie quatre entrées simultanément dans un tableau en utilisant SSE. Le seul problème est que les quatre nombres qui sont multipliés en même temps reviennent inversés dans le tableau. Comment puis-je resoudre ceci? Par exemple, si j'appelle la fonction sur {1,2,3,4,5,6,7,8} et que je la multiplie par 2, j'obtiens {8,6,4,2,16,14,12,10} au lieu de {2,4,6,8,10,12,14,16}.Multiplier 4 entrées simultanément inversées

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? En fait, vous devriez probablement utiliser une instruction '_mm_load *'. –

Répondre

2

Vous initialisez Y incorrectement (ordre inverse) et très inefficacement.

Change:

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

à:

Y = _mm_load_si128(&a[i]);