web-dev-qa-db-fra.com

Implémentation la plus rapide de la fonction exponentielle en utilisant SSE

Je cherche une approximation de la fonction exposant opérant sur SSE élément. A savoir - __m128 exp( __m128 x ).

J'ai une implémentation rapide mais qui semble très faible en précision:

static inline __m128 FastExpSse(__m128 x)
{
    __m128 a = _mm_set1_ps(12102203.2f); // (1 << 23) / ln(2)
    __m128i b = _mm_set1_epi32(127 * (1 << 23) - 486411);
    __m128  m87 = _mm_set1_ps(-87);
    // fast exponential function, x should be in [-87, 87]
    __m128 mask = _mm_cmpge_ps(x, m87);

    __m128i tmp = _mm_add_epi32(_mm_cvtps_epi32(_mm_mul_ps(a, x)), b);
    return _mm_and_ps(_mm_castsi128_ps(tmp), mask);
}

Quelqu'un pourrait-il avoir une implémentation avec une meilleure précision mais aussi rapide (ou plus rapide)?

Je serais heureux si j'écrivais en style C.

Merci.

13
Royi

Il existe un article sur la création de versions rapides de ces équations (tanh, cosh, artanh, sinh, etc.):

http://ijeais.org/wp-content/uploads/2018/07/IJAER180702.pdf "Création d'une implémentation en ligne optimisée par compilateur d'Intel Svml Simd Intrinsics"

leur équation de tanh 6, à la page 9 est très similaire à la réponse @NicSchraudolph

1
Kari