【发布时间】:2020-10-31 16:07:14
【问题描述】:
我想根据它们的绝对值比较两个双精度向量。
也就是等价于以下的向量:
if (fabs(x) < fabs(y)) {
...
}
有什么比只取双方的absolute value 并跟进_mm256_cmp_pd 更好的方法吗?
对所有 AVX、AVX2 和 AVX-512 风格感兴趣。
【问题讨论】:
-
可能以下想法适用于 AVX-512,但我没有硬件来弄清楚细节:也许你可以使用
y_sgnx=_mm512_mask_ternarylogic_epi64(x,y,z,c8)、z=_mm512_set1_epi64(0x7FFFFFFFFFFFFFFFull)和c8这样y_sgnx与y相同,但符号位为x。将x和y_sgnx从 double 转换为epi64(_mm512_castpd_si512)。现在您可以使用无符号整数与x和y_sgnx(_mm512_cmp_epu64_mask) 进行比较来获得正确的掩码。另请参阅here -
另一个
ternarylogic的想法是从y中减去x,然后检查结果符号位是否等于x ^ y的符号 -
您有任何理由预计obvious
vandpd; vandpd; vcmpltpd会限制您的表现吗? -
@EOF 不,我没有。
标签: performance x86 floating-point simd avx