Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance AVX中绝对值的浮点比较_Performance_X86_Floating Point_Simd_Avx - Fatal编程技术网

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不,我不会。