我正在使用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()
会给出不同的结果呢?是因为特征执行了一些 SIMD 优化?
差异实际上可以忽略不计,但这会导致回归测试失败。
5gon12eder的评论是正确的。特征3.3 执行 AVX vctorization(如果可用)(一次执行 4 个双精度),而 SSE 仅在 Eigen3.2 中执行(一次 2 个双精度)。在任何情况下,在比较浮点数时都必须使用一些容差,以解决舍入误差。您可以从 Eigen 的单元测试中汲取灵感。