2011-07-29 19 views
10

Tengo dos vectores de 4 enteros cada uno y me gustaría usar un comando SIMD para compararlos (digamos generar un vector de resultados donde cada entrada es 0 o 1 según el resultado de la comparación).¿Cómo comparar dos vectores usando SIMD y obtener un solo resultado booleano?

Luego, me gustaría comparar el vector de resultados con un vector de 4 ceros y solo si son iguales, hacer algo.

¿Sabes qué comandos SIMD puedo usar para hacerlo?

+1

que la arquitectura es usted ¿utilizando? Todos los SIMD son diferentes. – Phonon

+0

Soy muy, muy nuevo en esto, así que por favor perdona mi ignorancia. Estoy tratando de incluir comandos SIMD usando la plataforma de Intel Parallel studio (¿esto responde su pregunta de algún modo?). –

Respuesta

14

para comparar dos vectores 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); 

Notas: Se supone

  • datos a ser de 32 bits enteros
  • vector1, vector2, result todos tenemos que ser de 16 bytes alineados
  • resultado será -1 para igual, 0 para no igual ({ -1, -1, 0, 0 } para el ejemplo de código anterior)

ACTUALIZACIÓN

Si lo que desea es un resultado booleano para el caso en que los 4 elementos se ajustan a continuación, puede hacerlo de esta manera:

#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

Gracias. Cuando obtengo el vector de resultados, ¿hay una manera simple de verificar que sea todo ceros (me gustaría tener un booleano que lo represente si todo es ceros o no). –

+0

Podría usar _mm_cmpgt_epi32 si quiero obtener un resultado para mayor que, ¿no? –

+0

@ N.M: Vea la respuesta actualizada más arriba. –