diff options
author | couriersud <couriersud@gmx.org> | 2020-06-08 02:52:39 +0200 |
---|---|---|
committer | couriersud <couriersud@gmx.org> | 2020-06-08 02:52:39 +0200 |
commit | f9fa6b1c81b99303d3448bcb355bc6e3f4d3c44a (patch) | |
tree | 6bfa155ca4bd57e7086f0b19cbb9cba6591e1624 /src/lib/netlist/solver | |
parent | 29c7171702967abe49bb3f9dcd55b4b083606570 (diff) |
netlist: code maintenance. (nw)
- more c++14, use enable_if_t instead of enable_if
- cleaned up the use of memory allocation arenas
- reduce MACRO usage, use std::conditional where possible
Diffstat (limited to 'src/lib/netlist/solver')
-rw-r--r-- | src/lib/netlist/solver/nld_matrix_solver.h | 2 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_solver.cpp | 60 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_solver.h | 7 |
3 files changed, 21 insertions, 48 deletions
diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h index 09d210fcf55..fef3ec4a29b 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.h +++ b/src/lib/netlist/solver/nld_matrix_solver.h @@ -289,7 +289,7 @@ namespace solver private: plib::aligned_vector<terms_for_net_t> m_rails_temp; - std::vector<unique_pool_ptr<proxied_analog_output_t>> m_inps; + std::vector<device_arena::unique_ptr<proxied_analog_output_t>> m_inps; state_var<std::size_t> m_stat_calculations; state_var<std::size_t> m_stat_newton_raphson; diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index 2cd092cdbdd..c7e8242d83a 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -1,30 +1,6 @@ // license:GPL-2.0+ // copyright-holders:Couriersud -// Commented out for now. Relatively low number of terminals / nets make -// the vectorizations fast-math enables pretty expensive -// -#if 0 -#pragma GCC optimize "-ftree-vectorize" -#pragma GCC optimize "-ffast-math" -#pragma GCC optimize "-funsafe-math-optimizations" -#pragma GCC optimize "-funroll-loops" -#pragma GCC optimize "-funswitch-loops" -#pragma GCC optimize "-fstrict-aliasing" -#pragma GCC optimize "tree-vectorizer-verbose=7" -#pragma GCC optimize "opt-info-vec" -#pragma GCC optimize "opt-info-vec-missed" -//#pragma GCC optimize "tree-parallelize-loops=4" -#pragma GCC optimize "variable-expansion-in-unroller" -#pragma GCC optimize "unsafe-loop-optimizations" -#pragma GCC optimize "vect-cost-model" -#pragma GCC optimize "variable-expansion-in-unroller" -#pragma GCC optimize "tree-loop-if-convert-stores" -#pragma GCC optimize "tree-loop-distribution" -#pragma GCC optimize "tree-loop-im" -#pragma GCC optimize "tree-loop-ivcanon" -#pragma GCC optimize "ivopts" -#endif #include "netlist/nl_factory.h" #include "netlist/nl_setup.h" // FIXME: only needed for splitter code @@ -42,6 +18,7 @@ #include "plib/pomp.h" #include <algorithm> +#include <type_traits> namespace netlist { @@ -104,16 +81,17 @@ namespace devices } } + // FIXME: should be created in device space template <class C> - plib::unique_ptr<solver::matrix_solver_t> create_it(netlist_state_t &nl, pstring name, + host_arena::unique_ptr<solver::matrix_solver_t> create_it(netlist_state_t &nl, pstring name, analog_net_t::list_t &nets, solver::solver_parameters_t ¶ms, std::size_t size) { - return plib::make_unique<C>(nl, name, nets, ¶ms, size); + return host_arena::make_unique<C>(nl, name, nets, ¶ms, size); } template <typename FT, int SIZE> - plib::unique_ptr<solver::matrix_solver_t> NETLIB_NAME(solver)::create_solver(std::size_t size, + host_arena::unique_ptr<solver::matrix_solver_t> NETLIB_NAME(solver)::create_solver(std::size_t size, const pstring &solvername, analog_net_t::list_t &nets) { @@ -146,11 +124,11 @@ namespace devices return create_it<solver::matrix_solver_GCR_t<FT, SIZE>>(state(), solvername, nets, m_params, size); #endif } - return plib::unique_ptr<solver::matrix_solver_t>(); + return host_arena::unique_ptr<solver::matrix_solver_t>(); } template <typename FT> - plib::unique_ptr<solver::matrix_solver_t> NETLIB_NAME(solver)::create_solvers( + host_arena::unique_ptr<solver::matrix_solver_t> NETLIB_NAME(solver)::create_solvers( const pstring &sname, analog_net_t::list_t &nets) { @@ -158,10 +136,10 @@ namespace devices switch (net_count) { case 1: - return plib::make_unique<solver::matrix_solver_direct1_t<FT>>(state(), sname, nets, &m_params); + return host_arena::make_unique<solver::matrix_solver_direct1_t<FT>>(state(), sname, nets, &m_params); break; case 2: - return plib::make_unique<solver::matrix_solver_direct2_t<FT>>(state(), sname, nets, &m_params); + return host_arena::make_unique<solver::matrix_solver_direct2_t<FT>>(state(), sname, nets, &m_params); break; case 3: return create_solver<FT, 3>(3, sname, nets); @@ -322,29 +300,23 @@ namespace devices log().verbose("Found {1} net groups in {2} nets\n", splitter.groups.size(), state().nets().size()); for (auto & grp : splitter.groups) { - plib::unique_ptr<solver::matrix_solver_t> ms; + host_arena::unique_ptr<solver::matrix_solver_t> ms; pstring sname = plib::pfmt("Solver_{1}")(m_mat_solvers.size()); switch (m_params.m_fp_type()) { case solver::matrix_fp_type_e::FLOAT: -#if (NL_USE_FLOAT_MATRIX) - ms = create_solvers<float>(sname, grp); -#else - log().info("FPTYPE {1} not supported. Using DOUBLE", m_params.m_fp_type().name()); - ms = create_solvers<double>(sname, grp); -#endif + if (NL_USE_FLOAT_MATRIX) + log().info("FPTYPE {1} not supported. Using DOUBLE", m_params.m_fp_type().name()); + ms = create_solvers<std::conditional_t<NL_USE_FLOAT_MATRIX,float, double>>(sname, grp); break; case solver::matrix_fp_type_e::DOUBLE: ms = create_solvers<double>(sname, grp); break; case solver::matrix_fp_type_e::LONGDOUBLE: -#if (NL_USE_LONG_DOUBLE_MATRIX) - ms = create_solvers<long double>(sname, grp); -#else - log().info("FPTYPE {1} not supported. Using DOUBLE", m_params.m_fp_type().name()); - ms = create_solvers<double>(sname, grp); -#endif + if (NL_USE_LONG_DOUBLE_MATRIX) + log().info("FPTYPE {1} not supported. Using DOUBLE", m_params.m_fp_type().name()); + ms = create_solvers<std::conditional_t<NL_USE_LONG_DOUBLE_MATRIX, long double, double>>(sname, grp); break; case solver::matrix_fp_type_e::FLOATQ128: #if (NL_USE_FLOAT128) diff --git a/src/lib/netlist/solver/nld_solver.h b/src/lib/netlist/solver/nld_solver.h index 46c335804f4..a0c28e6b302 100644 --- a/src/lib/netlist/solver/nld_solver.h +++ b/src/lib/netlist/solver/nld_solver.h @@ -51,18 +51,19 @@ namespace devices logic_input_t m_fb_step; logic_output_t m_Q_step; - std::vector<plib::unique_ptr<solver::matrix_solver_t>> m_mat_solvers; + // FIXME: these should be created in device space + std::vector<host_arena::unique_ptr<solver::matrix_solver_t>> m_mat_solvers; std::vector<solver::matrix_solver_t *> m_mat_solvers_all; std::vector<solver::matrix_solver_t *> m_mat_solvers_timestepping; solver::solver_parameters_t m_params; template <typename FT, int SIZE> - plib::unique_ptr<solver::matrix_solver_t> create_solver(std::size_t size, + host_arena::unique_ptr<solver::matrix_solver_t> create_solver(std::size_t size, const pstring &solvername, analog_net_t::list_t &nets); template <typename FT> - plib::unique_ptr<solver::matrix_solver_t> create_solvers( + host_arena::unique_ptr<solver::matrix_solver_t> create_solvers( const pstring &sname, analog_net_t::list_t &nets); }; |