web-dev-qa-db-ja.com

SSEを使用した指数関数の最速の実装

SSE element。すなわち__m128 exp( __m128 x )で動作する指数関数の近似を探しています。

迅速な実装ですが、精度が非常に低いようです。

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);
}

誰かがより高速で(またはより速く)より良い精度で実装できるでしょうか?

Cスタイルで書いて頂ければ幸いです。

ありがとうございました。

13
Royi

これらの方程式(tanh、cosh、artanh、sinhなど)の高速バージョンの作成に関する論文があります。

http://ijeais.org/wp-content/uploads/2018/07/IJAER180702.pdf 「インテルSvml Simd組み込み関数のコンパイラー最適化インライン化実装の作成」

それらのtanh方程式6、9ページは@NicSchraudolphの回答に非常に似ています

1
Kari