avx512中比较内在指令的不同语义?

时间:2018-01-04 15:59:21

标签: c++ sse intrinsics avx avx512

使用sse2或avx比较操作返回所有零或全部的位掩码(例如_mm_cmpge_pd返回__m128d。

我找不到avx512的等价物。比较操作似乎只返回短位掩码。语义是否发生了根本变化,或者我遗漏了什么?

1 个答案:

答案 0 :(得分:5)

是的,AVX512的语义略有不同。比较指令将结果返回到掩码寄存器中。这有几个优点:

  • (8)掩码寄存器与// do comparison, store results in mask register __mmask8 k = _mm512_cmp_pd_mask(...); // broadcast a mask of all ones to a vector register, then use the mask // register to zero out the elements that have a mask bit of zero (i.e. // the corresponding comparison was false) __m512d k_like_sse = _mm512_maskz_mov_pd(k, (__m512d) _mm512_maskz_set1_epi64(0xFFFFFFFFFFFFFFFFLL)); 寄存器集完全分开,因此您不会为了比较结果而浪费向量寄存器。
  • 几乎整个AVX512指令集都有屏蔽版本,让您在使用比较结果时具有很大的灵活性。

与传统的SSE / AVX实施相比,它需要稍微不同的代码,但它并不是太糟糕。

修改:如果您想模仿旧行为,可以执行以下操作:

_mm512_movm_epi64()

可能有一种更优化的方法,但我自己使用AVX512相对较新。所有的掩码都可以预先计算并重复使用,因此您只需添加一个额外的蒙版移动指令来生成您正在寻找的矢量结果。

编辑2:正如Peter Cordes在下面的评论中所建议的那样,您可以使用// do comparison, store results in mask register __mmask8 k = _mm512_cmp_pd_mask(...); // expand the mask to all-0/1 masks like SSE/AVX comparisons did __m512d k_like_sse = (__m512d) _mm512_movm_epi64(k); 来简化以上内容:

img-responsive