带有avx256的acos代码?

Posted

技术标签:

【中文标题】带有avx256的acos代码?【英文标题】:Code for acos with avx256? 【发布时间】:2017-10-27 11:59:55 【问题描述】:

我必须为图像的每个像素调用 acos 方法。

我正在使用 avx2。

除了intel c++编译器提供的库之外,acos还有_mm256代码吗?

【问题讨论】:

你愿意接受多少错误?对于像 acos 这样的复杂函数,需要在速度和精度之间进行权衡。 @Peter Cordes 0.01% 到 0.5% 的精度就足够了。如果有一个带有停止标准的近似值,这可以灵活地确定吗? 【参考方案1】:

反余弦超过 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 附近(但不在 1 处)。

【讨论】:

像魅力一样工作(开箱即用!)。

以上是关于带有avx256的acos代码?的主要内容,如果未能解决你的问题,请参考以下文章

为 AVX、m256 实现 ln(x) [关闭]

有符号 32 位元素的 AVX __m256i 整数除法

cygwin 上的 AVX 加载指令失败

创建 avx 向量时的 Segfault

int64_t 指针转换为 AVX2 内在 _m256i

用 AVX2 有条件地选择一个常数值