aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Desire NUENTSA <desire.nuentsa_wakam@inria.fr>2012-09-04 12:21:07 +0200
committerGravatar Desire NUENTSA <desire.nuentsa_wakam@inria.fr>2012-09-04 12:21:07 +0200
commit2280f2490e802320838f8e51884abe8667a6112d (patch)
tree199c5f95ceb47f73e0ad6193ac68f10a618f629d
parent2e38666d01e395ecb4ffb41e3d031aff1f984308 (diff)
Init perf values
-rw-r--r--Eigen/src/SparseLU/SparseLU.h37
-rw-r--r--Eigen/src/SparseLU/SparseLU_Structs.h12
-rw-r--r--Eigen/src/SparseLU/SparseLU_panel_bmod.h4
-rw-r--r--bench/spbench/test_sparseLU.cpp10
4 files changed, 35 insertions, 28 deletions
diff --git a/Eigen/src/SparseLU/SparseLU.h b/Eigen/src/SparseLU/SparseLU.h
index 997f4e352..6a6579493 100644
--- a/Eigen/src/SparseLU/SparseLU.h
+++ b/Eigen/src/SparseLU/SparseLU.h
@@ -204,12 +204,12 @@ class SparseLU
// Functions
void initperfvalues()
{
- m_panel_size = 12;
- m_relax = 6;
- m_maxsuper = 100;
- m_rowblk = 200;
- m_colblk = 60;
- m_fillfactor = 20;
+ m_perfv.panel_size = 12;
+ m_perfv.relax = 6;
+ m_perfv.maxsuper = 100;
+ m_perfv.rowblk = 200;
+ m_perfv.colblk = 60;
+ m_perfv.fillfactor = 20;
}
// Variables
@@ -231,14 +231,7 @@ class SparseLU
bool m_symmetricmode;
// values for performance
- int m_panel_size; // a panel consists of at most <panel_size> consecutive columns
- int m_relax; // To control degree of relaxing supernodes. If the number of nodes (columns)
- // in a subtree of the elimination tree is less than relax, this subtree is considered
- // as one supernode regardless of the row structures of those columns
- int m_maxsuper; // The maximum size for a supernode in complete LU
- int m_rowblk; // The minimum row dimension for 2-D blocking to be used;
- int m_colblk; // The minimum column dimension for 2-D blocking to be used;
- int m_fillfactor; // The estimated fills factors for L and U, compared with A
+ LU_perfvalues m_perfv;
RealScalar m_diagpivotthresh; // Specifies the threshold used for a diagonal entry to be an acceptable pivot
int m_nnzL, m_nnzU; // Nonzeros in L and U factors
@@ -374,10 +367,10 @@ void SparseLU<MatrixType, OrderingType>::factorize(const MatrixType& matrix)
int m = m_mat.rows();
int n = m_mat.cols();
int nnz = m_mat.nonZeros();
- int maxpanel = m_panel_size * m;
+ int maxpanel = m_perfv.panel_size * m;
// Allocate working storage common to the factor routines
int lwork = 0;
- int info = LUMemInit(m, n, nnz, lwork, m_fillfactor, m_panel_size, m_glu);
+ int info = LUMemInit(m, n, nnz, lwork, m_perfv.fillfactor, m_perfv.panel_size, m_glu);
if (info)
{
std::cerr << "UNABLE TO ALLOCATE WORKING MEMORY\n\n" ;
@@ -401,7 +394,7 @@ void SparseLU<MatrixType, OrderingType>::factorize(const MatrixType& matrix)
ScalarVector dense;
dense.setZero(maxpanel);
ScalarVector tempv;
- tempv.setZero(LU_NUM_TEMPV(m, m_panel_size, m_maxsuper, m_rowblk) );
+ tempv.setZero(LU_NUM_TEMPV(m, m_perfv.panel_size, m_perfv.maxsuper, m_perfv.rowblk) );
// Compute the inverse of perm_c
PermutationType iperm_c(m_perm_c.inverse());
@@ -409,9 +402,9 @@ void SparseLU<MatrixType, OrderingType>::factorize(const MatrixType& matrix)
// Identify initial relaxed snodes
IndexVector relax_end(n);
if ( m_symmetricmode == true )
- LU_heap_relax_snode<IndexVector>(n, m_etree, m_relax, marker, relax_end);
+ LU_heap_relax_snode<IndexVector>(n, m_etree, m_perfv.relax, marker, relax_end);
else
- LU_relax_snode<IndexVector>(n, m_etree, m_relax, marker, relax_end);
+ LU_relax_snode<IndexVector>(n, m_etree, m_perfv.relax, marker, relax_end);
m_perm_r.resize(m);
@@ -499,7 +492,7 @@ void SparseLU<MatrixType, OrderingType>::factorize(const MatrixType& matrix)
{ // Work on one panel of panel_size columns
// Adjust panel size so that a panel won't overlap with the next relaxed snode.
- int panel_size = m_panel_size; // upper bound on panel width
+ int panel_size = m_perfv.panel_size; // upper bound on panel width
for (k = jcol + 1; k < std::min(jcol+panel_size, n); k++)
{
if (relax_end(k) != IND_EMPTY)
@@ -515,7 +508,7 @@ void SparseLU<MatrixType, OrderingType>::factorize(const MatrixType& matrix)
LU_panel_dfs(m, panel_size, jcol, m_mat, m_perm_r.indices(), nseg1, dense, panel_lsub, segrep, repfnz, xprune, marker, parent, xplore, m_glu);
// Numeric sup-panel updates in topological order
- LU_panel_bmod(m, panel_size, jcol, nseg1, dense, tempv, segrep, repfnz, m_glu);
+ LU_panel_bmod(m, panel_size, jcol, nseg1, dense, tempv, segrep, repfnz, m_perfv, m_glu);
// Sparse LU within the panel, and below the panel diagonal
for ( jj = jcol; jj< jcol + panel_size; jj++)
@@ -526,7 +519,7 @@ void SparseLU<MatrixType, OrderingType>::factorize(const MatrixType& matrix)
//Depth-first-search for the current column
VectorBlock<IndexVector> panel_lsubk(panel_lsub, k, m);
VectorBlock<IndexVector> repfnz_k(repfnz, k, m);
- info = LU_column_dfs(m, jj, m_perm_r.indices(), m_maxsuper, nseg, panel_lsubk, segrep, repfnz_k, xprune, marker, parent, xplore, m_glu);
+ info = LU_column_dfs(m, jj, m_perm_r.indices(), m_perfv.maxsuper, nseg, panel_lsubk, segrep, repfnz_k, xprune, marker, parent, xplore, m_glu);
if ( info )
{
std::cerr << "UNABLE TO EXPAND MEMORY IN COLUMN_DFS() \n";
diff --git a/Eigen/src/SparseLU/SparseLU_Structs.h b/Eigen/src/SparseLU/SparseLU_Structs.h
index 4b4dfdc77..7b3aa250c 100644
--- a/Eigen/src/SparseLU/SparseLU_Structs.h
+++ b/Eigen/src/SparseLU/SparseLU_Structs.h
@@ -88,4 +88,16 @@ struct LU_GlobalLU_t {
Index n; // Number of columns in the matrix
int num_expansions;
};
+
+// Values to set for performance
+struct LU_perfvalues {
+ int panel_size; // a panel consists of at most <panel_size> consecutive columns
+ int relax; // To control degree of relaxing supernodes. If the number of nodes (columns)
+ // in a subtree of the elimination tree is less than relax, this subtree is considered
+ // as one supernode regardless of the row structures of those columns
+ int maxsuper; // The maximum size for a supernode in complete LU
+ int rowblk; // The minimum row dimension for 2-D blocking to be used;
+ int colblk; // The minimum column dimension for 2-D blocking to be used;
+ int fillfactor; // The estimated fills factors for L and U, compared with A
+};
#endif \ No newline at end of file
diff --git a/Eigen/src/SparseLU/SparseLU_panel_bmod.h b/Eigen/src/SparseLU/SparseLU_panel_bmod.h
index 36b4f74df..1b31cc31a 100644
--- a/Eigen/src/SparseLU/SparseLU_panel_bmod.h
+++ b/Eigen/src/SparseLU/SparseLU_panel_bmod.h
@@ -49,7 +49,7 @@
*
*/
template <typename DenseIndexBlock, typename IndexVector, typename ScalarVector>
-void LU_panel_bmod(const int m, const int w, const int jcol, const int nseg, ScalarVector& dense, ScalarVector& tempv, DenseIndexBlock& segrep, DenseIndexBlock& repfnz, LU_GlobalLU_t<IndexVector,ScalarVector>& glu)
+void LU_panel_bmod(const int m, const int w, const int jcol, const int nseg, ScalarVector& dense, ScalarVector& tempv, DenseIndexBlock& segrep, DenseIndexBlock& repfnz, LU_perfvalues& perfv, LU_GlobalLU_t<IndexVector,ScalarVector>& glu)
{
typedef typename ScalarVector::Scalar Scalar;
@@ -95,7 +95,7 @@ void LU_panel_bmod(const int m, const int w, const int jcol, const int nseg, Sca
// if the blocks are large enough, use level 3
// TODO find better heuristics!
- if( nsupc >= 50 && nrow > 50 && u_cols>6)
+ if( nsupc >= perfv.colblk && nrow > perfv.rowblk && u_cols>perfv.relax)
{
Map<Matrix<Scalar,Dynamic,Dynamic> > U(tempv.data(), u_rows, u_cols);
diff --git a/bench/spbench/test_sparseLU.cpp b/bench/spbench/test_sparseLU.cpp
index 8c78b0c9b..c6511a9bc 100644
--- a/bench/spbench/test_sparseLU.cpp
+++ b/bench/spbench/test_sparseLU.cpp
@@ -24,11 +24,13 @@ int main(int argc, char **args)
typedef Matrix<scalar, Dynamic, 1> DenseRhs;
Matrix<scalar, Dynamic, 1> b, x, tmp;
// SparseLU<SparseMatrix<scalar, ColMajor>, AMDOrdering<int> > solver;
-#ifdef EIGEN_METIS_SUPPORT
- SparseLU<SparseMatrix<scalar, ColMajor>, MetisOrdering<int> > solver;
-#else
+// #ifdef EIGEN_METIS_SUPPORT
+// SparseLU<SparseMatrix<scalar, ColMajor>, MetisOrdering<int> > solver;
+// std::cout<< "ORDERING : METIS\n";
+// #else
SparseLU<SparseMatrix<scalar, ColMajor>, COLAMDOrdering<int> > solver;
-#endif
+ std::cout<< "ORDERING : COLAMD\n";
+// #endif
ifstream matrix_file;
string line;