您能否列出AVX2中可用的条件指令列表? 到目前为止,我发现了以下内容:
_mm256_blendv_
*可根据a
b
和c
进行选择
有条件乘法和条件加法等吗?
另外,如果指示imm8
计数(如_mm256_blend_
*),您能解释一下如何在矢量比较后得到imm8
吗?
答案 0 :(得分:3)
Intel Intrinsics Guide建议使用掩码收集,加载和存储操作。 blend_epi16中的立即imm8不可编程,除非自修改代码或跳转表被认为是一种选择。仍然可以使用来自BMI2的pext来从移动掩码的结果中压缩一半奇数位 - 一个从AVX2中的移动掩码获得32个独立的掩码位,但blend_epi16使用每个位来控制四个字节 - 或者一个16位每个银行都有变数。
答案 1 :(得分:1)
AVX512为几乎所有指令引入了可选的零屏蔽和合并屏蔽。
在此之前,要进行条件添加,请在添加之前屏蔽一个操作数(使用vandps
或vandnps
进行反向)(而不是vblendvps
在结果上)。这就是打包比较指令/内在函数产生全零或全一元素的原因。
0.0
是附加标识元素,因此添加它是无操作。 (除了IEEE语义-0.0和+0.0之外,我忘记了它是如何工作的。)
屏蔽常量输入而不是混合结果可以避免使关键路径更长,例如有条件地添加1.0
。
条件乘法更麻烦,因为0.0
不是乘法身份。您需要乘以1.0
以保持值不变,并且您不能使用带有比较结果的AND或ANDN轻松生成该值。你可以混合输入,或者你可以进行乘法和混合输出。
blendv的替代方案是至少3个布尔值,如AND / ANDN / OR,但这通常不值得。虽然请注意Haswell为端口5运行vblendvps
和vpblendvb
为2 uop,但与使用可在任何端口上运行的整数布尔相比,它是一个潜在的瓶颈。 Skylake为任何端口运行它们vblendvps
为2 uop。但是,做一些事情以避免在关键路径上使用blendv是有意义的。
屏蔽输入操作数或混合结果通常是指无分支SIMD条件的方法。
BLENDV通常至少为2 uops,因此它比AND慢。
立即混合效率更高,但您无法使用它们,因为 imm8
混合控件必须是嵌入到指令机器代码中的编译时常量。这就是 immediate 在汇编语言环境中的含义。