2016-10-04 78 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