Использование решателя pardiso с собственным

Я пытаюсь решить очень большие sparse matrix system (Ax = b) с eigen, используя решатель pardiso. Когда я компилирую код с g++, появляется эта ошибка:

In file included from ${Eigenroot}/Eigen/PardisoSupport:31,
                 from code.cpp:8:
${Eigenroot}/Eigen/src/PardisoSupport/PardisoSupport.h: In static member function 'static IndexType Eigen::internal::pardiso_run_selector<IndexType>::run(void*, IndexType, IndexType, IndexType, IndexType, IndexType, void*, IndexType*, IndexType*, IndexType*, IndexType, IndexType*, IndexType, void*, void*) [with IndexType = int]':
${Eigenroot}/Eigen/src/PardisoSupport/PardisoSupport.h:269:   instantiated from 'Derived& Eigen::PardisoImpl<Derived>::compute(const typename Eigen::internal::pardiso_traits<Derived>::MatrixType&) [with Derived = Eigen::PardisoLU<Eigen::SparseMatrix<double, 0, int> >]'
${Eigenroot}/Eigen/src/PardisoSupport/PardisoSupport.h:409:   instantiated from 'Eigen::PardisoLU<_MatrixType>::PardisoLU(const MatrixType&) [with MatrixType = Eigen::SparseMatrix<double, 0, int>]'
code.cpp:82:   instantiated from here
${Eigenroot}/Eigen/src/PardisoSupport/PardisoSupport.h:50: error: cannot convert 'int*' to 'const long long int*' for argument '2' to 'void pardiso(void*, const long long int*, const long long int*, const long long int*, const long long int*, const long long int*, const void*, const long long int*, const long long int*, long long int*, const long long int*, long long int*, const long long int*, void*, void*, long long int*)'

Я думал, что мне не нужно менять форму sparse matrices', но похоже, что мне нужно изменить форму разреженной матрицы, которая должна соответствовать pardiso. Но когда я нашел чужой пример кода, они не изменили форму sparse matrix. И вроде тоже работает.

Я правильно понимаю? Я не уверен. Кто-нибудь может сказать мне, в чем проблема?

(Что касается A и B, они не связаны с этой проблемой. Потому что я получил ответ с помощью sparseLU, который является встроенным решателем от eigen. Но скорость была слишком низкой, я пытаюсь использовать pardisoLU.)

#include <iostream>
#include <fstream>
#include <string>
#include <Eigen/Sparse>
#include <unsupported/Eigen/SparseExtra>
#include <Eigen/PardisoSupport>

using namespace std;
using namespace Eigen;
typedef Eigen::Triplet<double> T;
typedef Eigen::SparseMatrix<double> SpMat;

int main(){ 
int m = 10000; // number of rows;
int n = 10000; // number of cols;
SpMat A(m,n); // declare sparse matrix A
//
make tripletlist
//
A.setFromTriplets(TripletList.begin(), TripletList.end());
SpMat B(m,1);
// 
insert values into B
//
PardisoLU< SparseMatrix<double> > solver( A );
x = solver.solve( B );
}

И скомпилируйте это с g++ как

g++ -I ${Eigenroot} -DEIGEN_USE_MKL_ALL -DMKL_ILP64 -m64 -I ${mklroot}/linux/mkl/include -o out.out code.cpp -L ${mklroot}/linux/mkl/lib/intel64 -Wl, -lmkl_intel_ilp64 -lmkl_gnu_thread -lmkl_core -lmkl_blacs_intelmpi_ilp64 -lgomp -lpthread -lm -ldl

person selee    schedule 22.10.2019    source источник
comment
Где вы объявили B и x? Или TripletList? Убедитесь, что код, который вы публикуете, отражает вашу проблему (не пропускайте важные части). Узнайте, как создать минимально воспроизводимый пример.   -  person chtz    schedule 22.10.2019
comment
На самом деле тройной список, B и x не имеют отношения к этой проблеме, поэтому я не включил эти части.   -  person selee    schedule 22.10.2019


Ответы (1)


вероятно, некоторые проблемы возникают при связывании ILP64. Не могли бы вы попробовать связать без опции -DMKL_ILP64 и с -lmkl_intel_lp64 вместо -lmkl_intel_ilp64?

person Gennady.F    schedule 22.10.2019
comment
Я попробовал // g++ -I ${Eigenroot} -DEIGEN_USE_MKL_ALL -m64 -I ${mklroot}/linux/mkl/include out.out code.cpp -L ${mklroot}/linux/mkl/lib/intel64 -Wl, -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core -lmkl_blacs_intelmpi_ilp64 -lgomp -lpthread -lm -ldl // Но также получил эти ошибки.. /usr/bin/ld: : Нет такого файла: Нет такого файла или каталога collect2: ld вернул 1 статус выхода - person selee; 27.10.2019