【问题标题】:Merge bit sequences a and b according to a mask根据掩码合并位序列a和b
【发布时间】:2017-01-09 23:55:32
【问题描述】:

根据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); 

允许根据掩码合并两个位序列ab。我想知道:

  1. 此操作是否有特定/常用名称?
  2. 在某些指令集上是否存在此操作的特定汇编指令?

【问题讨论】:

  • “在某些指令集上是否存在用于此操作的特定汇编指令?” - 我不知道有任何没有的指令集 具有 AND 和 XOR 操作。
  • 但也许有些架构在硬件中连接了此操作,以便在单个指令中完成此操作,而不是多个指令。
  • 对于Ternary Raster Operations,这是一个相当标准的计算,所以是的,我假设有专用电路可用。

标签: c++ assembly merge bitmask instruction-set


【解决方案1】:

我称之为位混合,使用 masked-xor 方法。相关:this Q&A 详细解释了这些布尔运算如何/为什么实现这一点。

在 SSE/AVX 编程中,基于掩码从一个向量选择性复制到另一个向量称为混合。 SSE4.1 增加了类似PBLENDVB xmm1, xmm2/m128, <XMM0> 的指令,其中隐式操作数 XMM0 控制 src 的哪些字节覆盖 dst 中的相应字节。 (如果没有 SSE4.1,您通常会将掩码 AND 和 ANDNOT 到两个向量上,然后将它们组合在一起;掩码异或技巧的指令级并行度较低,并且可能至少需要尽可能多的 MOV 指令来复制寄存器作为 OR 方法。)

还有一个立即混合指令pblendw,其中掩码是一个 8 位立即数而不是寄存器。还有 32 位和 64 位立即混合(blendpsblendpdvpblendd)和可变混合(blendvpsblendvpd)。

如果其他 SIMD 指令集(NEON、AltiVec、任何 MIPS 称之为它们的指令集等)也称它们为“混合”,则 IDK。


在 AVX512F 之前,SSE/AVX(或 x86 整数指令)没有提供比通常按位 XOR/AND 更好的方法来进行 按位(而不是按元素)混合。

AVX512F 可以使用单个 vpternlogdvpternlogq 指令执行此操作的按位版本(或任何其他按位三元函数)。 (d 和 q 元素大小之间的唯一区别是,如果您使用掩码寄存器对目标进行合并掩码或零掩码,但这并没有阻止英特尔即使在无掩码情况下也制作单独的内在函数:

__m512i _mm512_ternarylogic_epi32 (__m512i a, __m512i b, __m512i c, int imm8) 和等效的 ..._epi64 版本。

imm8 立即字节是一个真值表。目的地的每一位都是独立确定的,通过将它们用作真值表的 3 位索引,从 a、b 和 c 的相应位中确定。即imm8[a:b:c]

当 AVX512 最终出现在主流台式机/笔记本电脑 CPU 中时,它会很有趣,但这可能还需要几年时间。

【讨论】:

  • 我不明白为什么异或技巧不适用于向量?是的,您需要将蒙版扩展为与您正在混合的向量相同的大小,但对于 AND+ANDN+OR 解决方案也是如此吗?在任何情况下,与通常的方法相比,xor 只保存一个 not,所以如果你有 ANDN,优势就会消失(因为 not 被折叠到 and 中)。
  • @BeeOnRope: (a ^ b) 在元素内是按位的,这不是你想要的元素粒度混合。还是这一切最终都取消了? xor 方法我其实没仔细看!
  • 是的,但我指的是“没有 SSE 4.1”部分,您说通常的方法是使用 ANDN,因为 xor 技巧不适用。 xor 方法使用与 AND 方法完全相同的掩码类型(是的,两者都是位粒度的)。所以是的,如果你有一个 16 位掩码以及使用它来控制字节元素的 128 位混合,你需要将掩码中的每个位扩展为一个完整字节(0 或 255)——但两者都是如此方法。 xor 技巧在这里似乎同样适用(但在平局,而不是胜利,因为 ANDN 存在)。
  • @BeeOnRope:derp,我完全错过了异或版本在相同掩码下工作正常,AND/ANDN/XOR 方法也是按位的。
猜你喜欢
  • 2019-02-11
  • 2019-11-13
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
  • 1970-01-01
相关资源
最近更新 更多