Performance AVX中绝对值的浮点比较
我想根据两个向量的绝对值来比较它们 也就是说,向量等价于以下各项:Performance AVX中绝对值的浮点比较,performance,x86,floating-point,simd,avx,Performance,X86,Floating Point,Simd,Avx,我想根据两个向量的绝对值来比较它们 也就是说,向量等价于以下各项: if(晶圆厂(x)
if(晶圆厂(x)<晶圆厂(y)){
...
}
有什么比只接受双方的意见并用\u mm256\u cmp\u pd
跟进更好的方法吗
对所有AVX、AVX2和AVX-512版本感兴趣。使用AVX-512,您可以节省一个µop。您可以使用
vpternlogq
+vpcmpuq
。请注意,下面的解决方案假设数字为
不是一个NaN
IEEE-754浮点数具有很好的编码特性
如果x[62:0]
integer\u小于y[62:0]
,则作为浮点:
abs(x)或。
我不确定是否正确选择了常数z
和0xCA
\uuuu mmask8 cmplt\u通过ternlog(\uuuum512d x,\uuuuum512d y){
α-M512I席=MM512A CasdPdI-SI12(x);
__m512i-yi=_mm512_castpd_si512(x);
__m512i z=_mm512_set1_epi64(0x7fffffffffffull);
γ-M512I YIO-SGNX=MM512MynyLogyLogiMeL64(Z,Yi,席,0xCA);
返回_mm512_cmp_epu64_掩码(xi,yi_sgnx,1);/*_CMPINT\u LT*/
}
可能以下想法适用于AVX-512,但我没有硬件来弄清楚细节:也许你可以使用y\u sgnx=\u mm512\u mask\u ternarylogic\u epi64(x,y,z,c8)
,使用z=\u mm512\u set1\u epi64(0x7fffffffffffull)
,以及c8,这样y\u sgnx
与相同,但符号位为x
。将x
和y\u sgnx
从双精度转换为epi64
(\u mm512\u castpd\u si512
)。现在,您可以使用无符号整数与x
和y\u sgnx
(\u mm512\u cmp\u epu64\u mask
)进行比较,以获得正确的mask。另请参见另一个ternarylogic
思想,即从y
中减去x
,然后检查结果符号位是否等于x^y
的符号。您是否有任何理由期望vandpd;vandpd;vcmpltpd
会限制您的性能吗?@EOF不,我不会。