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);
fonte
2011-07-29 15:20:32
cui l'architettura sei usando? Tutte le SIMD sono diverse. – Phonon
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?). –