AVX512 与矢量比较不屏蔽
AVX512 compare to vector not to mask
我错过了 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 位向量而需要将掩码转换回向量的代价可能是值得的。
我错过了 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 位向量而需要将掩码转换回向量的代价可能是值得的。