2011-07-29 8 views
10

Mam dwa wektory po 4 liczby całkowite i chciałbym użyć polecenia SIMD, aby je porównać (np. Wygenerować wektor wyników, gdzie każdy wpis jest równy 0 lub 1 zgodnie z wynikiem porównania).Jak porównać dwa wektory za pomocą SIMD i uzyskać pojedynczy wynik boolowski?

Następnie chciałbym porównać wektor wyników do wektora złożonego z 4 zer i tylko wtedy, gdy są one równe, zrób coś.

Czy wiesz, jakie polecenia SIMD mogę użyć, aby to zrobić?

+1

Które architektura jesteś za pomocą? Wszystkie SIMD są różne. – Phonon

+0

Jestem bardzo, bardzo, bardzo nowy w tym, więc proszę wybaczyć moją niewiedzę. Próbuję dołączyć polecenia SIMD przy użyciu platformy Intel Parallel studio (czy w jakikolwiek sposób odpowiada na twoje pytanie?). –

Odpowiedz

14

Aby porównać dwa wektory 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); 

Uwagi:

  • dane są traktowane jako 32-bitowe liczby całkowite
  • vector1, vector2, result wszyscy muszą być 16 bajty
  • wynik będzie równy -1 dla równości, 0 dla nierówny ({ -1, -1, 0, 0 } dla powyższego przykładu kodu)

UPDATE

Jeśli chcesz tylko jeden logiczny wynik dla przypadku, gdy wszystkie 4 elementy pasujące następnie można zrobić to tak:

#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

Dzięki. Kiedy dostaję wektor wyników, czy istnieje prosty sposób sprawdzenia, czy są wszystkie zera (chciałbym mieć wartość logiczną reprezentującą, czy jest ona zerowa, czy nie). –

+0

Mogę użyć _mm_cmpgt_epi32, jeśli chcę uzyskać większy wynik, prawda? –

+0

@ N.M: Zobacz zaktualizowaną odpowiedź powyżej. –