c++ - 如何检查 AVX intrinsic __m256 的 inf

标签 c++ c sse intrinsics avx

检查 AVX 内在 __m256(8 个 float 的 vector )是否包含任何 inf 的最佳方法是什么?我试过了

__m256 X=_mm256_set1_ps(1.0f/0.0f);
_mm256_cmp_ps(X,X,_CMP_EQ_OQ);

但这与 true 相比。请注意,此方法将找到 nan(与 false 比较)。所以一种方法是检查 X!=nan && 0*X==nan:

__m256 Y=_mm256_mul_ps(X,_mm256_setzero_ps());   // 0*X=nan if X=inf
_mm256_andnot_ps(_mm256_cmp_ps(Y,Y,_CMP_EQ_OQ),
                 _mm256_cmp_ps(X,X,_CMP_EQ_OQ));

但是,这看起来有些冗长。有没有更快的方法?

最佳答案

如果你想检查一个 vector 是否有任何无穷大:

#include <limits>

bool has_infinity(__m256 x){
    const __m256 SIGN_MASK = _mm256_set1_ps(-0.0);
    const __m256 INF = _mm256_set1_ps(std::numeric_limits<float>::infinity());

    x = _mm256_andnot_ps(SIGN_MASK, x);
    x = _mm256_cmp_ps(x, INF, _CMP_EQ_OQ);
    return _mm256_movemask_ps(x) != 0;
}

如果你想要一个无穷大值的 vector 掩码:

#include <limits>

__m256 is_infinity(__m256 x){
    const __m256 SIGN_MASK = _mm256_set1_ps(-0.0);
    const __m256 INF = _mm256_set1_ps(std::numeric_limits<float>::infinity());

    x = _mm256_andnot_ps(SIGN_MASK, x);
    x = _mm256_cmp_ps(x, INF, _CMP_EQ_OQ);
    return x;
}

关于c++ - 如何检查 AVX intrinsic __m256 的 inf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30674291/

相关文章:

c++ - 这个文件夹重定向到驱动器盘符是如何完成的?

c++ - 最佳实践,在 Opencv 中检测 Mat 是否为黑白

c++ - 使用 char* 和 std::list 将数据结构写入二进制文件

python - 将 Scipy 嵌入到 C 中

c++ - 如何使用 vector 类对 C++ 代码进行矢量化

c++ - 找到两个 vector 之间的交点

c - glTexImage2d 和 GL_R8UI 在某些 GPU 上失败

c - 为什么文件指针为空?

c - 使用 SSE 索引到数组中

x86 - _mm512_load_epi32 和 _mm512_load_si512 有什么区别?