根据bit twiddling hacks网站,操作
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);
允许根据掩码合并两个比特序列a
和b
。我在想:
答案 0 :(得分:2)
在SSE / AVX编程中,基于蒙版从一个矢量到另一个矢量的选择性复制称为混合。 SSE4.1添加了像PBLENDVB xmm1, xmm2/m128, <XMM0>
这样的指令,其中隐式操作数XMM0控制src的哪些字节覆盖dst中的相应字节。 (如果没有SSE4.1,你通常会将AND和ANDNOT掩码放在两个向量上,并且OR就在一起; xor技巧具有较少的指令级并行性,并且可能至少需要MOV指令的数量。复制寄存器。)
还有一个立即混合指令pblendw
,其中掩码是8位立即而不是寄存器。并且有32位和64位立即混合(blendps
,blendpd
,vpblendd
)和可变混合(blendvps
,blendvpd
)。
IDK,如果其他SIMD指令集(NEON,AltiVec,MIPS调用它们等等)也称它们为#34;混合&#34;或不。
SSE / AVX(或x86整数指令)在AVX512F之前不提供比通常的按位XOR / AND更好的方法来进行按位(而不是逐元素)混合。
AVX512F可以使用单个vpternlogd
或vpternlogq
指令执行此(或任何其他按位三元函数)的按位版本。 (d和q元素大小之间的唯一区别是,如果使用掩码寄存器进行合并屏蔽或对目标进行零屏蔽,但即使对于无掩码情况,这也不会阻止英特尔制作单独的内在函数:< / p>
__m512i _mm512_ternarylogic_epi32 (__m512i a, __m512i b, __m512i c, int imm8)
和等效的...... _ epi64版本。
imm8
立即字节是真值表。通过将它们用作真值表的3位索引,从a,b和c的相应位独立地确定目的地的每个位。即imm8[a:b:c]
。
AVX512在最终出现在主流台式机/笔记本电脑CPU中时会很有趣,但这可能还需要几年时间。