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);
Które architektura jesteś za pomocą? Wszystkie SIMD są różne. – Phonon
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?). –