2010-12-08 31 views
1

J'utilise la déclaration de syndicat suivante dans SSE2.Spécifique 64 bits intrinsèque

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 assigner à chaque a et b deux variables unsigned long (64 bits de long), XOR eux et placer le résultat dans c.

Une affectation explicite (a.data[0] = something) fonctionne ici mais nécessite plus de temps.

Je prévois d'utiliser des intrinsèques. Si j'utilise _mm_set_epi64 (unsigned long x, unsigned long y), il demande __m64 variables. Si je jette ces variables (__m64)x et ça fonctionne 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?

Répondre

1

Êtes-vous sûr que unsigned long est 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 prend deux unsigned long long paramètres et renvoie un __m128i. Il n'est pas clair à partir de votre question si vous voulez juste (a) XOR deux 64 bits ou (b) XOR deux vecteurs de 2 x 64 bits?

Pour le cas (a), il suffit d'utiliser le code scalaire, par ex.

uint64_t a, b, c; 

c = a^b; 

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

__m128i va, vb, vc; 

va = _mm_set_epi64(a1, a2); 
vb = _mm_set_epi64(b1, b2); 
vc = _mm_xor_si128(va, vb); 
+0

1. unsigned long est de 64 bits dans ma machine. le cas (b) sera applicable à mon programme. a1, a2 sont des éléments longs non signés, mais j'obtiens l'erreur suivante (sans lancer par __m64): /usr/lib/gcc/x86_64-linux-gnu/4.4.3/include/emmintrin.h:578: note: attendu ' __m64 'mais l'argument est de type' long unsigned int ' – anup

+0

@anup: fait partie d'une boucle, c'est-à-dire que vous avez des tableaux de valeurs dont vous avez besoin pour XOR. Si oui, il y a probablement une meilleure solution globale à cela. –

+0

ouais, c'est une partie d'une boucle ... quelle est la meilleure solution? La situation est comme ceci, pour chaque itération je prends deux valeurs de deux tableaux différents (pas nécessairement le même index), et deux autres valeurs de deux tableaux différents, les XOR et les placez dans le second ensemble de tableaux. – anup