2017-10-27 27 views
1

이미지의 모든 픽셀에 대해 acos 메서드를 호출해야합니다.avx256을 사용하는 acos 용 코드?

저는 avx2를 사용하고 있습니다.

intel C++ 컴파일러와 함께 제공되는 라이브러리와 별도로 acos에 _mm256 코드가 있습니까?

+0

어떤 오류를 받아들입니까? acos와 같은 복잡한 기능에 대한 속도와 정밀도 사이에는 균형이 있습니다. –

+0

@Peter Cordes 0.01 % ~ 0.5 %의 정밀도이면 충분합니다. 정지 기준에 근사치가 있다면 이것은 유연한 방법으로 결정될 수 있습니까? – juergi

답변

4

역 코사인 0.0 이상 .. sqrt(1 - x) * pi/2 같은 1.0 외모 정확히 물론, 그러나 여기 보상 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); 
} 

다항식되었다 PI의 0 차 계수를 고정함으로써/2와 최소 제곱합을 적용하여 다른 것을 찾는다. 따라서 이것은 최소 최대 다항식이 아니며, 아마도 더 우수한 다항식을 찾을 수 있습니다. MSVC2017에서 std::acosf으로 철저히 비교했습니다 (단, std::acosf 자체의 정확도는 지정되지 않음). 최대 절대 오류는 8.45194e-05이며 예를 들어 0.106028에 발생합니다. 최대 상대 오차는 1.87481e-04이며 1에 가깝지만 발생합니다.

+0

매력처럼 작동합니다 (상자에서!). – juergi