AVX2で利用可能な条件付き命令のリストはありますか? は、これまでのところ私は、次を発見しました:マスクc
AVX2の条件付き命令
に基づいa
とb
からの選択のための
_mm256_blendv_
*は条件付き乗算と条件の追加、などのようなものはありますか?imm8
(_mm256_blend_
*など)の命令を使用すると、ベクター比較後にimm8
を取得する方法を説明できますか?
AVX2で利用可能な条件付き命令のリストはありますか? は、これまでのところ私は、次を発見しました:マスクc
AVX2の条件付き命令
に基づいa
とb
からの選択のための
_mm256_blendv_
*は条件付き乗算と条件の追加、などのようなものはありますか? imm8
(_mm256_blend_
*など)の命令を使用すると、ベクター比較後にimm8
を取得する方法を説明できますか?
AVX512では、ほぼすべての命令に対してオプションのゼロマスキングとマージマスキングが導入されています。その前に
、(結果に代わりvblendvps
の)1(vandps
または逆のためvandnps
付き)オペランド前にアドオンをマスクし、条件の追加を行います。これは、packed-compare命令/組み込み関数がすべて0または1つの要素を生成する理由です。
0.0
は付加的な識別要素なので、追加することはできません。 (-0.0と+0.0のIEEEセマンティクスを除いて、私はそれがどのように正確に動作するか忘れてしまいます)。
結果をブレンドするのではなく定数入力をマスキングすると、条件付きで1.0
を追加するなど、クリティカルパスを長くする必要がなくなります。 0.0
は乗法のアイデンティティではないので
条件付き乗算はより厄介です。値を変更しないで保存するには、1.0
を掛ける必要があります。比較結果をANDまたはANDNで簡単に生成することはできません。入力をブレンドすることもできますし、出力を乗算してブレンドすることもできます。
ブレンドvの代わりにAND/ANDN/ORのような少なくとも3つのブール値がありますが、それは通常それに値するものではありません。 Haswellはポート5の場合、vblendvps
とvpblendvb
を2 uopsとして実行するため、任意のポートで実行できる整数ブール値を使用する場合と比較して潜在的なボトルネックになります。スカイレイクは、vblendvps
を2ポートで実行します。しかし、クリティカルパスでブレンドするのを避けるために何かをするのは理にかなっています。
入力オペランドをマスキングするか、結果をブレンドするのは、一般的にブランチスSIMD条件を実行する方法です。
BLENDVは通常少なくとも2ユーロですので、ANDよりも遅いです。
即時ブレンドimm8
ブレンドコントロールが命令のマシンコードに埋め込まれたコンパイル時定数なければならないので、はるかに効率的ですが、あなたはそれらを使用することはできません。それは何ですかはアセンブリ言語の文脈での意味です。
インテルイントリンシックスガイドでは、マスクを使用して収集、ロード、および保管することを提案しています。 blend_epi16の即時imm8は、自己修正コードまたはジャンプテーブルをオプションと見なさない限り、プログラム可能ではありません。 movemaskの結果から奇数の位置にあるビットの半分をコンパクトにするためにBMI2からpextを使用することは引き続き可能です.1つはAVX2のmovemaskから32の独立したマスクビットを取得しますが、blend_epi16は各ビットを使用して4バイトを制御します。各銀行の変数。
[すべてのAVX2組み込み関数はこちら](https://software.intel.com/sites/landingpage/IntrinsicsGuide/#techs=AVX2)それはあなたが質問の最初の部分で求めていることですか?私たちは実際にここで "リスト"スタイルの質問をしません。 –
@CodyGray、私はこれらのページを積極的に使っていますが、私が挙げたもの以外は何も見つかりませんでした。おそらく私は何かを逃した。私はリストが短い、多分5つの項目、おそらくそれ以上の項目であると期待します。だから私はその質問があまりにも広範ではないと思う。そして、組み込み関数が何をしているのかを記述する必要はありません(ドキュメンテーションの検索方法が分かれば、ドキュメントから読むことができます)。 'imm8'を使うバージョンのように、原則的にそれらをどのように使うか。 –