Question

J'utilise la déclaration suivante dans l'union SSE2.

typedef unsigned long uli;  
typedef uli v4si __attribute__ ((vector_size(16)));  
typedef union  
{  
    v4si v;  
    uli data[2];  
} uliv;  

uliv a, b, c;

L'idée est assign deux variables unsigned long (64 bits de long) pour chaque a et b, XOR eux et placer le résultat dans c.

Une affectation explicite (a.data[0] = something) fonctionne ici, mais il faut plus de temps.

Je prévois d'utiliser intrinsics. Si j'utilise _mm_set_epi64 (unsigned long x, unsigned long y), il demande des variables __m64. Si je jetai ces variables (__m64)x et il fonctionne très bien, mais il donne un mauvais résultat.

for (k = 0; k < 10; k++)  
{  
    simda.v = _mm_set_epi64 (_mulpre1[u1][k], _mulpre2[u2][k]);  
    simdb.v = _mm_set_epi64 (res1[i+k], res2[i+k]);  
    simdc.v = _mm_xor_si128 (simda.v, simdb.v);  
}

Le code ci-dessus donne l'erreur:

/usr/lib/gcc/x86_64-linux-gnu/4.4.3/include/emmintrin.h:578: note: expected ‘__m64’
but argument is of type ‘long unsigned int’

Pouvez-vous s'il vous plaît suggérer des solutions de rechange () intrinsèques?

Était-ce utile?

La solution

Êtes-vous que qui unsigned long est de 64 bits sur votre système? Il est probablement plus sûr d'utiliser unsigned long long ou mieux encore uint64_t de <stdint.h>.

Sur mon système _mm_set_epi64 prend deux paramètres de unsigned long long et retourne un __m128i.

Il est pas clair de votre question de savoir si vous voulez juste (a) XOR deux 64 valeurs de bits ou (b) XOR deux vecteurs de 2 x 64 valeurs de bits?

Dans le cas (a) il suffit d'utiliser le code scalaire, par exemple.

uint64_t a, b, c;

c = a ^ b;

Dans le cas (b) vous n'avez pas besoin des syndicats, etc, faites ceci:

__m128i va, vb, vc;

va = _mm_set_epi64(a1, a2);
vb = _mm_set_epi64(b1, b2);
vc = _mm_xor_si128(va, vb);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top