【问题标题】:armadillo linear sparse system solver using LAPACK and SuperLU使用 LAPACK 和 SuperLU 的犰狳线性稀疏系统求解器
【发布时间】:2016-10-04 11:10:20
【问题描述】:

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

 #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. 用 SuperLu 解决相同的方程组比 LAPACK 需要更长的时间? 我的预感是他们可能使用不同的算法来解决稀疏线性系统。欢迎任何其他想法!

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

【问题讨论】:

    标签: c++11 lapack armadillo blas


    【解决方案1】:

    矩阵的密度太大,几乎致密。

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

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

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

    【讨论】:

    • 我改变了 [0,.7] 的密度,但是,结果是一样的。 SuperLU 比 LAPACK 的密集 LU 分解需要更长的时间。
    • @chandresh 这很奇怪。 SuperLU时间不变?尝试使用大小为 10,000 的矩阵。
    • 同上结论。
    • 通过阅读 superlu 文档,它说 superlu 使用带有部分旋转的高斯消除 (GEPP) 来解决稀疏线性系统。与 LAPACK 使用的密集 LU 分解相比,我知道 GEPP 的时间复杂度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多