ホームページ  >  記事  >  バックエンド開発  >  8 文字をメモリから __m256 変数にロードする方法: 3 つの効率的なアプローチ

8 文字をメモリから __m256 変数にロードする方法: 3 つの効率的なアプローチ

Barbara Streisand
Barbara Streisandオリジナル
2024-11-03 15:52:02160ブラウズ

How to Load 8 Characters from Memory into an __m256 Variable: Three Efficient Approaches

メモリから __m256 変数への 8 文字のロード: 分析

問題:

アルゴリズムを最適化したい画像上のガウスぼかしの場合、float バッファ[8] を組み込みの __m256 変数に置き換えてパフォーマンスを向上させます。

解決策 1: AVX2 の PMOVZX と VCVTDQ2PS を使用する

これこのアプローチでは、PMOVZX を利用して 8 ビット文字を 32 ビット整数に拡張し、VCVTDQ2PS を通じてそれらを浮動小数点値に変換します。具体的には:

VPMOVZXBD   ymm0,  [rsi]   ; Byte to DWord
VCVTDQ2PS   ymm0, ymm0     ; convert to packed float

解決策 2: ブロードキャスト ロードとシャッフルの組み合わせ

この戦略には、128 ビットのブロードキャスト ロードを実行して 64 ビットのシャッフル制御ベクトルを生成することが含まれます。 vpshufb の場合、ゼロ拡張とパック浮動小数点変換が可能になります。追加のシャッフル命令の必要性を排除することで、高いスループットを実現します。

VPMOVSXBD   xmm0,  [rsi]   ; Byte to DWord
VPMOVSXBD   xmm1,  [rsi+4] 
VINSERTF128 ymm0, ymm0, xmm1, 1   
VCVTDQ2PS   ymm0, ymm0     ; convert to packed float.

解決策 3: AVX1 の制限事項に対処する

AVX2 がない場合は、次の手順を実行します。使用できます:

VPMOVZXBD   xmm0,  [rsi]
VPMOVZXBD   xmm1,  [rsi+4]
VINSERTF128 ymm0, ymm0, xmm1, 1   ; put the 2nd load of data into the high128 of ymm0
VCVTDQ2PS   ymm0, ymm0     ; convert to packed float.

追加メモ:

  • さらにパフォーマンスを向上させるには、VCVTDQ2PS の代わりに VPADDQ を使用することを検討してください。
  • 注意してくださいさまざまな言語でのコンパイラ最適化の可能性について説明します。
  • 追加の洞察については、ソリューション内にリンクされている特定のリソースを参照してください。

以上が8 文字をメモリから __m256 変数にロードする方法: 3 つの効率的なアプローチの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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