CSRMatrixMPI.hpp
Go to the documentation of this file.
1 /*
2  * STRUMPACK -- STRUctured Matrices PACKage, Copyright (c) 2014, The
3  * Regents of the University of California, through Lawrence Berkeley
4  * National Laboratory (subject to receipt of any required approvals
5  * from the U.S. Dept. of Energy). All rights reserved.
6  *
7  * If you have questions about your rights to use or distribute this
8  * software, please contact Berkeley Lab's Technology Transfer
9  * Department at TTD@lbl.gov.
10  *
11  * NOTICE. This software is owned by the U.S. Department of Energy. As
12  * such, the U.S. Government has been granted for itself and others
13  * acting on its behalf a paid-up, nonexclusive, irrevocable,
14  * worldwide license in the Software to reproduce, prepare derivative
15  * works, and perform publicly and display publicly. Beginning five
16  * (5) years after the date permission to assert copyright is obtained
17  * from the U.S. Department of Energy, and subject to any subsequent
18  * five (5) year renewals, the U.S. Government is granted for itself
19  * and others acting on its behalf a paid-up, nonexclusive,
20  * irrevocable, worldwide license in the Software to reproduce,
21  * prepare derivative works, distribute copies to the public, perform
22  * publicly and display publicly, and to permit others to do so.
23  *
24  * Developers: Pieter Ghysels, Francois-Henry Rouet, Xiaoye S. Li.
25  * (Lawrence Berkeley National Lab, Computational Research
26  * Division).
27  */
33 #ifndef STRUMPACK_CSRMATRIX_MPI_HPP
34 #define STRUMPACK_CSRMATRIX_MPI_HPP
35 
36 #include <vector>
37 #include <tuple>
38 #include <memory>
39 
40 #include "CSRMatrix.hpp"
41 #include "misc/MPIWrapper.hpp"
42 #include "dense/BLASLAPACKWrapper.hpp"
43 #include "CSRGraph.hpp"
44 
45 
46 namespace strumpack {
47 
48  template<typename scalar_t,typename integer_t> class SPMVBuffers {
49  public:
50  bool initialized = false;
51  std::vector<integer_t> sranks, rranks, soff, roffs, sind;
52  std::vector<scalar_t> sbuf, rbuf;
53  // for each off-diagonal entry spmv_prbuf stores the
54  // corresponding index in the receive buffer
55  std::vector<integer_t> prbuf;
56  };
57 
58 
71  template<typename scalar_t,typename integer_t>
72  class CSRMatrixMPI : public CompressedSparseMatrix<scalar_t,integer_t> {
76  using real_t = typename RealType<scalar_t>::value_type;
79 
80  public:
81  CSRMatrixMPI();
82  CSRMatrixMPI(integer_t local_rows, const integer_t* row_ptr,
83  const integer_t* col_ind, const scalar_t* values,
84  const integer_t* dist, MPIComm comm, bool symm_sparse);
85  CSRMatrixMPI(integer_t lrows, const integer_t* d_ptr,
86  const integer_t* d_ind, const scalar_t* d_val,
87  const integer_t* o_ptr, const integer_t* o_ind,
88  const scalar_t* o_val, const integer_t* garray,
89  MPIComm comm, bool symm_sparse=false);
91  bool only_at_root);
92 
93  integer_t local_nnz() const { return lnnz_; }
94  integer_t local_rows() const { return lrows_; }
95  integer_t begin_row() const { return brow_; }
96  integer_t end_row() const { return brow_ + lrows_; }
97  MPIComm Comm() const { return comm_; }
98  MPI_Comm comm() const { return comm_.comm(); }
99 
100  const std::vector<integer_t>& dist() const { return dist_; }
101  const integer_t& dist(std::size_t p) const {
102  assert(p < dist_.size());
103  return dist_[p];
104  }
105 
106  real_t norm1() const override;
107 
108  void spmv(const DenseM_t& x, DenseM_t& y) const override;
109  void spmv(const scalar_t* x, scalar_t* y) const override;
110 
111  void permute(const integer_t* iorder, const integer_t* order) override;
112 
113  std::unique_ptr<CSRMatrix<scalar_t,integer_t>> gather() const;
114  std::unique_ptr<CSRGraph<integer_t>> gather_graph() const;
115 
116 
131  Match_t matching(MatchingJob job, bool apply=true) override;
132 
133  Equil_t equilibration() const override;
134 
135  void equilibrate(const Equil_t&) override;
136 
137  void permute_columns(const std::vector<integer_t>& perm) override;
138 
139  void symmetrize_sparsity() override;
140 
141  int read_matrix_market(const std::string& filename) override;
142 
143  real_t max_scaled_residual(const DenseM_t& x, const DenseM_t& b)
144  const override;
145 
146  real_t max_scaled_residual(const scalar_t* x, const scalar_t* b)
147  const override;
148 
150  get_sub_graph(const std::vector<integer_t>& perm,
151  const std::vector<std::pair<integer_t,integer_t>>&
152  graph_ranges) const;
153 
155  extract_graph(int ordering_level,
156  integer_t lo, integer_t hi) const override {
157  assert(false);
158  return CSRGraph<integer_t>();
159  }
160 
161  void print() const override;
162  void print_dense(const std::string& name) const override;
163  void print_matrix_market(const std::string& filename) const override;
164  void check() const;
165 
166 
167 #ifndef DOXYGEN_SHOULD_SKIP_THIS
168  // implement outside of this class
169  void extract_separator
170  (integer_t, const std::vector<std::size_t>&,
171  const std::vector<std::size_t>&, DenseM_t&, int) const override {}
172  void extract_separator_2d
173  (integer_t, const std::vector<std::size_t>&,
174  const std::vector<std::size_t>&, DistM_t&) const override {}
175  void extract_front
176  (DenseM_t&, DenseM_t&, DenseM_t&, integer_t,
177  integer_t, const std::vector<integer_t>&, int) const override {}
178  void push_front_elements
179  (integer_t, integer_t, const std::vector<integer_t>&,
180  std::vector<Triplet<scalar_t>>&,
181  std::vector<Triplet<scalar_t>>&,
182  std::vector<Triplet<scalar_t>>&) const override {}
183 
184  void extract_F11_block
185  (scalar_t*, integer_t, integer_t, integer_t,
186  integer_t, integer_t) const override {}
187  void extract_F12_block
188  (scalar_t*, integer_t, integer_t, integer_t, integer_t,
189  integer_t, const integer_t*) const override {}
190  void extract_F21_block
191  (scalar_t*, integer_t, integer_t, integer_t, integer_t,
192  integer_t, const integer_t*) const override {}
193  void front_multiply
194  (integer_t, integer_t, const std::vector<integer_t>&,
195  const DenseM_t&, DenseM_t&, DenseM_t&, int depth) const override {}
196  void front_multiply_2d
197  (integer_t, integer_t, const std::vector<integer_t>&, const DistM_t&,
198  DistM_t&, DistM_t&, int) const override {}
199  void front_multiply_2d
200  (Trans op, integer_t, integer_t, const std::vector<integer_t>&,
201  const DistM_t&, DistM_t&, int) const override {}
202 
203  CSRGraph<integer_t> extract_graph_sep_CB
204  (int ordering_level, integer_t lo, integer_t hi,
205  const std::vector<integer_t>& upd) const override {
206  return CSRGraph<integer_t>(); };
207  CSRGraph<integer_t> extract_graph_CB_sep
208  (int ordering_level, integer_t lo, integer_t hi,
209  const std::vector<integer_t>& upd) const override {
210  return CSRGraph<integer_t>(); };
211  CSRGraph<integer_t> extract_graph_CB
212  (int ordering_level, const std::vector<integer_t>& upd) const override {
213  return CSRGraph<integer_t>(); };
214 
215  void front_multiply_F11
216  (Trans op, integer_t slo, integer_t shi,
217  const DenseM_t& R, DenseM_t& S, int depth) const override {};
218  void front_multiply_F12
219  (Trans op, integer_t slo, integer_t shi, const std::vector<integer_t>& upd,
220  const DenseM_t& R, DenseM_t& S, int depth) const override {};
221  void front_multiply_F21
222  (Trans op, integer_t slo, integer_t shi, const std::vector<integer_t>& upd,
223  const DenseM_t& R, DenseM_t& S, int depth) const override {};
224 #endif //DOXYGEN_SHOULD_SKIP_THIS
225 
226  protected:
227  void split_diag_offdiag();
228  void setup_spmv_buffers() const;
229 
230  // TODO use MPIComm
231  MPIComm comm_;
232 
238  std::vector<integer_t> dist_;
239 
244  std::vector<integer_t> offdiag_start_;
245 
246  integer_t brow_; // = dist_[rank], dist_[rank+1]
247  integer_t lrows_; // = erow_ - brow_
248  integer_t lnnz_; // = ptr_[local_rows]
249 
250  mutable SPMVBuffers<scalar_t,integer_t> spmv_bufs_;
251 
252 
256  void scale(const std::vector<scalar_t>& lDr,
257  const std::vector<scalar_t>& gDc) override;
258  void scale_real(const std::vector<real_t>& lDr,
259  const std::vector<real_t>& gDc) override;
260 
261  using CSM_t::n_;
262  using CSM_t::nnz_;
263  using CSM_t::ptr_;
264  using CSM_t::ind_;
265  using CSM_t::val_;
266  using CSM_t::symm_sparse_;
267  };
268 
280  template<typename scalar_t, typename integer_t, typename cast_t>
283 
284 } // end namespace strumpack
285 
286 #endif // STRUMPACK_CSRMATRIX_MPI_HPP
strumpack::Equilibration
Definition: CompressedSparseMatrix.hpp:110
strumpack::MPIComm
Wrapper class around an MPI_Comm object.
Definition: MPIWrapper.hpp:190
strumpack::CSRMatrix
Class for storing a compressed sparse row matrix (single node).
Definition: CSRMatrix.hpp:53
strumpack::Side::R
@ R
strumpack
Definition: StrumpackOptions.hpp:42
strumpack::DistributedMatrix
Definition: CompressedSparseMatrix.hpp:58
strumpack::MPIComm::comm
MPI_Comm comm() const
Definition: MPIWrapper.hpp:257
strumpack::DenseMatrix< scalar_t >
strumpack::CSRMatrixMPI::matching
Match_t matching(MatchingJob job, bool apply=true) override
strumpack::CSRMatrixMPI::spmv
void spmv(const DenseM_t &x, DenseM_t &y) const override
strumpack::CompressedSparseMatrix::symm_sparse
bool symm_sparse() const
Definition: CompressedSparseMatrix.hpp:298
strumpack::SPMVBuffers
Definition: CSRMatrixMPI.hpp:48
strumpack::CSRMatrixMPI
Block-row distributed compressed sparse row storage.
Definition: CSRMatrixMPI.hpp:72
MPIWrapper.hpp
Contains some simple C++ MPI wrapper utilities.
strumpack::cast_matrix
CSRMatrix< cast_t, integer_t > cast_matrix(const CSRMatrix< scalar_t, integer_t > &mat)
strumpack::CompressedSparseMatrix
Abstract base class for compressed sparse matrix storage.
Definition: CompressedSparseMatrix.hpp:163
strumpack::CSRMatrixMPI::permute
void permute(const integer_t *iorder, const integer_t *order) override
strumpack::Trans
Trans
Definition: DenseMatrix.hpp:50
CSRMatrix.hpp
Contains the compressed sparse row matrix storage class.
strumpack::MatchingData
Definition: CompressedSparseMatrix.hpp:69
strumpack::CSRGraph
Definition: CompressedSparseMatrix.hpp:56
strumpack::MatchingJob
MatchingJob
Definition: StrumpackOptions.hpp:98