Eigen `sum()` 函数在两个版本的程序中给出相同向量的不同

Eigen `sum()` function gives different for same vector in two versions of program

我正在使用 Eigen c++ 库进行线性代数运算。

我的代码中有一个变量vVectorXd类型的,我需要计算它的和,所以我调用了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 的单元测试中得到启发。