我有两个向量,每个都有4个整数,我想用SIMD命令来比较它们(比如根据比较结果生成每个条目为0或1的结果向量)。如何使用SIMD比较两个向量并获得单个布尔结果?
然后,我想将结果向量与4个零的向量进行比较,并且只在它们相等时才执行某些操作。
你知道我可以用它来做什么SIMD命令吗?
我有两个向量,每个都有4个整数,我想用SIMD命令来比较它们(比如根据比较结果生成每个条目为0或1的结果向量)。如何使用SIMD比较两个向量并获得单个布尔结果?
然后,我想将结果向量与4个零的向量进行比较,并且只在它们相等时才执行某些操作。
你知道我可以用它来做什么SIMD命令吗?
要比较两个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
都需要16字节对齐{ -1, -1, 0, 0 }
)UPDATE
如果你只是想的情况下的单布尔结果,所有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);
谢谢。当我得到结果向量时,是否有一种简单的方法来检查它是否全为零(我想要一个布尔值来表示它是否全为零)。 –
我可以使用_mm_cmpgt_epi32,如果我想获得更大的结果,对吗? –
@ N.M:查看上面更新的答案。 –
哪些建筑是你使用?所有SIMD都不同。 – Phonon
我对此非常非常新,所以请原谅我的无知。我正在尝试使用英特尔Parallel Studio的平台包含SIMD命令(这是否以任何方式回答您的问题?)。 –