2011-07-29 6 views
10

Ho due vettori di 4 interi ciascuno e mi piacerebbe utilizzare un comando SIMD per confrontarli (ad esempio, generare un vettore di risultato in cui ogni voce è 0 o 1 in base al risultato del confronto).Come confrontare due vettori usando SIMD e ottenere un singolo risultato booleano?

Quindi, mi piacerebbe confrontare il vettore risultato con un vettore di 4 zeri e solo se sono uguali fare qualcosa.

Sai cosa comandi SIMD posso usare per farlo?

+1

cui l'architettura sei usando? Tutte le SIMD sono diverse. – Phonon

+0

Sono molto molto molto nuovo a questo quindi per favore perdona la mia ignoranza. Sto cercando di includere i comandi SIMD usando la piattaforma Intel Parallel Studio (fa questo, in ogni modo, rispondi alla tua domanda?). –

risposta

14

per confrontare due vettori SIMD:

#include <stdint.h> 
#include <xmmintrin.h> 

int32_t __attribute__ ((aligned(16))) vector1[4] = { 1, 2, 3, 4 }; 
int32_t __attribute__ ((aligned(16))) vector2[4] = { 1, 2, 2, 2 }; 
int32_t __attribute__ ((aligned(16))) result[4]; 

__m128i v1 = _mm_load_si128((__m128i *)vector1); 
__m128i v2 = _mm_load_si128((__m128i *)vector2); 
__m128i vcmp = _mm_cmpeq_epi32(v1, v2); 
_mm_store_si128((__m128i *)result, vcmp); 

Note:

  • dati si presume essere di 32 bit interi
  • vector1, vector2, result tutti bisogno di essere 16 byte allineati
  • il risultato sarà -1 per uguale, 0 per non uguale ({ -1, -1, 0, 0 } per l'esempio di codice precedente)

UPDATE

Se si desidera solo un singolo risultato booleano per il caso in cui tutti e 4 gli elementi corrispondono allora si può fare in questo modo:

#include <stdint.h> 
#include <xmmintrin.h> 

int32_t __attribute__ ((aligned(16))) vector1[4] = { 1, 2, 3, 4 }; 
int32_t __attribute__ ((aligned(16))) vector2[4] = { 1, 2, 2, 2 }; 

__m128i v1 = _mm_load_si128((__m128i *)vector1); 
__m128i v2 = _mm_load_si128((__m128i *)vector2); 
__m128i vcmp = _mm_cmpeq_epi32(v1, v2); 
uint16_t mask = _mm_movemask_epi8(vcmp); 
int result = (mask == 0xffff); 
+0

Grazie. Quando ottengo il vettore dei risultati, c'è un modo semplice per controllare che siano tutti zeri (mi piacerebbe avere un booleano che rappresenta se è tutto zeri o meno). –

+0

Potrei usare _mm_cmpgt_epi32 se voglio ottenere un risultato maggiore allora, giusto? –

+0

@ N.M: vedere la risposta aggiornata sopra. –