이미지의 모든 픽셀에 대해 acos 메서드를 호출해야합니다.avx256을 사용하는 acos 용 코드?
저는 avx2를 사용하고 있습니다.
intel C++ 컴파일러와 함께 제공되는 라이브러리와 별도로 acos에 _mm256 코드가 있습니까?
이미지의 모든 픽셀에 대해 acos 메서드를 호출해야합니다.avx256을 사용하는 acos 용 코드?
저는 avx2를 사용하고 있습니다.
intel C++ 컴파일러와 함께 제공되는 라이브러리와 별도로 acos에 _mm256 코드가 있습니까?
역 코사인 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에 가깝지만 발생합니다.
매력처럼 작동합니다 (상자에서!). – juergi
어떤 오류를 받아들입니까? acos와 같은 복잡한 기능에 대한 속도와 정밀도 사이에는 균형이 있습니다. –
@Peter Cordes 0.01 % ~ 0.5 %의 정밀도이면 충분합니다. 정지 기준에 근사치가 있다면 이것은 유연한 방법으로 결정될 수 있습니까? – juergi