add SparseLU in sparse bench

This commit is contained in:
Desire NUENTSA 2012-09-10 12:41:26 +02:00
parent 5433986f5a
commit 2c99d84133
5 changed files with 363 additions and 827 deletions

File diff suppressed because it is too large Load Diff

View File

@ -27,8 +27,10 @@
#define EIGEN_ORDERING_H
#include "Amd.h"
#include "Eigen_Colamd.h"
namespace Eigen {
#include "Eigen_Colamd.h"
namespace internal {
/**
@ -131,18 +133,18 @@ class COLAMDOrdering
int n = mat.cols();
int nnz = mat.nonZeros();
// Get the recommended value of Alen to be used by colamd
int Alen = eigen_colamd_recommended(nnz, m, n);
int Alen = internal::colamd_recommended(nnz, m, n);
// Set the default parameters
double knobs [EIGEN_COLAMD_KNOBS];
int stats [EIGEN_COLAMD_STATS];
eigen_colamd_set_defaults(knobs);
double knobs [COLAMD_KNOBS];
int stats [COLAMD_STATS];
internal::colamd_set_defaults(knobs);
int info;
IndexVector p(n+1), A(Alen);
for(int i=0; i <= n; i++) p(i) = mat.outerIndexPtr()[i];
for(int i=0; i < nnz; i++) A(i) = mat.innerIndexPtr()[i];
// Call Colamd routine to compute the ordering
info = eigen_colamd(m, n, Alen, A.data(), p.data(), knobs, stats);
info = internal::colamd(m, n, Alen, A.data(), p.data(), knobs, stats);
eigen_assert( info && "COLAMD failed " );
perm.resize(n);

View File

@ -205,7 +205,7 @@ class SparseLU
void initperfvalues()
{
m_perfv.panel_size = 12;
m_perfv.relax = 6;
m_perfv.relax = 1;
m_perfv.maxsuper = 100;
m_perfv.rowblk = 200;
m_perfv.colblk = 60;

View File

@ -55,6 +55,12 @@ if(PASTIX_FOUND AND BLAS_FOUND)
set(PASTIX_ALL_LIBS ${PASTIX_LIBRARIES} ${BLAS_LIBRARIES})
endif(PASTIX_FOUND AND BLAS_FOUND)
if(METIS_FOUND)
include_directories(${METIS_INCLUDES})
set (SPARSE_LIBS ${SPARSE_LIBS} ${METIS_LIBRARIES})
add_definitions("-DEIGEN_METIS_SUPPORT")
endif(METIS_FOUND)
find_library(RT_LIBRARY rt)
if(RT_LIBRARY)
set(SPARSE_LIBS ${SPARSE_LIBS} ${RT_LIBRARY})
@ -66,11 +72,6 @@ target_link_libraries (spbenchsolver ${SPARSE_LIBS})
add_executable(spsolver sp_solver.cpp)
target_link_libraries (spsolver ${SPARSE_LIBS})
if(METIS_FOUND)
include_directories(${METIS_INCLUDES})
set (SPARSE_LIBS ${SPARSE_LIBS} ${METIS_LIBRARIES})
add_definitions("-DEIGEN_METIS_SUPPORT")
endif(METIS_FOUND)
add_executable(test_sparseLU test_sparseLU.cpp)
target_link_libraries (test_sparseLU ${SPARSE_LIBS})

View File

@ -21,9 +21,14 @@
#include <unsupported/Eigen/IterativeSolvers>
#include <Eigen/LU>
#include <unsupported/Eigen/SparseExtra>
#include <Eigen/SparseLU>
#include "spbenchstyle.h"
#ifdef EIGEN_METIS_SUPPORT
#include <Eigen/MetisSupport>
#endif
#ifdef EIGEN_CHOLMOD_SUPPORT
#include <Eigen/CholmodSupport>
#endif
@ -45,26 +50,27 @@
#endif
// CONSTANTS
#define EIGEN_UMFPACK 0
#define EIGEN_SUPERLU 1
#define EIGEN_PASTIX 2
#define EIGEN_PARDISO 3
#define EIGEN_BICGSTAB 4
#define EIGEN_BICGSTAB_ILUT 5
#define EIGEN_GMRES 6
#define EIGEN_GMRES_ILUT 7
#define EIGEN_SIMPLICIAL_LDLT 8
#define EIGEN_CHOLMOD_LDLT 9
#define EIGEN_PASTIX_LDLT 10
#define EIGEN_PARDISO_LDLT 11
#define EIGEN_SIMPLICIAL_LLT 12
#define EIGEN_CHOLMOD_SUPERNODAL_LLT 13
#define EIGEN_CHOLMOD_SIMPLICIAL_LLT 14
#define EIGEN_PASTIX_LLT 15
#define EIGEN_PARDISO_LLT 16
#define EIGEN_CG 17
#define EIGEN_CG_PRECOND 18
#define EIGEN_ALL_SOLVERS 19
#define EIGEN_UMFPACK 10
#define EIGEN_SUPERLU 20
#define EIGEN_PASTIX 30
#define EIGEN_PARDISO 40
#define EIGEN_SPARSELU_COLAMD 50
#define EIGEN_SPARSELU_METIS 51
#define EIGEN_BICGSTAB 60
#define EIGEN_BICGSTAB_ILUT 61
#define EIGEN_GMRES 70
#define EIGEN_GMRES_ILUT 71
#define EIGEN_SIMPLICIAL_LDLT 80
#define EIGEN_CHOLMOD_LDLT 90
#define EIGEN_PASTIX_LDLT 100
#define EIGEN_PARDISO_LDLT 110
#define EIGEN_SIMPLICIAL_LLT 120
#define EIGEN_CHOLMOD_SUPERNODAL_LLT 130
#define EIGEN_CHOLMOD_SIMPLICIAL_LLT 140
#define EIGEN_PASTIX_LLT 150
#define EIGEN_PARDISO_LLT 160
#define EIGEN_CG 170
#define EIGEN_CG_PRECOND 180
using namespace Eigen;
using namespace std;
@ -188,6 +194,17 @@ void printStatheader(std::ofstream& out)
out << " <PACKAGE> EIGEN </PACKAGE> \n";
out << " </SOLVER> \n";
out <<" <SOLVER ID='" << EIGEN_SPARSELU_COLAMD << "'>\n";
out << " <TYPE> LU_COLAMD </TYPE> \n";
out << " <PACKAGE> EIGEN </PACKAGE> \n";
out << " </SOLVER> \n";
#ifdef EIGEN_METIS_SUPPORT
out <<" <SOLVER ID='" << EIGEN_SPARSELU_METIS << "'>\n";
out << " <TYPE> LU_METIS </TYPE> \n";
out << " <PACKAGE> EIGEN </PACKAGE> \n";
out << " </SOLVER> \n";
#endif
out << " </AVAILSOLVER> \n";
}
@ -325,8 +342,19 @@ void SelectSolvers(const SparseMatrix<Scalar>&A, unsigned int sym, Matrix<Scalar
call_directsolver(solver, EIGEN_PARDISO, A, b, refX,statFile);
}
#endif
// Eigen SparseLU METIS
cout << "\n Solving with Sparse LU AND COLAMD ... \n";
SparseLU<SpMat, COLAMDOrdering<int> > solver;
call_directsolver(solver, EIGEN_SPARSELU_COLAMD, A, b, refX, statFile);
// Eigen SparseLU METIS
#ifdef EIGEN_METIS_SUPPORT
{
cout << "\n Solving with Sparse LU AND METIS ... \n";
SparseLU<SpMat, MetisOrdering<int> > solver;
call_directsolver(solver, EIGEN_SPARSELU_METIS, A, b, refX, statFile);
}
#endif
//BiCGSTAB
{