C++ 用于检查两个双精度值是否足够不同的simd代码

C++ 用于检查两个双精度值是否足够不同的simd代码,c++,simd,absolute-value,C++,Simd,Absolute Value,假设我有两个双重值,旧值和新值。 我想实现一个矢量化函数 如果abs(x-y)

假设我有两个双重值,旧值和新值。 我想实现一个矢量化函数 如果abs(x-y) 下面是代码(test.cpp):

我们首先计算fabs(x-y),与p进行比较,然后使用 获得面具


有没有人能找到一种更有效的编码方法?谢谢。

有一种方法可以使此算法稍微快一点,但它会降低精度:

// d = x - y;
__m128d diff = _mm_sub_pd(sx, sy);
// mask of |y - x| < p
__m128d mask = _mm_cmplt_pd(_mm_andnot_pd(sign_mask, diff), sp);
// sres = y + (|y - x| < p) ? (x - y) : 0;
__m128d sres = _mm_add_pd(sy, _mm_and_pd(mask, diff));
//d=x-y;
__m128d差异=_mm_sub_pd(sx,sy);
//|y-x |

另一种方法-使用AVX或/和单精度。

您可以尝试使用
BLENDVPD
\u mm\u BLENDVPD
),看看是否可以获得更好的性能。很好,谢谢。我不知道这条指令。@ElderBug:blendv指令通常翻译成3个UOP,所以我想它在吞吐量方面不会更快。
g++ -std=c++11 -msse4 test.cpp
// d = x - y;
__m128d diff = _mm_sub_pd(sx, sy);
// mask of |y - x| < p
__m128d mask = _mm_cmplt_pd(_mm_andnot_pd(sign_mask, diff), sp);
// sres = y + (|y - x| < p) ? (x - y) : 0;
__m128d sres = _mm_add_pd(sy, _mm_and_pd(mask, diff));