Я пытаюсь использовать Eigen (3.3.1 или 3.3.2) с решателем MKL PardisoLU компании INTEL.
Я использую флаг EIGEN_USE_MKL_ALL и у меня установлен IntelSWTools 2017.
В настоящее время пробовал только на Win10 с VS C ++, но это не целевая платформа.
Сам решатель работает значительно быстрее, чем SparseLU, что приятно (мне интересно использовать очень большие матрицы).
Однако в параллельном сценарии это не решает мою проблему правильно. Нет такой проблемы со SparseLU или когда я удаляю параллелизм верхнего уровня (комментируя pragma parallel for
ниже).
Сам PardisoLU должен быть безопасным для потоков, так что я делаю не так?
Сценарий очень кратко, как следующий
#include <Eigen/PardisoSupport>
#define N = 100000
typedef Eigen::Matrix<Complex, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor> FullMatrix;
typedef Eigen::SparseMatrix<Complex, Eigen::ColMajor, long long> SparseMatrix;
typedef Eigen::PardisoLU<SparseMatrix> Solver;
//typedef Eigen::SparseLU<SparseMatrix, Eigen::COLAMDOrdering< long long>> Solver;
Eigen::initParallel();
SparseMatrix A = CreateA();
Solver S;
S.analyzePattern(A);
S.factorize(A);
FullMatrix Q(A.rows(),N);
#pragma omp parallel for
for (int n = 0; n < N; ++n)
{
SparseMatrix Rhs = getRhs(n);
Q.col(n) = S.Solve(Rhs);
}
Задача ещё не решена.
Других решений пока нет …