Amesos2 - Direct Sparse Solver Interfaces  Version of the Day
Amesos2_Tacho_decl.hpp
1 // @HEADER
2 // *****************************************************************************
3 // Amesos2: Templated Direct Sparse Solver Package
4 //
5 // Copyright 2011 NTESS and the Amesos2 contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 // @HEADER
9 
10 #ifndef AMESOS2_TACHO_DECL_HPP
11 #define AMESOS2_TACHO_DECL_HPP
12 
13 #include <Kokkos_Core.hpp>
14 
15 #include "Amesos2_SolverTraits.hpp"
16 #include "Amesos2_SolverCore.hpp"
17 #include "Amesos2_Tacho_FunctionMap.hpp"
18 
19 #include "Tacho.hpp"
20 #include "Tacho_Solver.hpp"
21 
22 namespace Amesos2 {
23 
31 template <class Matrix,
32  class Vector>
33 class TachoSolver : public SolverCore<Amesos2::TachoSolver, Matrix, Vector>
34 {
35  friend class SolverCore<Amesos2::TachoSolver,Matrix,Vector>; // Give our base access
36  // to our private
37  // implementation funcs
38 public:
39 
41  static const char* name; // declaration. Initialization outside.
42 
43  typedef TachoSolver<Matrix,Vector> type;
44  typedef SolverCore<Amesos2::TachoSolver,Matrix,Vector> super_type;
45 
46  // Since typedef's are not inheritted, go grab them
47  typedef typename super_type::scalar_type scalar_type;
48  typedef typename super_type::local_ordinal_type local_ordinal_type;
49  typedef typename super_type::global_size_type global_size_type;
50 
51  typedef TypeMap<Amesos2::TachoSolver,scalar_type> type_map;
52 
53  /*
54  * The Tacho interface will need two other typedef's, which are:
55  * - the tacho type that corresponds to scalar_type and
56  * - the corresponding type to use for magnitude
57  */
58  typedef typename type_map::type tacho_type;
59  typedef typename type_map::magnitude_type magnitude_type;
60 
61  typedef FunctionMap<Amesos2::TachoSolver,tacho_type> function_map;
62 
63  // TODO - Not sure yet best place for organizing these typedefs
64  typedef Tacho::ordinal_type ordinal_type;
65  typedef Tacho::size_type size_type;
66 
67  typedef Kokkos::DefaultExecutionSpace exec_space_type;
68  typedef Kokkos::DefaultHostExecutionSpace host_exec_space_type;
69 
70  typedef typename
71  Tacho::UseThisDevice<exec_space_type>::device_type device_type;
72  typedef typename
73  Tacho::UseThisDevice<host_exec_space_type>::device_type host_device_type;
74 
75  typedef Tacho::DummyTaskScheduler<exec_space_type> scheduler_type;
76 
77  typedef Kokkos::View<size_type*, device_type> device_size_type_array;
78  typedef Kokkos::View<ordinal_type*, device_type> device_ordinal_type_array;
79  typedef Kokkos::View<tacho_type*, device_type> device_value_type_array;
80 
81  // also work with host space - right now symbolic requires host space so we
82  // do everything in device space if source was device, then deep_copy
83  typedef Kokkos::View<size_type*, host_device_type> host_size_type_array;
84  typedef Kokkos::View<ordinal_type*, host_device_type> host_ordinal_type_array;
85 
87 
88 
95  TachoSolver(Teuchos::RCP<const Matrix> A,
96  Teuchos::RCP<Vector> X,
97  Teuchos::RCP<const Vector> B);
98 
99 
101  ~TachoSolver( );
102 
104 
106  std::string description() const override;
107 
108 private:
109 
115  int preOrdering_impl();
116 
117 
125 public: // made this public for CUDA parallel_for usage
127 
128 private:
129 
136 
148  int solve_impl(const Teuchos::Ptr<MultiVecAdapter<Vector> > X,
149  const Teuchos::Ptr<const MultiVecAdapter<Vector> > B) const;
150 
151 
155  bool matrixShapeOK_impl() const;
156 
157 
160  void setParameters_impl(
161  const Teuchos::RCP<Teuchos::ParameterList> & parameterList );
162 
163 
170  Teuchos::RCP<const Teuchos::ParameterList> getValidParameters_impl() const;
171 
172 
181  bool loadA_impl(EPhase current_phase);
182 
183 
187  bool do_optimization() const;
188 
189  // struct holds all data necessary to make a tacho factorization or solve call
190  mutable struct TACHOData {
191  typename Tacho::Solver<tacho_type, scheduler_type> solver;
192 
193  // TODO: Implement the paramter options - confirm which we want and which have been implemented
194  int method;
195  int variant;
196  int small_problem_threshold_size;
197  int streams;
198  bool verbose;
199  // int num_kokkos_threads;
200  // int max_num_superblocks;
201  } data_;
202 
203  typedef typename Tacho::Solver<tacho_type, scheduler_type>::value_type_matrix
204  device_solve_array_t;
205 
206  // used as an internal workspace - possibly we can store this better in TACHOData
207  mutable device_solve_array_t workspace_;
208 
209  // x and b for solve - only allocated first time
210  mutable device_solve_array_t xValues_;
211  mutable device_solve_array_t bValues_;
212 
213  // numeric is on device
214  device_value_type_array device_nzvals_view_;
215 
216  // symbolic is done on host for Tacho so store these versions as well
217  host_size_type_array host_row_ptr_view_;
218  host_ordinal_type_array host_cols_view_;
219 }; // End class Tacho
220 
221 
222 // Specialize solver_traits struct for Tacho
223 template <>
224 struct solver_traits<TachoSolver> {
225 #ifdef HAVE_TEUCHOS_COMPLEX
226  typedef Meta::make_list6<float,
227  double,
228  std::complex<float>,
229  std::complex<double>,
230  Kokkos::complex<float>,
231  Kokkos::complex<double>
232  >supported_scalars;
233 #else
234  typedef Meta::make_list2<float,
235  double
236  >supported_scalars;
237 #endif
238 };
239 
240 template <typename Scalar, typename LocalOrdinal, typename ExecutionSpace>
241 struct solver_supports_matrix<TachoSolver,
242  KokkosSparse::CrsMatrix<Scalar, LocalOrdinal, ExecutionSpace>> {
243  static const bool value = true;
244 };
245 
246 } // end namespace Amesos2
247 
248 #endif // AMESOS2_TACHO_DECL_HPP
Amesos2::SolverCore: A templated interface for interaction with third-party direct sparse solvers...
Definition: Amesos2_SolverCore_decl.hpp:71
Amesos2 interface to the Tacho package.
Definition: Amesos2_Tacho_decl.hpp:33
int symbolicFactorization_impl()
Perform symbolic factorization of the matrix using Tacho.
Definition: Amesos2_Tacho_def.hpp:63
Map types to solver-specific data-types and enums.
Definition: Amesos2_TypeMap.hpp:48
bool matrixShapeOK_impl() const
Determines whether the shape of the matrix is OK for this solver.
Definition: Amesos2_Tacho_def.hpp:192
int numericFactorization_impl()
Tacho specific numeric factorization.
Definition: Amesos2_Tacho_def.hpp:94
int preOrdering_impl()
Performs pre-ordering on the matrix to increase efficiency.
Definition: Amesos2_Tacho_def.hpp:56
std::string name() const override
Return the name of this solver.
Definition: Amesos2_SolverCore_def.hpp:725
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters_impl() const
Definition: Amesos2_Tacho_def.hpp:234
std::string description() const override
Returns a short description of this Solver.
Definition: Amesos2_Tacho_def.hpp:47
Interface to Amesos2 solver objects.
Definition: Amesos2_Solver_decl.hpp:44
Passes functions to TPL functions based on type.
Definition: Amesos2_FunctionMap.hpp:42
int solve_impl(const Teuchos::Ptr< MultiVecAdapter< Vector > > X, const Teuchos::Ptr< const MultiVecAdapter< Vector > > B) const
Tacho specific solve.
Definition: Amesos2_Tacho_def.hpp:112
Provides access to interesting solver traits.
bool loadA_impl(EPhase current_phase)
Reads matrix data into internal structures.
Definition: Amesos2_Tacho_def.hpp:265
bool do_optimization() const
can we optimize size_type and ordinal_type for straight pass through
Definition: Amesos2_Tacho_def.hpp:259