稀疏超大型线性方程组求解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LaineGates/article/details/83717714

笔者近期工作需要求解线性方程组,但基本不懂线程方程组求解,本来寄希望于Eigen,结果发现

  1. 稠密矩阵方面,Eigen在功能还算全面(虽然经网友对比,Eigen慢于OpenBLAS和Intel MKL),
  2. 稀疏矩阵方面,着实差了点,自带的几个求解器,按官网推荐,尝试了SimplicialLLT和BiCGSTAB ,笔者的方程组严格对称且对角线绝对占优,但SimplicialLLT慢得不能用,BiCGSTAB直接算不过去。

我只能放弃用Eigen自带的稀疏方程求解器。幸好Eigen支持很多第三方求解器。列在这个页面

在网上搜索了下,得到了简单的对比详细对比,还有一些讨论帖,帖1帖2帖3。大体有Intel MKL、PETSc 、Trilinos、UMFPACK、SUPERLU、SuiteSparse和cuSPARSE。
由于有了Eigen的初级使用经验,想着还是少写代码为妙,于是我还是想选Eigen给了支持的,那么Intel MKL 和SuiteSparse成为了选择。

以下均在程序中使用12000*12000的矩阵测试,但这个矩阵以12X12的子矩阵为子单元,绝大部分是空的。目前程序中使用的算法是定制的SOR算法,矩阵大时计算太慢,做为基准,在算例中计算大约30次只要41秒左右。

测试Intel MKL

使用Intel MKL请看网友的VS2015+Intel MKL+Eigen的安装与混合编程
Eigen提供了封装类 PardisoLLT 、PardisoLDLT 和 PardisoLU。都是稀疏矩阵直接法求解器,前两个Cholesky 分解,最后一个LU分解。
我测试了下PardisoLDLT,同样场景需要30秒左右。
除了速度,我想让算法可运行在其他处理器上,所以用不成了。

测试 SuiteSparse

那么选择只剩下SuiteSparse,这个库是由众多作者写的,每个求解器都有各自的liscene,一定要看清楚啊。原始代码只能在类unix系统(unix、linux、mac)上使用,要在windows使用,需要借助cmake封装接口来完成windows版本的编译,找到教程1教程2
我看了下SuiteSparse的liscene,比较复杂,只列举了部分:

组件名 协议 算例速度 支持GPU 备注
CHOLMOD GPL&LGPL 16秒 底层代码GPL
CCOLAMD BSD-3
CAMD BSD-3
COLAMD BSD-3
CSparse LGPL
CXSparse LGPL
SPQR GPL 计算结果无效 GPL
GPUQREngine GPL

问下对方程求解有些了解的人,得到回复,我要解的方程是稀疏矩阵,使用直接法求解效果不好,而且矩阵分解会让零元变成非零元,计算成本增加很多。建议我找迭代法求解,最好是分块的迭代求解算法。

猜你喜欢

转载自blog.csdn.net/LaineGates/article/details/83717714