我有两个向量,每个向量都是4个整数,我想使用SIMD命令来比较它们(比如根据比较结果生成一个结果向量,其中每个条目是0或1)。然后,我想把结果向量和一个4个0的向量进行比较,只有当它们相等时,才做一些事情。您知道我可以使用哪些SIMD命令来执行此操作吗?
axkjgtzd1#
要比较两个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);
备注:
vector1
vector2
result
{ -1, -1, 0, 0 }
如果您只想在所有4个元素都匹配的情况下得到一个布尔结果,那么您可以这样做:
#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);
1条答案
按热度按时间axkjgtzd1#
要比较两个SIMD向量:
备注:
vector1
、vector2
、result
都需要16字节对齐{ -1, -1, 0, 0 }
)更新
如果您只想在所有4个元素都匹配的情况下得到一个布尔结果,那么您可以这样做: