ホームページ > バックエンド開発 > C++ > AVX2 および BMI2 命令はマスクに基づいて左パッキングをどのように最適化できますか?

AVX2 および BMI2 命令はマスクに基づいて左パッキングをどのように最適化できますか?

Barbara Streisand
リリース: 2024-12-30 13:45:13
オリジナル
444 人が閲覧しました

How Can AVX2 and BMI2 Instructions Optimize Left Packing Based on a Mask?

マスクに基づいた効率的な左パッキングのための AVX2 と BMI2 の使用

AVX2 では、vpermps (_mm256_permutevar8x32_ps) 命令を利用して実行できます。車線横断可変シャッフル。さらに、BMI2 は pext (Parallel Bits Extract) を提供し、問題にとって重要なビット単位の抽出操作を実行できるようにします。

アルゴリズム:

  1. で始まります。パックされた 3 ビット インデックスを保持する定数 ([7 6 5 4 3 2 1 0]).
  2. pext を使用して、必要なインデックスを連続シーケンスに抽出します。
  3. 各ビットがインデックス バイトに対応するマスクを生成します (バイトごとにインデックスを 1 つずつアンパックします)。
  4. マスク内の各ビットを複製して、対応するバイトを埋めます。
  5. 必要なインデックスを抽出します。 pext を使用して ID シャッフルを行います。
  6. インデックス バイトを 32 ビット整数に変換します。
  7. vpermps を使用して、32 ビット インデックス ベクトルに基づいてシャッフルを実行します。

コード実装:

#include <stdint.h>
#include <immintrin.h>

__m256 compress256(__m256 src, unsigned int mask)
{
  uint64_t expanded_mask = _pdep_u64(mask, 0x0101010101010101);
  expanded_mask *= 0xFF;
  const uint64_t identity_indices = 0x0706050403020100;
  uint64_t wanted_indices = _pext_u64(identity_indices, expanded_mask);

  __m128i bytevec = _mm_cvtsi64_si128(wanted_indices);
  __m256i shufmask = _mm256_cvtepu8_epi32(bytevec);

  return _mm256_permutevar8x32_ps(src, shufmask);
}
ログイン後にコピー

利点:

  • 即時定数を使用し、メモリの負荷を回避します。
  • シンプルさと

欠点:

  • Zen 3 より前の AMD CPU では、pdep/pext のパフォーマンスが遅いため、速度が遅くなる可能性があります。

以上がAVX2 および BMI2 命令はマスクに基づいて左パッキングをどのように最適化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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