犰狳多线程线性求解产生不同的答案

计算科学 并行计算 矩阵 数字
2021-12-03 04:51:29

我正在研究一些问题,这些问题最终归结为一个超定方程组的简单组合,,其中对于我正在利用 Armadillo 的 C++ 库,我将其链接到 MKL。计算了我的训练数据的均方根误差,并注意到我的错误和解决方案xAx=bAm×nmnE=Axbmx每次测试都有显着变化(在第二个或第三个有效数字中,有时某些系数会偏离 2 倍)。这让我很困扰,所以我用 MKL_NUM_THREADS=1 运行应用程序,强制线程数减少到 1,每次运行时我都得到相同的答案(噪音差异很小,很远),错误E下降了几个数量级。

我使用非常简单的调用 arma::solve(X,A,B) 求解线性系统,其中X包含两列我们要求解的n系数,B包含两列m个数据点。条件数可能很大(忘记检查它),但它仍然在我猜测的“安全范围”之内(当我尝试使用它时,NumPy 的 linalg.lstsq 从未抱怨过)。

我猜这是我的矩阵汇编中的某个错误,或者我可能从根本上误解了犰狳使用的多线程 MKL。这是预期的行为还是代码中肯定有问题的迹象?

感谢您的任何建议!

1个回答

并行代码意味着您的矩阵和求解器中的任何其他浮点运算的求和顺序不同。如果条件数真的很差,那么您得到的矩阵和解决方案完全有可能因此受到特别的伤害。