如何检查AVX内在__m256的inf

Wal*_*ter 3 c c++ sse intrinsics avx

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

__m256 X=_mm256_set1_ps(1.0f/0.0f);
_mm256_cmp_ps(X,X,_CMP_EQ_OQ);
Run Code Online (Sandbox Code Playgroud)

但相比之下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));
Run Code Online (Sandbox Code Playgroud)

但是,这看起来有点冗长.有更快的方法吗?

Mys*_*ial 5

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

如果您想要无穷大值的矢量蒙版:

#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;
}
Run Code Online (Sandbox Code Playgroud)