0

我正在将向量化代码从 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) ;
}

如果有人可以提供建议,我将不胜感激

4

1 回答 1

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 位标志作为有符号整数,并且您正在测试 > 0。显然,如果 MS 位为 1,则此测试将失败(因为结果将 < 0)。您在 SSE 版本中没有看到这个问题,因为它只返回 16 位。

于 2015-02-24T07:15:34.177 回答