2016-09-02 11 views
2

に従ってbit twiddling hacksウェブサイトによれば、操作マージビットは、aおよびbは、マスク

unsigned int a; // value to merge in non-masked bits 
unsigned int b; // value to merge in masked bits 
unsigned int mask; // 1 where bits from b should be selected; 0 where from a. 
unsigned int r; // result of (a & ~mask) | (b & mask) goes here 

r = a^((a^b) & mask); 

マスクに係る2つのビット系列abをマージすることを可能にする配列します。私は不思議に思っていた:

  1. この操作に特定の/通常の名前があったかどうか?
  2. 特定のアセンブリ命令がこの命令セットに存在していたかどうか。
+2

*「特定のアセンブリ命令がこの命令セットにこのオペレーションのために存在していたかどうか」* - 私は** ANDおよびXOR演算を持たない命令セットを知りません。 – IInspectable

+0

しかし、いくつかのアーキテクチャでは、ハードウェアでこの操作を配線して、複数のアーキテクチャではなく単一の命令で実行することができます。 – Vincent

+2

これは[Ternary Raster Operations](https://msdn.microsoft.com/en-us/library/dd145130.aspx)のかなり標準的な計算ですので、専用の回路が利用できると思います。 – IInspectable

答えて

2

SSE/AVXプログラミングでは、マスクに基づいて1つのベクトルから別のベクトルへの選択的コピーをブレンドと呼びます。 SSE4.1にはPBLENDVB xmm1, xmm2/m128, <XMM0>のような命令が追加されました。暗黙のオペランドXMM0は、srcのどのバイトがdstの対応するバイトを上書きするかを制御します。 (SSE4.1がなければ、ANDとANDNOTは2つのベクトルにマスクされ、ORは一緒になります; xorトリックは命令レベルの並列性が低く、レジスタをコピーするには少なくともMOV命令が必要です)

ダイレクトブレンド命令pblendwもあります。マスクはレジスタではなく8ビットの即値です。また、32ビットと64ビットの即時ブレンド(blendps,blendpd,vpblendd)と可変ブレンド(blendvps,)があります。

他のSIMD命令セット(NEON、AltiVec、MIPSがそれらを呼び出すものなど)が "ブレンド"とも呼ばれる場合は、IDK。


SSE/AVX(またはx86整数命令)は、ビット単位のXOR/AND AVX512Fまでブレンド(代わりに、要素単位での)ビット単位で行うため、通常よりももっと良いものを提供していません。

AVX512F単一vpternlogdまたはvpternlogq命令でこれのビット単位のバージョン(または他の任意のビット単位の三元機能)を行うことができます。 (dとqの要素サイズの唯一の違いは、マスクレジスタをマージマスキングまたはゼロマスキングに使用すると、インテルがマスクなしの場合でも個別のイントリンシックを作成することができなくなった場合です。

__m512i _mm512_ternarylogic_epi32 (__m512i a, __m512i b, __m512i c, int imm8)等価..._ EPI64バージョン。

imm8即値バイトは真理値表である。先のすべてのビットが3-としてそれらを使用することにより、BおよびCの対応するビットから、独立して決定されます真理値表にビットインデックスを設定するとimm8[a:b:c]

AVX512は、最終的にデスクトップ/ノートパソコンおそらく数年前のことです。

+0

xorのトリックがベクターではうまくいかない理由がわかりません。はい、ブレンドしているベクトルと同じサイズにマスクを展開する必要がありますが、AND + ANDN + ORソリューションでも同様です。いずれにしても、xorは通常の方法と比較して1つだけ「not」を保存するので、ANDNを使用すると利点が消えます(notはandに折りたたまれます)。 – BeeOnRope

+0

@BeeOnRope: '(a^b)'は要素内でビット単位であり、要素 - 細分性のブレンドには必要ありません。または、それはすべて最後にキャンセルされますか?私は実際にxorメソッドを非常に難しくしていませんでした! –

+1

はい、私は「SSE 4.1なし」の部分を指していますが、xorトリックは適用されないため、ANDNを使用するのが通常の方法でした。 xorメソッドは、ANDアプローチとまったく同じタイプのマスクで動作します(はい、どちらもビット粒度です)。したがって、16ビットのマスクを使用し、それを128ビットのブレンドを制御するために使用するには、マスクの各ビットをフルバイト(0または255)に展開する必要がありますが、それは両方に当てはまりますアプローチ。 xorトリックはここでも同じように見える(しかし、ANDNが存在するので、勝ちではない)。 – BeeOnRope

関連する問題