Assembly 如何使用SIMD比较两个向量并得到一个布尔结果?

Assembly 如何使用SIMD比较两个向量并得到一个布尔结果?,assembly,x86,sse,simd,Assembly,X86,Sse,Simd,我有两个向量,每个向量有4个整数,我想使用SIMD命令来比较它们(比如,根据比较结果生成一个结果向量,其中每个条目都是0或1) 然后,我想将结果向量与4个零的向量进行比较,只有当它们相等时,我才做一些事情 您知道我可以使用哪些SIMD命令来执行此操作吗?比较两个SIMD向量: #包括 #包括 int32_t__属性__((对齐(16)))向量1[4]={1,2,3,4}; int32_t__属性__((对齐(16)))向量2[4]={1,2,2}; int32_t___属性__((对齐(16))

我有两个向量,每个向量有4个整数,我想使用SIMD命令来比较它们(比如,根据比较结果生成一个结果向量,其中每个条目都是0或1)

然后,我想将结果向量与4个零的向量进行比较,只有当它们相等时,我才做一些事情


您知道我可以使用哪些SIMD命令来执行此操作吗?

比较两个SIMD向量:

#包括
#包括
int32_t__属性__((对齐(16)))向量1[4]={1,2,3,4};
int32_t__属性__((对齐(16)))向量2[4]={1,2,2};
int32_t___属性__((对齐(16)))结果[4];
__m128i v1=_mm_load_si128((u m128i*)矢量1);
__m128i v2=_mm_load_si128((u m128i*)矢量2);
__m128i vcmp=_mm_cmpeq_epi32(v1,v2);
_mm_store_si128((_m128i*)结果,vcmp);
注:

  • 数据假定为32位整数
  • vector1
    vector2
    result
    都需要16字节对齐
  • 结果将是-1表示相等,0表示不相等(
    {-1,-1,0,0}
    以上代码示例)

更新

如果您只想在所有4个元素都匹配的情况下得到一个布尔结果,那么您可以这样做:

#包括
#包括
int32_t__属性__((对齐(16)))向量1[4]={1,2,3,4};
int32_t__属性__((对齐(16)))向量2[4]={1,2,2};
__m128i v1=_mm_load_si128((u m128i*)矢量1);
__m128i v2=_mm_load_si128((u m128i*)矢量2);
__m128i vcmp=_mm_cmpeq_epi32(v1,v2);
uint16_t mask=_mm_movemask_epi8(vcmp);
int结果=(掩码==0xffff);

您使用的是哪种体系结构?所有的SIMD都是不同的。我对此非常陌生,所以请原谅我的无知。我正在尝试使用Intel Parallel studio平台包含SIMD命令(这是否回答了您的问题?)。谢谢。当我得到结果向量时,有没有一种简单的方法来检查它是否都是零(我想用一个布尔值来表示它是否都是零)。如果我想得到大于零的结果,我可以使用_mm_cmpgt_epi32,对吗?@N.M:是的,
\u mm_cmpgt_epi32
。你需要[]矢量1和2无输入错误后:_mm_movemask_epi8返回,int和no_uum128i。