- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下功能似乎在 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 个周期延迟(使用 vpmovw2m
、vptestmw
或 vpcmpw
),但使用掩码仅有另外 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/
我是一名优秀的程序员,十分优秀!