diff options
| author | 2016-04-15 02:00:15 +0200 | |
|---|---|---|
| committer | 2016-04-15 02:09:41 +0200 | |
| commit | d9df811529f5858a0ae737ad5dee3aecf496bfec (patch) | |
| tree | 2e9ff0f3df741d33d1911af86c5517099ce11f8f /src/lib/netlist/solver/nld_solver.cpp | |
| parent | cd0441b678487ce3f2b34eeed57f253b1621d76c (diff) | |
Significant speed improvement:
- added a new solver using compressed row format
- fixed sorting
As a result, netlist performance on kidniki nearly doubled. The
performance increase is mainly due to the fact that sorting decreases
the number of operations for gaussian elimination of the kidniki matrix
from ~7800 to 707. In addition, compressed row format improves L1 usage.
[Couriersud]
Diffstat (limited to 'src/lib/netlist/solver/nld_solver.cpp')
| -rw-r--r-- | src/lib/netlist/solver/nld_solver.cpp | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index 216a2566c05..5924966efa2 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -43,7 +43,7 @@ #if 1 #include "nld_ms_direct.h" -//#include "nld_ms_gcr.h" +#include "nld_ms_gcr.h" #else #include "nld_ms_direct_lu.h" #endif @@ -223,7 +223,7 @@ ATTR_COLD void matrix_solver_t::setup_matrix() pfree(m_rails_temp[k]); // no longer needed m_rails_temp.clear(); -#if 0 +#if 1 /* Sort in descending order by number of connected matrix voltages. * The idea is, that for Gauss-Seidel algo the first voltage computed @@ -245,15 +245,15 @@ ATTR_COLD void matrix_solver_t::setup_matrix() * */ - int sort_order = (type() == GAUSS_SEIDEL ? 1 : -1) * -1; + int sort_order = -1;//(type() == GAUSS_SEIDEL ? 1 : -1); - for (unsigned k = 0; k < iN / 2; k++) - for (unsigned i = 0; i < iN - 1; i++) + for (unsigned k = 0; k < iN - 1; k++) + for (unsigned i = k+1; i < iN; i++) { - if ((m_terms[i]->m_railstart - m_terms[i+1]->m_railstart) * sort_order < 0) + if (((int) m_terms[k]->m_railstart - (int) m_terms[i]->m_railstart) * sort_order < 0) { - std::swap(m_terms[i], m_terms[i+1]); - std::swap(m_nets[i], m_nets[i+1]); + std::swap(m_terms[i], m_terms[k]); + std::swap(m_nets[i], m_nets[k]); } } @@ -720,10 +720,14 @@ matrix_solver_t * NETLIB_NAME(solver)::create_solver(int size, const bool use_sp typedef matrix_solver_SOR_mat_t<m_N,_storage_N> solver_sor_mat; return palloc(solver_sor_mat(&m_params, size)); } + else if (pstring("MAT_CR").equals(m_iterative_solver)) + { + typedef matrix_solver_GCR_t<m_N,_storage_N> solver_mat; + return palloc(solver_mat(&m_params, size)); + } else if (pstring("MAT").equals(m_iterative_solver)) { typedef matrix_solver_direct_t<m_N,_storage_N> solver_mat; - //typedef matrix_solver_GCR_t<m_N,_storage_N> solver_mat; return palloc(solver_mat(&m_params, size)); } else if (pstring("SM").equals(m_iterative_solver)) |
