使用LAPACK和SuperLU的犰狳线性稀疏系统求解器

时间:2016-10-04 11:10:20

标签: c++11 lapack armadillo blas

我尝试使用armadillo库解决稀疏线性系统。

 #include <iostream>
 #include<armadillo>
 using namespace std;
 using namespace arma;

int main(int argc, char** argv) {

int no_examples = 5000;
sp_mat A = sprandu<sp_mat>(no_examples,no_examples,0.7);
vec b = randu<vec>(no_examples);
wall_clock timer;
double t;
timer.tic();
vec x1 = spsolve(A, b,"superlu");
t= timer.toc();
cout<<"Elapsed time is:"<<t<<endl;
}

我使用g++ demo.cpp -O3 -I/usr/include/armadillo_bits -DARMA_DONT_USE_WRAPPER -lsuperlu -lopenblas -llapack编译了程序。使用superlu选项获得的运行时间约为8.5 seconds。在LAPACK see here中使用spsolve选项解析系统系统时,运行时间为4.01 seconds。有人可以解释原因:

  1. 通过SuperLu解决相同的方程组需要比LAPACK更长的时间吗? 我的预感是,他们可能正在使用不同的算法来解决稀疏线性系统。欢迎任何其他想法!
  2. 编辑:我正在使用export OPENBLAS_NUM_THREADS=4在Ubuntu 14.04上运行。

1 个答案:

答案 0 :(得分:0)

基质的密度太大,几乎变得密集。

LAPACK的密集算法能够使用许多矢量化和缓存优化。稀疏算法比密集LU分解更复杂。它执行初始化并尝试利用矩阵的稀疏性。如果矩阵几乎密集,则更简单的直接算法变得更快。

我希望SuperLU在密度值低于0.3-0.4时具有更好的性能。

同样存储密度= 0.7的矩阵需要以稀疏格式存储更多内存。 它需要存储值及其索引。