ホームページ > バックエンド開発 > C++ > インテルのコンパイラーに依存せずに AVX2 に log2(__m256d) を効率的に実装するにはどうすればよいですか?

インテルのコンパイラーに依存せずに AVX2 に log2(__m256d) を効率的に実装するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-15 12:03:10
オリジナル
950 人が閲覧しました

How to Efficiently Implement log2(__m256d) in AVX2 without Intel's Compiler Dependencies?

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

AVX2 のコンテキストでは、Intel の __m256d _mm256_log2_pd (__m256d a) 関数は、Intel 以外の他のコンパイラと互換性がありません。報告によると、パフォーマンスの低下が見られるAMDプロセッサ。これに対処するために、効率性と広範な互換性を提供する代替実装を検討してみましょう。

log2 近似の戦略

通常、log2(ab) は log2(a) log2 として計算されます。 (b)。 a は 2^ 指数 の仮数で表されるため、計算は指数 log2(仮数) に単純化されます。仮数の範囲が制限されている (1.0 ~ 2.0) ため、log2(仮数) を計算するための調整された多項式近似が可能です。

多項式近似

テイラー級数展開は係数の開始点として一般的に使用されますが、ターゲット範囲にわたる誤差を最小限に抑えるには、ミニマックス フィッティングをお勧めします。 1.0 に近い値の精度を高めるには、仮数 1.0 を多項式の入力として使用し、定数項の必要性を排除できます。

精度に関する考慮事項

必要な精度レベルは、実装の選択に影響します。 。通常、精度を高めると、計算ステップが追加されるため、速度が犠牲になります。 Agner Fog の VCL ライブラリは、高精度の関数を提供しますが、すべてのアプリケーションに必須ではない複雑な技術を採用しています。

log2 の VCL アルゴリズム

VCL の log2 関数には、次の手順が含まれます:

  1. 指数ビットを抽出して、 float.
  2. 仮数を [0.5, 1.0) または (0.5, 1.0] に調整し、その後 1.0 で減算します。
  3. 多項式近似を適用して、x=1.0 付近の log(x) を計算します。 、単一の 5 次多項式 (double) または 2 つの 5 次多項式の比率を使用します。多項式 (浮動小数点)。
  4. 指数 Polynomial_estimate_log(mantissa) を追加して、最終結果を取得します。

精度と速度を向上させる手順

精度を向上するには:

  • より正確なツールの使用を検討してください。多項式近似。
  • 潜在的な精度損失を減らすために、1.0 による減算を避けてください (仮数 - 1.0 のままにしておきます)。

速度を最適化するには:

  • 切り捨てを使用します。より少ない多項式近似用語。
  • ベクトル化された命令を使用して、複数の値を同時に処理します。
  • 入力値が有限で正であることがわかっている場合、特殊なケース (アンダーフロー、オーバーフロー、非正規化など) に対する不必要なチェックを排除します。

以上がインテルのコンパイラーに依存せずに AVX2 に log2(__m256d) を効率的に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート