armadillo линейный разреженный системный решатель с использованием LAPACK и SuperLU

Я попытался решить разреженную линейную систему с помощью библиотеки 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опцией в spsolve see here, время выполнения 4.01 seconds. Может кто-нибудь объяснить почему:

  1. Решение той же системы уравнений занимает больше времени SuperLu, чем LAPACK?
    моя догадка заключается в том, что они могут использовать различные алгоритмы для решения разреженной линейной системы. Любая другая идея приветствуется!

Edit: я работаю на Ubuntu 14.04 с export OPENBLAS_NUM_THREADS=4.

1 ответ

  1. Плотность матрицы слишком велика, что делает ее почти плотной.

    Плотный алгоритм LAPACK способен использовать многие оптимизации векторизации и кэширования. Разреженный алгоритм более сложен, чем плотная факторизация LU. Он выполняет инициализации и пытается использовать разреженность матрицы. Если матрица почти плотная, то более простой прямой алгоритм становится быстрее.

    Я ожидал бы, что SuperLU будет иметь лучшую производительность для значений плотности ниже 0.3-0.4.

    Также для хранения матрицы с плотностью=0.7 требуется больше памяти в разреженном формате.
    Он должен хранить значения и их индексы.