ホームページ > バックエンド開発 > C++ > AVX2 を使用してメモリから 8 文字をパックされた単精度浮動小数点として __m256 変数にロードするにはどうすればよいですか?

AVX2 を使用してメモリから 8 文字をパックされた単精度浮動小数点として __m256 変数にロードするにはどうすればよいですか?

DDD
リリース: 2024-10-31 21:43:02
オリジナル
786 人が閲覧しました

How to Load 8 Characters from Memory into an __m256 Variable as Packed Single Precision Floats Using AVX2?

8 文字をメモリからパックされた単精度浮動小数点数として __m256 変数にロード

ガウス ブラー アルゴリズムでは、より高速な実行のための最適化を実現できます。データをベクトルレジスタに効率的にロードすることによって。このような最適化の 1 つは、float の配列を __m256 変数に置き換えることです。この記事では、AVX2 命令の機能を活用して、このタスクに最適なソリューションを提供します。

AVX2 命令を使用したソリューション

8 文字をメモリから __m256 変数に効果的にロードするにはAVX2 を使用する場合は、次の命令が推奨されます。

VPMOVZXBD  ymm0,  [rsi]  ; or SX to sign-extend  (Byte to DWord)
VCVTDQ2PS   ymm0, ymm0     ; convert to packed foat
ログイン後にコピー

命令の詳細

  • VPMOVZXBD: 8 ビット文字を 32 ビットにゼロ拡張します。
  • VCVTDQ2PS: 32 ビット整数をパックされた単精度浮動小数点数に変換し、ymm0 に直接格納します。

追加の最適化

このプロセスをさらに最適化するには、ブロードキャスト ロードを使用して VPMOVZXBD 命令と上位 64 ビットの Vpshufb 命令を供給することを検討してください。この戦略により全体の uop 数が削減され、効率が向上します。

<code class="pseudocode">__m256 b = [float(new_image[x+7]), float(new_image[x+6]), ... , float(new_image[x])];
__m256 b = _mm256_broadcast_ss(&new_image[x])
_mm256_shuffle_epi8(b, _mm256_set1_epi8(0)); // fills upper 64 bits with zeroes
_mm256_cvtps_epu32(b); // convert to integers
_mm256_cvtepu32_ps(b); // convert back to floats</code>
ログイン後にコピー

次善の手法を回避する

  • 複数の 128 ビットまたは 256 ビットのロードの使用を回避し、不要なボトルネックが発生する可能性があるため、後続のシャッフルは実行しないでください。
  • 最適ではないコード生成につながるため、VPMOVZXD 命令の後に VPMOVZX 用の別個のメモリ オペランドを使用しないでください。

その他の考慮事項

  • メモリ アライメントや初期化されていないメモリへのアクセスに関する潜在的な問題を回避するために、利用可能な場合は安全な組み込み関数を使用することを検討してください。
  • ロードを回避するには、適切な _mm_loadl_epi64 または _mm_loadu_si64 組み込み関数を使用してください。必要以上のデータ、または潜在的なセグメンテーション違反の原因となります。

以上がAVX2 を使用してメモリから 8 文字をパックされた単精度浮動小数点として __m256 変数にロードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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