Jak porównać dwa wektory za pomocą SIMD i uzyskać pojedynczy wynik logiczny?

Mam dwa wektory po 4 liczby całkowite każdy i chciałbym użyć polecenia SIMD, aby je porównać (powiedzmy wygenerować wektor wyniku, gdzie każdy wpis jest 0 LUB 1 zgodnie z wynikiem porównania).

Następnie chciałbym porównać wektor wyniku do wektora 4 zer i tylko wtedy, gdy są równe zrobić coś.

Czy wiesz, jakich poleceń SIMD mogę użyć, aby to zrobić?

1 answers

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:

  • przyjmuje się, że dane są 32-bitowymi liczbami całkowitymi
  • vector1, vector2, result wszystkie muszą być wyrównane 16 bajtów
  • wynik będzie równy -1 dla equal, 0 dla not equal ({ -1, -1, 0, 0 } dla powyższego przykładu kodu)

UPDATE

Jeśli chcesz tylko jeden wynik logiczny dla przypadku, w którym wszystkie 4 elementy pasują, możesz to zrobić 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);
 17
Author: Paul R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-07 21:31:35