编写代码来检查两个双精度值是否足够不同
simd code to check if two double values are sufficiently different
假设我有两个双精度值old和new。我想实现一个向量化函数返回旧的if abs(x-y) <</P>
下面是代码(test.cpp):#include <emmintrin.h>
#include <iostream>
#define ARRAY_LENGTH 2
int main(void) {
// x = old value, y = new value, res = result
double *x, *y, *res;
posix_memalign((void **)&x, 16, sizeof(double) * ARRAY_LENGTH);
posix_memalign((void **)&y, 16, sizeof(double) * ARRAY_LENGTH);
posix_memalign((void **)&res, 16, sizeof(double) * ARRAY_LENGTH);
double p = 1e-4; // precision
__m128d sp = _mm_set1_pd(p);
x[0] = 1.5; y[0] = 1.50011; // x - old value, y - new value
x[1] = 2.; y[1] = 2.0000001;
__m128d sx = _mm_load_pd(x);
__m128d sy = _mm_load_pd(y);
// sign mask to compute fabs()
__m128d sign_mask = _mm_set1_pd(-0.);
// |x-y|
__m128d absval = _mm_andnot_pd(sign_mask, _mm_sub_pd(sx, sy) );
// mask of |x-y| < p
__m128d mask = _mm_cmplt_pd(absval, sp);
// sres = |x-y| < p ? x : y;
__m128d sres = _mm_or_pd(
_mm_and_pd(mask, sx), _mm_andnot_pd(mask, sy) );
_mm_store_pd(res, sres);
std::cerr << "res=" << res[0] << "," << res[1] << std::endl;
return 0;
}
构建:
g++ -std=c++11 -msse4 test.cpp
我们首先计算fab (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));
另一种方法-使用AVX或/和单精度
相关文章:
- 检查是否以特定精度给出双精度
- 使用 int32_t 而不是双精度运行矢量点积是否更快?
- 从双精度转换为整数的显式类型是否始终检查整数溢出?
- 什么样的 GCC 优化可能会根据是否打印来更改双精度?
- 是否应该避免这种从 int 到双精度的静态转换?
- C++ 测试以查看双 * 双精度是否会溢出uint64_t
- 如何确定以浮点数、双精度位数为单位的有效宽度:是否有标准定义?
- C# 是否有办法将双精度数组强制转换为类似于C++转换为 char* 的字符串?
- 如何检查字符串输入是否为有效的双精度
- 如何查找输入的双精度是否为0.05的倍数
- 是否有可以将每个双精度转换为唯一uint64_t,保持精度和顺序的功能?(为什么我找不到?
- 将整数除法到整数是否需要强制转换以浮点数或双精度以更精确
- 是否有用于双精度平方根反比的快速 C 或 C++ 标准库函数
- 标准库是否提供检查双精度值是否与整数相同的函数
- 在C++中对数字数组进行排序时,是否必须将字符串转换为双精度
- 如何静态检查模板的类型 T 是否为 std::vector<U>,其中 U 是浮点数、双精度数或积分
- IEEE-754浮点、双精度和四精度是否保证-2、-1、-0、0、1、2的精确表示
- 如何检查字符串是否可以转换为双精度C++
- 在 C 和 C++ 中,for 循环是否可以将双精度值作为索引
- C++ 测试双精度是否 #INF