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

Different semantic of comparison intrinsic instructions in avx512?

对于 sse2 或 avx 比较操作是 returning 位掩码的全零或全一(例如 _mm_cmpge_pd returns a __m128d.

我找不到与 avx512 等效的软件。比较操作似乎只有 return 短位掩码。语义是否发生了根本性变化,还是我遗漏了什么?

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

  • (8) 个掩码寄存器完全独立于 [xyz]mm 寄存器组,因此您不会为比较结果浪费向量寄存器。
  • 几乎整个 AVX512 指令集都有屏蔽版本,让您可以灵活地使用比较结果。

它确实需要与遗留 SSE/AVX 实现略有不同的代码,但还不错。

编辑:如果你想模仿旧的行为,你可以这样做:

// 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 还比较陌生。所有的掩码都可以预先计算和重复使用,所以你基本上只是添加一个额外的掩码移动指令来生成你正在寻找的向量结果。

编辑 2: 正如 Peter Cordes 在下面的评论中所建议的,您可以使用 _mm512_movm_epi64() 来进一步简化上面的内容:

// 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);