Eigen :: PardisoLU (MKL) в параллельном сценарии

Я пытаюсь использовать 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);
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]