我尝试使用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
。有人可以解释原因:
编辑:我正在使用export OPENBLAS_NUM_THREADS=4
在Ubuntu 14.04上运行。
答案 0 :(得分:0)
基质的密度太大,几乎变得密集。
LAPACK的密集算法能够使用许多矢量化和缓存优化。稀疏算法比密集LU分解更复杂。它执行初始化并尝试利用矩阵的稀疏性。如果矩阵几乎密集,则更简单的直接算法变得更快。
我希望SuperLU在密度值低于0.3-0.4时具有更好的性能。
同样存储密度= 0.7的矩阵需要以稀疏格式存储更多内存。 它需要存储值及其索引。