2016-10-04 85 views
0

我试图使用犰狳库来求解稀疏线性系统。使用LAPACK和SuperLU的犰狳线性稀疏系统求解器

#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。当在spsolvesee here中用LAPACK选项解决系统系统时,运行时间为4.01 seconds。有人可以解释为什么:

  1. 解决方案相同的系统需要比LAPACK更长的SuperLu? 我的直觉是他们可能会使用不同的算法来解决稀疏线性系统。欢迎任何其他想法!

编辑︰我运行在Ubuntu 14.04 export OPENBLAS_NUM_THREADS=4

回答

0

矩阵的密度太大,使其几乎密集。

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

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

还存储一个密度为0.7的矩阵需要稀疏格式更多的内存。 它需要存储值及其索引。

+0

我在[0,.7]中改变了密度,但结果是一样的。 SuperLU需要比LAPACK的密集LU分解更长的时间。 – chandresh

+0

@chandresh这很奇怪。 SuperLU时间不会改变?尝试使用矩阵大小10,000。 – ztik

+0

与上面相同的结论。 – chandresh