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ć?
15
Author: Ciro Santilli TRUMP BAN IS BAD, 2011-07-29
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
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