AVX2中的条件指令

时间:2017-08-23 18:12:04

标签: conditional vectorization x86-64 instruction-set avx2

您能否列出AVX2中可用的条件指令列表? 到目前为止,我发现了以下内容:

  • _mm256_blendv_ *可根据a
  • bc进行选择

有条件乘法和条件加法等吗?

另外,如果指示imm8计数(如_mm256_blend_ *),您能解释一下如何在矢量比较后得到imm8吗?

2 个答案:

答案 0 :(得分:3)

Intel Intrinsics Guide建议使用掩码收集,加载和存储操作。 blend_epi16中的立即imm8不可编程,除非自修改代码或跳转表被认为是一种选择。仍然可以使用来自BMI2的pext来从移动掩码的结果中压缩一半奇数位 - 一个从AVX2中的移动掩码获得3​​2个独立的掩码位,但blend_epi16使用每个位来控制四个字节 - 或者一个16位每个银行都有变数。

答案 1 :(得分:1)

AVX512为几乎所有指令引入了可选的零屏蔽和合并屏蔽。

在此之前,要进行条件添加,请在添加之前屏蔽一个操作数(使用vandpsvandnps进行反向)(而不是vblendvps在结果上)。这就是打包比较指令/内在函数产生全零或全一元素的原因。

0.0是附加标识元素,因此添加它是无操作。 (除了IEEE语义-0.0和+0.0之外,我忘记了它是如何工作的。)

屏蔽常量输入而不是混合结果可以避免使关键路径更长,例如有条件地添加1.0

条件乘法更麻烦,因为0.0不是乘法身份。您需要乘以1.0以保持值不变,并且您不能使用带有比较结果的AND或ANDN轻松生成该值。你可以混合输入,或者你可以进行乘法和混合输出。

blendv的替代方案是至少3个布尔值,如AND / ANDN / OR,但这通常不值得。虽然请注意Haswell为端口5运行vblendvpsvpblendvb为2 uop,但与使用可在任何端口上运行的整数布尔相比,它是一个潜在的瓶颈。 Skylake为任何端口运行它们vblendvps为2 uop。但是,做一些事情以避免在关键路径上使用blendv是有意义的。

屏蔽输入操作数或混合结果通常是指无分支SIMD条件的方法。

BLENDV通常至少为2 uops,因此它比AND慢。

立即混合效率更高,但您无法使用它们,因为 imm8混合控件必须是嵌入到指令机器代码中的编译时常量。这就是 immediate 在汇编语言环境中的含义。