Eigen `sum()` 函数在两个版本的程序中给出相同向量的不同
Eigen `sum()` function gives different for same vector in two versions of program
我正在使用 Eigen c++ 库进行线性代数运算。
我的代码中有一个变量v
是VectorXd
类型的,我需要计算它的和,所以我调用了v.sum()
。
然而,当我将我的程序更新到新版本时,虽然 v
的值保持不变(从相同的输入文件读取),但 sum()
函数稍微给出了
不同的值。
这里有一段代码解释了我的问题:
double vsum1 = v.sum();
double vsum2 = 0; // compare with manually calculated sum
for(size_t i = 0; i < v.size(); ++i)
{
vsum2 += v(i);
}
cout << "sum1: " << vsum1 << endl;
cout << "sum2: " << vsum2 << endl;
对于旧版本,结果是
sum1: 94.8117866666666487
sum2: 94.8117866666666202
对于新版本,结果是
sum1: 94.8117866666666345
sum2: 94.8117866666666202
手动计算的和vsum2
没有变化,所以我认为原向量v
没有改变,那为什么sum()
会给出不同的结果呢?是不是因为
Eigen 执行的一些 SIMD 优化?
差异实际上是可以忽略的,但这会导致回归测试失败。
5gon12eder 的评论是正确的。 Eigen3.3 执行 AVX vctorization(如果可用)(一次加倍 4),而仅在 Eigen3.2 中执行 SSE(一次加倍)。无论如何,在比较浮点数时必须使用一定的公差来解决舍入误差。你可以从 Eigen 的单元测试中得到启发。
我正在使用 Eigen c++ 库进行线性代数运算。
我的代码中有一个变量v
是VectorXd
类型的,我需要计算它的和,所以我调用了v.sum()
。
然而,当我将我的程序更新到新版本时,虽然 v
的值保持不变(从相同的输入文件读取),但 sum()
函数稍微给出了
不同的值。
这里有一段代码解释了我的问题:
double vsum1 = v.sum();
double vsum2 = 0; // compare with manually calculated sum
for(size_t i = 0; i < v.size(); ++i)
{
vsum2 += v(i);
}
cout << "sum1: " << vsum1 << endl;
cout << "sum2: " << vsum2 << endl;
对于旧版本,结果是
sum1: 94.8117866666666487
sum2: 94.8117866666666202
对于新版本,结果是
sum1: 94.8117866666666345
sum2: 94.8117866666666202
手动计算的和vsum2
没有变化,所以我认为原向量v
没有改变,那为什么sum()
会给出不同的结果呢?是不是因为
Eigen 执行的一些 SIMD 优化?
差异实际上是可以忽略的,但这会导致回归测试失败。
5gon12eder 的评论是正确的。 Eigen3.3 执行 AVX vctorization(如果可用)(一次加倍 4),而仅在 Eigen3.2 中执行 SSE(一次加倍)。无论如何,在比较浮点数时必须使用一定的公差来解决舍入误差。你可以从 Eigen 的单元测试中得到启发。