gpt4 book ai didi

simd - AVX512中有没有像_mm512_sign_epi16 (__m512i a, __m512i b)这样的函数

转载 作者:行者123 更新时间:2023-12-02 00:49:45 25 4
gpt4 key购买 nike

以下功能似乎在 AVX512 上不可用:

__m512i _mm512_sign_epi16 (__m512i a, __m512i b)

它很快就会推出吗?或者有替代方案吗?

最佳答案

如果不需要清零部分,则只需要 2 条指令(和一个清零寄存器):

您可以_mm512_movepi16_mask()将符号位转换为掩码(pmovmskb 的 AVX512 版本),并根据另一个向量的符号从零进行合并掩码减法以求反一个向量。

#ifdef __AVX512BW__
// does *not* do anything special for signs[i] == 0, just negative / non-negative
__m512i conditional_negate(__m512i target, __m512i signs) {
__mmask32 negmask = _mm512_movepi16_mask(signs);
// vpsubw target{k1}, 0, target
__m512i neg = _mm512_mask_sub_epi16(target, negmask, _mm512_setzero_si512(), target);
return neg;
}
#endif

向量 -> 掩码在 Skylake-X 上有 3 个周期延迟(使用 vpmovw2mvptestmwvpcmpw),但使用掩码仅有另外 1 个周期的延迟。所以从输入到输出的延迟是:

  • signs 的 4 个周期 -> SKX 上的结果
  • target 开始 1 个周期 -> SKX 上的结果(只是从零开始的屏蔽 vpsubw。)
<小时/>

要同时应用 is-zero 条件:您可以对向量执行的下一个操作进行零掩码或合并掩码,因此本应为零的元素未被使用.

您需要额外的比较来创建另一个掩码,但您可能不需要需要浪费第二条额外的指令来立即应用它。

如果您确实想以这种方式构建一个独立的 vpsignw,我们可以进行最终的零掩码,但这是 4 个编译为 4 条指令的内部函数,对于吞吐量来说可能更差@wim 的最小/最大/乘法。但这具有良好的关键路径延迟,SKX 上总共大约有 5 个周期(如果您可以将最终掩蔽折叠到其他东西中,则为 4 个周期)。关键路径是signs->mask,然后是masked sub。 signs->nonzeromask 可以与其中任何一个并行运行。

__m512i  mm512_psignw(__m512i target, __m512i signs) {
__mmask32 negmask = _mm512_movepi16_mask(signs);
// vpsubw target{negmask}, 0, target merge masking to only modify elements that need negating
__m512i neg = _mm512_mask_sub_epi16(target, negmask, _mm512_setzero_si512(), target);

__mmask32 nonzeromask = _mm512_test_epi16_mask(signs,signs); // per-element non-zero?
return _mm512_maskz_mov_epi16(nonzeromask, neg); // zero elements where signs was zero
}

编译器可能可以将这个零屏蔽 vmovdqu16 内在函数折叠为 add/or /xor 的合并屏蔽code>,或乘法/的零掩码。但自己动手可能是个好主意。

关于simd - AVX512中有没有像_mm512_sign_epi16 (__m512i a, __m512i b)这样的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55742533/

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