左パッキング問題
入力配列と出力配列があり、条件を満たす特定の要素のみが必要であるというシナリオを考えてみましょう。出力配列に書き込まれます。 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 で効率的な左パッキングを実現できます。テクニック:
アルゴリズム
AVX2 の左パッキングのアルゴリズムには、次の手順が含まれます。
結論
このアプローチは、非常に効率的なソリューションを提供します。 AVX2の左パッキン用。 vpermps、pext、およびその他の BMI2 命令を利用することで、最小限のオーバーヘッドと遅延でマスクに基づいてデータをパックすることができます。
以上がマスクを付けたままの梱包で AVX2 を最も効率的に使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。