代码之家  ›  专栏  ›  技术社区  ›  juergi FZNB

具有avx256的acos代码?

  •  1
  • juergi FZNB  · 技术社区  · 7 年前

    acos公司 方法用于图像的每个像素。

    我正在使用avx2。

    除“英特尔c++编译器”提供的库外,是否还有用于acos的mm256代码?

    1 回复  |  直到 7 年前
        1
  •  7
  •   user555045    7 年前

    反余弦大于0.0。。1.0看起来像 sqrt(1 - x) * pi/2 ,当然不完全是这样,但这是乘以一个多项式的结果 x 为了补偿:

    __m256 acos(__m256 x) {
        __m256 xp = _mm256_and_ps(x, _mm256_castsi256_ps(_mm256_set1_epi32(0x7FFFFFFF)));
        // main shape
        __m256 one = _mm256_set1_ps(1.0);
        __m256 t = _mm256_sqrt_ps(_mm256_sub_ps(one, xp));
        // polynomial correction factor based on xp
        __m256 c3 = _mm256_set1_ps(-0.02007522);
        __m256 c2 = _mm256_fmadd_ps(xp, c3, _mm256_set1_ps(0.07590315));
        __m256 c1 = _mm256_fmadd_ps(xp, c2, _mm256_set1_ps(-0.2126757));
        __m256 c0 = _mm256_fmadd_ps(xp, c1, _mm256_set1_ps(1.5707963267948966));
        // positive result
        __m256 p = _mm256_mul_ps(t, c0);
        // correct for negative x
        __m256 n = _mm256_sub_ps(_mm256_set1_ps(3.14159265359), p);
        return _mm256_blendv_ps(p, n, x);
    }
    

    多项式是通过将第0个系数固定在pi/2处,然后应用最小二乘拟合来找到其他系数。所以它不是一个最小最大多项式,很可能可以找到一个更好的。我将其与 std::acosf 在MSVC2017中(尽管 本身未指定)。最大绝对误差为8.45194e-05,发生在(例如)0.106028。最大相对误差为1.87481e-04,接近(但不在)1。