使用 sse2 或 avx 比较操作返回全零或全一的位掩码(例如 _mm_cmpge_pd 返回一个 __m128d。
我找不到 avx512 的等价物。比较操作似乎只返回短位掩码。语义是否发生了根本变化,还是我遗漏了什么?
使用 sse2 或 avx 比较操作返回全零或全一的位掩码(例如 _mm_cmpge_pd 返回一个 __m128d。
我找不到 avx512 的等价物。比较操作似乎只返回短位掩码。语义是否发生了根本变化,还是我遗漏了什么?
是的,AVX512 中的语义有点不同。比较指令在掩码寄存器中返回结果。这有几个优点:
[xyz]mm
,因此您不会为比较结果浪费一个向量寄存器。与传统的 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);