AVX512 与矢量比较而不是屏蔽

问题描述

我错过了 avx2 中生成向量而不是掩码的比较指令。在 avx512 中完成同样事情的最有效方法是什么?是 _mm512_cmp_ps_mask 后跟展开吗?

解决方法

是的,我认为只是比较和 vpmovm2d,虽然很多时候你可以使用合并掩码或零掩码(可能使用 set1(-1) 常量)进行下一步,而不是你使用的任何内容要做一个向量。例如为了计算匹配项,而不是 _mm_sub_epi32() 与向量 0/-1 比较结果,只需执行合并掩码加法即可。

当然,对于 256 位向量,AVX2 比较指令仍然可用。可能不值得将 512 位向量的一半解包,但有时完全使用 AVX-512 避免 512 位向量是值得的(例如,避免在某些 CPU 上使用 clock-speed penalties,以及避免关闭端口 1 上的向量 ALU)。因此,您仍然可以利用 AVX-512 中有用的新指令,以及用于不需要与 VEX 编码的 AVX1/AVX2-only 指令一起使用的操作数的额外寄存器 (x/ymm16..31)。>

不过,在某些情况下,为了使用 512 位向量而接受需要将掩码转换回向量的惩罚可能是值得的。