ホームページ >バックエンド開発 >C++ >マスクを付けたままの梱包で AVX2 を最も効率的に使用するにはどうすればよいですか?

マスクを付けたままの梱包で AVX2 を最も効率的に使用するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-22 16:39:10727ブラウズ

How Can AVX2 Be Used Most Efficiently for Left Packing with a Mask?

左パッキング問題

入力配列と出力配列があり、条件を満たす特定の要素のみが必要であるというシナリオを考えてみましょう。出力配列に書き込まれます。 AVX2 を使用してこれを実現する最も効率的なアプローチは何ですか?

SSE アプローチ

SSE アプローチでは、_mm_movemask_ps を使用して入力マスクから 4 ビット マスクを抽出します。次に、このマスクを使用して、_mm_load_si128 でシャッフル コントロール データを生成します。最後に、_mm_shuffle_epi8 を使用して値を並べ替え、SIMD レジスタの先頭に有効な要素を配置します。このアプローチは、16 エントリのルックアップ テーブル (LUT) を備えた 4 ワイド SSE ベクトルに適しています。

AVX の制限

ただし、8 ワイド AVX の場合は、ベクトルの場合、LUT はそれぞれ 32 バイトの非常に多くのエントリ (256) を必要とし、結果として 8k のメモリ使用量が発生します。 AVX が、パッキングによるマスクされたストアなど、このプロセスを簡素化するための命令を提供していないことは驚くべきことです。

AVX2 ソリューション

専用の命令がないにもかかわらずを組み合わせて使用​​すると、AVX2 で効率的な左パッキングを実現できます。テクニック:

  • 変数シャッフルに vpermps を使用する: _mm256_permutevar8x32_ps を使用すると、レーン交差変数シャッフルを実行でき、マスクに基づいてデータをパックできます。
  • その場でマスクを生成します: BMI2 は、入力マスクからビットを抽出し、シャッフル制御データを生成するために使用できる pext (Parallel Bits Extract) 命令を提供します。
  • AMD CPU では pdep/pext を使用しないでください: AMD Zen 3 より前の CPU では、pdep と pext のレイテンシが大幅に高くなるため、最適化するには代替アプローチが必要になる場合があります。パフォーマンス。

アルゴリズム

AVX2 の左パッキングのアルゴリズムには、次の手順が含まれます。

  1. 入力からインデックスを抽出するpext を使用してマスクします。
  2. インデックスをアンパックしてシャッフルを生成しますマスク。
  3. vpermps を使用して、シャッフル マスクに従って入力データをシャッフルします。

結論

このアプローチは、非常に効率的なソリューションを提供します。 AVX2の左パッキン用。 vpermps、pext、およびその他の BMI2 命令を利用することで、最小限のオーバーヘッドと遅延でマスクに基づいてデータをパックすることができます。

以上がマスクを付けたままの梱包で AVX2 を最も効率的に使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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