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



我正在使用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()会给出不同的结果呢?是因为特征执行了一些 SIMD 优化?

差异实际上可以忽略不计,但这会导致回归测试失败。

5gon12eder的评论是正确的。特征3.3 执行 AVX vctorization(如果可用)(一次执行 4 个双精度),而 SSE 仅在 Eigen3.2 中执行(一次 2 个双精度)。在任何情况下,在比较浮点数时都必须使用一些容差,以解决舍入误差。您可以从 Eigen 的单元测试中汲取灵感。

相关内容

  • 没有找到相关文章

最新更新