我正在将SSE2内在函数的矢量化代码转换为AVX2内在函数, 并且想知道如何检查256i(16位)向量是否包含任何大于零的元素。以下是SSE2中使用的代码:
int check2(__m128i vector1, __m128i vector2)
{
__m128i vcmp = _mm_cmplt_epi16(vector2, vector1);
int cmp = _mm_movemask_epi8(vcmp);
return ((cmp>0) ? 1 : 0) ;
}
我认为以下代码可以正常工作,但它没有。
int check2(__m256i vector1, __m256i vector2)
{
__m256i vcmp = _mm256_cmpgt_epi16(vector1, vector2);
int cmp = _mm256_movemask_epi8(vcmp);
return ((cmp>0) ? 1 : 0) ;
}
如果有人可以提供建议我会很感激
答案 0 :(得分:1)
我认为你只是有一个微不足道的错误 - 你的功能应该是:
int check2(__m256i vector1, __m256i vector2)
{
__m256i vcmp = _mm256_cmpgt_epi16(vector1, vector2);
int cmp = _mm256_movemask_epi8(vcmp);
return cmp != 0;
}
问题是_mm256_movemask_epi8
返回32位标志作为有符号的int,你正在测试这个&gt;显然,如果MS位为1,则该测试将失败(因为结果将为<0)。您没有看到SSE版本的这个问题,因为它只返回16位。