c - 如何检查 256i(16 位) vector 以了解它是否包含大于零的元素?

标签 c simd sse2 avx2

我正在将矢量化代码从 SSE2 内在函数转换为 AVX2 内在函数, 并想知道如何检查 256i(16 位) vector 是否包含任何大于零的元素。下面是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) ;
}

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

最佳答案

我认为你只是有一个微不足道的错误 - 你的功能应该是:

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 位。

关于c - 如何检查 256i(16 位) vector 以了解它是否包含大于零的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28685461/

相关文章:

node.js - 为什么 Node.js 0.12.0 版本中的 V8 需要 SSE2 CPU 指令?

从命令行使用 Visual C++ 2013 编译 C/SDL 程序

c++ - 如何使用 SSE/AVX 高效地执行 double/int64 转换?

performance - 为什么 "#pragma omp simd"在 gcc 编译器下只对 "-O2"有很大的性能提升?

c++ - 针对交叉模式访问的 SIMD 优化

c++ - 如何在 C++ 中有效地添加两个 vector

assembly - 使用 CPUID 测试 SSE2 还是尝试 SSE2 指令和 SIGILL?

c++ - asctime 格式的由来是什么?

c - 这个哈希函数背后的基本原理是什么?

c - 在 C 可执行文件中动态包含文本