带有avx256的acos代码?
Code for acos with avx256?
我必须为图像的每个像素调用 acos 方法。
我正在使用 avx2。
除了intel c++编译器提供的库之外,还有acos的_mm256代码吗?
反余弦超过 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 并应用最小二乘法拟合来找到其他系数。所以它不是最小-最大多项式,并且可能会找到更好的多项式。我已将它与 MSVC2017 中的 std::acosf
进行了详尽的比较(尽管未指定 std::acosf
本身的准确性)。最大绝对误差为 8.45194e-05 并出现(例如)在 0.106028。最大相对误差为 1.87481e-04,接近(但不在)1.
我必须为图像的每个像素调用 acos 方法。
我正在使用 avx2。
除了intel c++编译器提供的库之外,还有acos的_mm256代码吗?
反余弦超过 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 并应用最小二乘法拟合来找到其他系数。所以它不是最小-最大多项式,并且可能会找到更好的多项式。我已将它与 MSVC2017 中的 std::acosf
进行了详尽的比较(尽管未指定 std::acosf
本身的准确性)。最大绝对误差为 8.45194e-05 并出现(例如)在 0.106028。最大相对误差为 1.87481e-04,接近(但不在)1.