gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:34:32 35 4
gpt4 key购买 nike

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

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

最佳答案

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

  • (8) 个掩码寄存器完全独立于 [xyz]mm 寄存器集,因此您不会为比较结果浪费 vector 寄存器。
  • 几乎整个 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 还比较陌生。所有 1 的掩码都可以预先计算和重复使用,因此您基本上只是添加一个额外的掩码移动指令来生成您正在寻找的 vector 结果。

编辑 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);

关于c++ - avx512 中比较内在指令的不同语义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48099006/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com