AVX2中的条件指令

问题描述:

您能给出AVX2中的条件指令列表吗? 到目前为止,我已经找到了以下内容:AVX2中的条件指令

  • _mm256_blendv_ *从ab选择基于面具c

是否有类似条件乘法和条件增加,等等?

此外,如果指令采取imm8计数(如_mm256_blend_ *),您可以解释如何在矢量比较后获得imm8

+0

[所有AVX2内部函数都在这里](https://software.intel.com/sites/landingpage/IntrinsicsGuide/#techs=AVX2)。这就是你在问题的第一部分所要求的吗?我们并不真正在这里做“列表”式的问题。 –

+0

@CodyGray,我正在积极使用这些页面,但除了我列出的内容之外找不到更多内容。也许我错过了一些东西。我预计这个列表很短,可能是5个项目,也许没有更多的项目。所以我认为这个问题不是太宽泛。而且没有必要描述内在函数在做什么(可以从文档中读取,一旦我知道如何搜索它们)。原则上如何使用它们就像使用'imm8'的版本一样。 –

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

在此之前,做一个条件增加,之前掩盖一个操作数(与vandpsvandnps的倒数)(对结果而不是vblendvps)的补充。这就是打包比较指令/内在函数生成全零或全部元素的原因。

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

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


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

blendv的替代方案至少有3个布尔值,比如AND/ANDN/OR,但这通常不值得。虽然请注意Haswell运行vblendvpsvpblendvb作为端口5的2个uops,因此与使用可在任何端口上运行的整数布尔值相比,这是一个潜在的瓶颈。 Skylake将它们作为任何端口的2个uops运行。尽管如此,尽量避免在关键路径上混合使用,这是有道理的。

掩盖输入操作数或混合结果通常是您如何执行无分支SIMD条件。

BLENDV通常至少有两个uops,所以它比AND慢。

立即混合效率要高得多,但不能使用它们,因为混合控制必须是编译时常量嵌入到指令的机器代码中。这就是立即意味着汇编语言的上下文。

Intel Intrinsics指南建议采用面罩进行收集,加载和存储操作。 blend_epi16中的立即imm8不可编程,除非将自修改代码或跳转表视为选项。仍然有可能从BMI2派生使用pext从movemask的结果中压缩奇数定位位的一半 - 在AVX2中从movemask获得32个独立掩码位,但blend_epi16使用每个位控制四个字节 - 或一个16位在每个银行变量。