ホームページ >バックエンド開発 >C++ >Intel プロセッサと AMD プロセッサの両方で AVX2 に log2(__m256d) を効率的に実装するにはどうすればよいですか?

Intel プロセッサと AMD プロセッサの両方で AVX2 に log2(__m256d) を効率的に実装するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-27 15:49:10628ブラウズ

How Can We Efficiently Implement log2(__m256d) in AVX2 for Both Intel and AMD Processors?

AVX2 での log2(__m256d) の効率的な実装

SVML の __m256d _mm256_log2_pd (__m256d a) は Intel コンパイラに限定されており、AMD プロセッサでは速度が低下すると報告されています。代替実装は存在しますが、多くの場合、AVX2 ではなく SSE に重点が置かれています。この説明の目的は、さまざまなコンパイラと互換性があり、AMD プロセッサと Intel プロセッサの両方で良好に動作する、4 つの倍精度数値のベクトルに対する log2() の効率的な実装を提供することです。

従来の戦略

通常のアプローチでは、公式 log2(a*b) = log2(a) log2(b) を活用し、指数に単純化します。倍精度数値の場合は log2(仮数)。仮数の範囲は 1.0 ~ 2.0 に制限されており、log2(仮数) を取得するための多項式近似に適しています。

精度と精度

必要な精度と精度入力の範囲は実装に影響します。 Agner Fog の VCL は、エラー回避技術を使用して高精度を目指しています。ただし、近似 float log() を高速化するには、JRF の多項式実装を検討してください (こちら: http://jrfonseca.blogspot.ca/2008/09/fast-sse2-pow-tables-or-polynomials.html)。

VCL アルゴリズム

VCL log float 関数と double 関数は 2 つの部分からなるアプローチに従います:

  1. 指数と仮数の抽出: 指数は float に変換され、仮数は次のチェックで調整されます。 SQRT2*0.5 より小さい値。これに続いて、仮数から 1.0 が減算されます。
  2. 多項式近似: 調整された仮数に多項式近似が適用され、x=1.0 付近の log(x) が計算されます。倍精度の場合、VCL は 2 つの 5 次多項式の比率を使用します。

最終結果は、多項式近似に指数を加算することによって取得されます。 VCL には、丸め誤差を最小限に抑えるための追加の手順が含まれています。

代替多項式近似

精度を高めるために、VCL を直接使用できます。ただし、float の近似 log2() 実装を高速化するには、JRF の SSE2 関数を FMA を使用して AVX2 に移植することを検討してください。

丸め誤差の回避

VCL はさまざまな手法を使用して丸め誤差を軽減します。丸め誤差。

  • ln2 をより小さな定数 (ln2_lo と ln2_hi) に分割する
  • 行 res = nmul_add(x2, 0.5, x); を追加します。多項式評価へ

不要なステップの削除

値が有限で正であることがわかっている場合、次のチェックをコメントアウトすることでパフォーマンスを大幅に向上させることができます。アンダーフロー、オーバーフロー、または非正規化。

さらに読書

  • [ミニマックス誤差を伴う多項式近似](http://gallium.inria.fr/blog/fast-vectorizable-math-estimate/)
  • [ビットを使用した高速近似対数]操作](http://www.machinedlearnings.com/2011/06/fast-estimate-logarithm-exponential.html)

以上がIntel プロセッサと AMD プロセッサの両方で AVX2 に log2(__m256d) を効率的に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。