対数計算は、さまざまな科学および工学アプリケーションで不可欠です。この記事では、Advanced Vector Extensions 2 (AVX2) を使用した 4 要素の倍精度浮動小数点ベクトルに対する効率的な log2() 関数の実装について説明します。
Intel のScalable Vector Math Library (SVML) は組み込み関数 __m256d を提供します_mm256_log2_pd (__m256d a) は、4 ビット ベクトルに対して log2 演算を実行します。ただし、この組み込み関数は Intel コンパイラでのみ使用可能であり、AMD プロセッサではパフォーマンス上の欠点があることが報告されています。
コンパイラ固有の組み込み関数に依存せずに log2() を実装するには、次のようにします。多項式近似を利用します。 log2(x) は、x = 1 の周囲で展開されたテイラー級数として表現できます。より具体的には、複数の多項式項を使用して、[1.0, 2.0] の範囲で log2(仮数部) を近似できます。
次の C 実装は、AVX2 とカスタム多項式近似:
__m256d __vectorcall Log2(__m256d x) { // Extract exponent and normalize it // Calculate t=(y-1)/(y+1) and t**2 // Calculate log2(y) and add exponent return log2_x; }
使用された近似式は次のように視覚化できます:
多項式係数は次のように適合されました。範囲 [1.0, 2.0].
ベンチマークは、この実装が std::log2() と std::log() の両方を大幅に上回り、std の約 4 倍のパフォーマンスを達成していることを示しています。 ::log2().
実装の精度は、さらに多項式項を追加することで調整できます。ただし、多項式の次数を増やすと浮動小数点演算の数が増加し、パフォーマンスが低下する可能性があります。
提供されている log2() の AVX2 実装は、ベクトル化された対数計算に高い効率とパフォーマンスを提供します。 。この関数は、カスタム多項式近似を活用することにより、4 ビット倍精度浮動小数点ベクトルでの log2 演算のための移植可能で効率的なソリューションを提供します。
以上がAVX2 を使用して log2(__m256d) を効率的に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。