Ginkgo  Generated from pipelines/2969282958 branch based on develop. Ginkgo version 2.0.0
A numerical linear algebra library targeting many-core architectures
matrix.hpp
1 // SPDX-FileCopyrightText: 2017 - 2026 The Ginkgo authors
2 //
3 // SPDX-License-Identifier: BSD-3-Clause
4 
5 #ifndef GKO_PUBLIC_CORE_DISTRIBUTED_MATRIX_HPP_
6 #define GKO_PUBLIC_CORE_DISTRIBUTED_MATRIX_HPP_
7 
8 
9 #include <ginkgo/config.hpp>
10 
11 
12 #if GINKGO_BUILD_MPI
13 
14 
15 #include <ginkgo/core/base/dense_cache.hpp>
16 #include <ginkgo/core/base/lin_op.hpp>
17 #include <ginkgo/core/base/mpi.hpp>
18 #include <ginkgo/core/base/std_extensions.hpp>
19 #include <ginkgo/core/distributed/base.hpp>
20 #include <ginkgo/core/distributed/index_map.hpp>
21 #include <ginkgo/core/distributed/row_gatherer.hpp>
22 #include <ginkgo/core/distributed/vector_cache.hpp>
23 
24 
25 namespace gko {
26 namespace matrix {
27 
28 
29 template <typename ValueType, typename IndexType>
30 class Csr;
31 
32 
33 }
34 
35 
36 namespace multigrid {
37 
38 
39 template <typename ValueType, typename IndexType>
40 class Pgm;
41 
42 template <typename ValueType, typename IndexType>
43 class Pmis;
44 
45 template <typename ValueType, typename IndexType>
47 
48 
49 } // namespace multigrid
50 
51 
52 namespace detail {
53 
54 
59 template <typename Builder, typename ValueType, typename IndexType,
60  typename = void>
61 struct is_matrix_type_builder : std::false_type {};
62 
63 
64 template <typename Builder, typename ValueType, typename IndexType>
65 struct is_matrix_type_builder<
66  Builder, ValueType, IndexType,
67  xstd::void_t<
68  decltype(std::declval<Builder>().template create<ValueType, IndexType>(
69  std::declval<std::shared_ptr<const Executor>>()))>>
70  : std::true_type {};
71 
72 
73 template <template <typename, typename> class MatrixType,
74  typename... CreateArgs>
75 struct MatrixTypeBuilderFromValueAndIndex {
76  template <typename ValueType, typename IndexType, std::size_t... I>
77  auto create_impl(std::shared_ptr<const Executor> exec,
78  std::index_sequence<I...>)
79  {
80  return MatrixType<ValueType, IndexType>::create(
81  exec, std::get<I>(create_args)...);
82  }
83 
84 
85  template <typename ValueType, typename IndexType>
86  auto create(std::shared_ptr<const Executor> exec)
87  {
88  // with c++17 we could use std::apply
89  static constexpr auto size = sizeof...(CreateArgs);
90  return create_impl<ValueType, IndexType>(
91  std::move(exec), std::make_index_sequence<size>{});
92  }
93 
94  std::tuple<CreateArgs...> create_args;
95 };
96 
97 
98 } // namespace detail
99 
100 
132 template <template <typename, typename> class MatrixType, typename... Args>
133 auto with_matrix_type(Args&&... create_args)
134 {
135  return detail::MatrixTypeBuilderFromValueAndIndex<MatrixType, Args...>{
136  std::forward_as_tuple(create_args...)};
137 }
138 
139 
140 namespace experimental {
141 namespace distributed {
142 
143 
153 enum class assembly_mode { communicate, local_only };
154 
155 
156 template <typename LocalIndexType, typename GlobalIndexType>
157 class Partition;
158 template <typename ValueType>
159 class Vector;
160 
161 
266 template <typename ValueType = default_precision,
267  typename LocalIndexType = int32, typename GlobalIndexType = int64>
268 class Matrix
269  : public LinOp,
270  public EnableCloneable<
271  Matrix<ValueType, LocalIndexType, GlobalIndexType>>,
272  public ConvertibleTo<
273  Matrix<next_precision<ValueType>, LocalIndexType, GlobalIndexType>>,
274 #if GINKGO_ENABLE_HALF || GINKGO_ENABLE_BFLOAT16
275  public ConvertibleTo<Matrix<next_precision<ValueType, 2>, LocalIndexType,
276  GlobalIndexType>>,
277 #endif
278 #if GINKGO_ENABLE_HALF && GINKGO_ENABLE_BFLOAT16
279  public ConvertibleTo<Matrix<next_precision<ValueType, 3>, LocalIndexType,
280  GlobalIndexType>>,
281 #endif
282  public WritableToMatrixData<ValueType, GlobalIndexType>,
283  public DistributedBase {
284  friend class EnableCloneable<Matrix>;
285  friend class Matrix<previous_precision<ValueType>, LocalIndexType,
286  GlobalIndexType>;
287 
288  friend class multigrid::Pgm<ValueType, LocalIndexType>;
289  friend class multigrid::Pmis<ValueType, LocalIndexType>;
290  friend class multigrid::UniformCoarsening<ValueType, LocalIndexType>;
291  GKO_ASSERT_SUPPORTED_VALUE_AND_DIST_INDEX_TYPE;
292 
293 public:
294  using value_type = ValueType;
295  using index_type = GlobalIndexType;
296  using local_index_type = LocalIndexType;
297  using global_index_type = GlobalIndexType;
298  using global_vector_type =
300  using local_vector_type = typename global_vector_type::local_vector_type;
301 
305  GlobalIndexType>>::convert_to;
307  GlobalIndexType>>::move_to;
308 
309  void convert_to(Matrix<next_precision<value_type>, local_index_type,
310  global_index_type>* result) const override;
311 
312  void move_to(Matrix<next_precision<value_type>, local_index_type,
313  global_index_type>* result) override;
314 
315 #if GINKGO_ENABLE_HALF || GINKGO_ENABLE_BFLOAT16
316  friend class Matrix<previous_precision<ValueType, 2>, LocalIndexType,
317  GlobalIndexType>;
319  global_index_type>>::convert_to;
321  global_index_type>>::move_to;
322 
323  void convert_to(Matrix<next_precision<value_type, 2>, local_index_type,
324  global_index_type>* result) const override;
325 
326  void move_to(Matrix<next_precision<value_type, 2>, local_index_type,
327  global_index_type>* result) override;
328 #endif
329 
330 #if GINKGO_ENABLE_HALF && GINKGO_ENABLE_BFLOAT16
331  friend class Matrix<previous_precision<ValueType, 3>, LocalIndexType,
332  GlobalIndexType>;
334  global_index_type>>::convert_to;
336  global_index_type>>::move_to;
337 
338  void convert_to(Matrix<next_precision<value_type, 3>, local_index_type,
339  global_index_type>* result) const override;
340 
341  void move_to(Matrix<next_precision<value_type, 3>, local_index_type,
342  global_index_type>* result) override;
343 #endif
344 
361  void read_distributed(
364  partition,
365  assembly_mode assembly_type = assembly_mode::local_only);
366 
376  void read_distributed(
379  partition,
380  assembly_mode assembly_type = assembly_mode::local_only);
381 
400  void read_distributed(
403  row_partition,
405  col_partition,
406  assembly_mode assembly_type = assembly_mode::local_only);
407 
417  void read_distributed(
420  row_partition,
422  col_partition,
423  assembly_mode assembly_type = assembly_mode::local_only);
424 
435 
436  void write(matrix_data<value_type, global_index_type>& data) const override;
437 
446  std::shared_ptr<const LinOp> get_diag_matrix() const { return diag_mtx_; }
447 
456  std::shared_ptr<const LinOp> get_off_diag_matrix() const
457  {
458  return off_diag_mtx_;
459  }
460 
472  std::shared_ptr<const RowGatherer<LocalIndexType>> get_row_gatherer() const
473  {
474  return row_gatherer_;
475  }
476 
480  GKO_DEPRECATED("use get_diag_matrix() instead")
481  std::shared_ptr<const LinOp> get_local_matrix() const
482  {
483  return get_diag_matrix();
484  }
485 
489  GKO_DEPRECATED("use get_off_diag_matrix() instead")
490  std::shared_ptr<const LinOp> get_non_local_matrix() const
491  {
492  return get_off_diag_matrix();
493  }
494 
500  std::shared_ptr<const Partition<local_index_type, global_index_type>>
501  get_row_partition() const;
502 
519 
535  void transpose(ptr_param<Matrix> result) const;
536 
542  Matrix(const Matrix& other);
543 
549  Matrix(Matrix&& other) noexcept;
550 
559  Matrix& operator=(const Matrix& other);
560 
569  Matrix& operator=(Matrix&& other);
570 
580  static std::unique_ptr<Matrix> create(std::shared_ptr<const Executor> exec,
581  mpi::communicator comm);
582 
596  static std::unique_ptr<Matrix> create(
597  std::shared_ptr<const Executor> exec,
598  std::shared_ptr<const RowGatherer<LocalIndexType>>
599  row_gatherer_template);
600 
621  template <typename MatrixType,
622  typename = std::enable_if_t<gko::detail::is_matrix_type_builder<
623  MatrixType, ValueType, LocalIndexType>::value>>
624  static std::unique_ptr<Matrix> create(std::shared_ptr<const Executor> exec,
625  mpi::communicator comm,
626  MatrixType matrix_template)
627  {
628  return create(
629  exec, comm,
630  matrix_template.template create<ValueType, LocalIndexType>(exec));
631  }
632 
662  template <typename DiagMatrixType, typename OffDiagMatrixType,
663  typename = std::enable_if_t<
664  gko::detail::is_matrix_type_builder<DiagMatrixType, ValueType,
665  LocalIndexType>::value &&
666  gko::detail::is_matrix_type_builder<
667  OffDiagMatrixType, ValueType, LocalIndexType>::value>>
668  static std::unique_ptr<Matrix> create(
669  std::shared_ptr<const Executor> exec, mpi::communicator comm,
670  DiagMatrixType diag_matrix_template,
671  OffDiagMatrixType off_diag_matrix_template)
672  {
673  return create(
674  exec, comm,
675  diag_matrix_template.template create<ValueType, LocalIndexType>(
676  exec),
677  off_diag_matrix_template.template create<ValueType, LocalIndexType>(
678  exec));
679  }
680 
695  static std::unique_ptr<Matrix> create(
696  std::shared_ptr<const Executor> exec, mpi::communicator comm,
697  ptr_param<const LinOp> matrix_template);
698 
715  static std::unique_ptr<Matrix> create(
716  std::shared_ptr<const Executor> exec, mpi::communicator comm,
717  ptr_param<const LinOp> diag_matrix_template,
718  ptr_param<const LinOp> off_diag_matrix_template);
719 
732  static std::unique_ptr<Matrix> create(std::shared_ptr<const Executor> exec,
733  mpi::communicator comm, dim<2> size,
734  std::shared_ptr<LinOp> diag_linop);
735 
754  [[deprecated(
755  "Please use the overload with an index_map instead.")]] static std::
756  unique_ptr<Matrix>
757  create(std::shared_ptr<const Executor> exec, mpi::communicator comm,
758  dim<2> size, std::shared_ptr<LinOp> diag_linop,
759  std::shared_ptr<LinOp> off_diag_linop,
760  std::vector<comm_index_type> recv_sizes,
761  std::vector<comm_index_type> recv_offsets,
762  array<local_index_type> recv_gather_idxs);
763 
777  static std::unique_ptr<Matrix> create(
778  std::shared_ptr<const Executor> exec, mpi::communicator comm,
780  std::shared_ptr<LinOp> diag_linop,
781  std::shared_ptr<LinOp> off_diag_linop);
782 
790  void col_scale(ptr_param<const global_vector_type> scaling_factors);
791 
799  void row_scale(ptr_param<const global_vector_type> scaling_factors);
800 
801 protected:
802  explicit Matrix(std::shared_ptr<const Executor> exec,
803  mpi::communicator comm);
804 
805  explicit Matrix(std::shared_ptr<const Executor> exec,
806  std::shared_ptr<const RowGatherer<LocalIndexType>>
807  row_gatherer_template,
808  ptr_param<const LinOp> diag_matrix_template,
809  ptr_param<const LinOp> off_diag_matrix_template);
810 
811  explicit Matrix(std::shared_ptr<const Executor> exec,
812  mpi::communicator comm, dim<2> size,
813  std::shared_ptr<LinOp> diag_linop);
814 
815  explicit Matrix(std::shared_ptr<const Executor> exec,
816  mpi::communicator comm,
818  std::shared_ptr<LinOp> diag_linop,
819  std::shared_ptr<LinOp> off_diag_linop);
820 
821  void apply_impl(const LinOp* b, LinOp* x) const override;
822 
823  void apply_impl(const LinOp* alpha, const LinOp* b, const LinOp* beta,
824  LinOp* x) const override;
825 
826 private:
827  std::shared_ptr<RowGatherer<LocalIndexType>> row_gatherer_;
829  std::shared_ptr<const Partition<local_index_type, global_index_type>>
830  row_partition_;
831  gko::detail::ScalarCache one_scalar_;
832  detail::GenericVectorCache recv_buffer_;
833  detail::GenericVectorCache host_recv_buffer_;
834  std::shared_ptr<LinOp> diag_mtx_;
835  std::shared_ptr<LinOp> off_diag_mtx_;
836 };
837 
838 
839 } // namespace distributed
840 } // namespace experimental
841 } // namespace gko
842 
843 
844 #endif
845 
846 
847 #endif // GKO_PUBLIC_CORE_DISTRIBUTED_MATRIX_HPP_
gko::multigrid::Pmis
Parallel modified independent set (Pmis) is the classical coarsening method introduced in the paper H...
Definition: matrix.hpp:43
gko::experimental::distributed::Matrix::write
void write(matrix_data< value_type, global_index_type > &data) const override
Writes a matrix to a matrix_data structure.
gko::with_matrix_type
auto with_matrix_type(Args &&... create_args)
This function returns a type that delays a call to MatrixType::create.
Definition: matrix.hpp:133
gko::matrix::Csr
CSR is a matrix format which stores only the nonzero coefficients by compressing each row of the matr...
Definition: matrix.hpp:30
gko::experimental::distributed::assembly_mode
assembly_mode
assembly_mode defines how the read_distributed function of the distributed matrix treats non-local in...
Definition: matrix.hpp:153
gko::experimental::distributed::Matrix::multiply
void multiply(ptr_param< const Matrix > b, ptr_param< Matrix > c) const
Computes the distributed sparse matrix-matrix product C = A * B, where A is this matrix.
gko::LinOp
Definition: lin_op.hpp:117
gko::multigrid::UniformCoarsening
UniformCoarsening is a simple coarse grid generation algorithm.
Definition: matrix.hpp:46
gko::matrix::Dense< value_type >
gko::experimental::distributed::RowGatherer
The distributed::RowGatherer gathers the rows of distributed::Vector that are located on other proces...
Definition: row_gatherer.hpp:30
gko::experimental::distributed::Matrix
The Matrix class defines a (MPI-)distributed matrix.
Definition: matrix.hpp:268
gko::experimental::distributed::Vector
Vector is a format which explicitly stores (multiple) distributed column vectors in a dense storage f...
Definition: matrix.hpp:159
gko::experimental::distributed::Matrix::get_local_matrix
std::shared_ptr< const LinOp > get_local_matrix() const
Definition: matrix.hpp:481
gko::experimental::distributed::Matrix::col_scale
void col_scale(ptr_param< const global_vector_type > scaling_factors)
Scales the columns of the matrix by the respective entries of the vector.
gko::experimental::distributed::Matrix::create
static std::unique_ptr< Matrix > create(std::shared_ptr< const Executor > exec, mpi::communicator comm)
Creates an empty distributed matrix.
gko
The Ginkgo namespace.
Definition: abstract_factory.hpp:19
gko::experimental::distributed::Matrix::get_row_partition
std::shared_ptr< const Partition< local_index_type, global_index_type > > get_row_partition() const
Get the row partition of this matrix.
gko::experimental::distributed::Matrix::get_non_local_matrix
std::shared_ptr< const LinOp > get_non_local_matrix() const
Definition: matrix.hpp:490
gko::array< local_index_type >
gko::multigrid::Pgm
Parallel graph match (Pgm) is the aggregate method introduced in the paper M.
Definition: matrix.hpp:40
gko::experimental::mpi::communicator
A thin wrapper of MPI_Comm that supports most MPI calls.
Definition: mpi.hpp:418
gko::dim< 2 >
gko::matrix_data
This structure is used as an intermediate data type to store a sparse matrix.
Definition: matrix_data.hpp:126
gko::experimental::distributed::Matrix::get_diag_matrix
std::shared_ptr< const LinOp > get_diag_matrix() const
Get read access to the stored diagonal matrix block.
Definition: matrix.hpp:446
gko::experimental::distributed::Matrix::create
static std::unique_ptr< Matrix > create(std::shared_ptr< const Executor > exec, mpi::communicator comm, DiagMatrixType diag_matrix_template, OffDiagMatrixType off_diag_matrix_template)
Creates an empty distributed matrix with specified types for the diagonal matrix and the off-diagonal...
Definition: matrix.hpp:668
gko::ptr_param
This class is used for function parameters in the place of raw pointers.
Definition: utils_helper.hpp:43
gko::WritableToMatrixData
A LinOp implementing this interface can write its data to a matrix_data structure.
Definition: lin_op.hpp:719
gko::experimental::distributed::Matrix::transpose
void transpose(ptr_param< Matrix > result) const
Computes the transpose of this matrix into result.
gko::next_precision
typename detail::find_precision_impl< T, step >::type next_precision
Obtains the next move type of T in the singly-linked precision corresponding bfloat16/half.
Definition: math.hpp:465
gko::experimental::distributed::Partition
Represents a partition of a range of indices [0, size) into a disjoint set of parts.
Definition: assembly.hpp:26
gko::previous_precision
typename detail::find_precision_impl< T, -step >::type previous_precision
Obtains the previous move type of T in the singly-linked precision corresponding bfloat16/half.
Definition: math.hpp:472
gko::experimental::distributed::Matrix::operator=
Matrix & operator=(const Matrix &other)
Copy assigns a Matrix.
gko::EnableCloneable
This mixin is used to enable a default Cloneable::clone() implementation and similar for objects that...
Definition: polymorphic_object.hpp:376
gko::int64
std::int64_t int64
64-bit signed integral type.
Definition: types.hpp:124
gko::default_precision
double default_precision
Precision used if no precision is explicitly specified.
Definition: types.hpp:183
gko::ConvertibleTo
ConvertibleTo interface is used to mark that the implementer can be converted to the object of Result...
Definition: polymorphic_object.hpp:147
gko::int32
std::int32_t int32
32-bit signed integral type.
Definition: types.hpp:118
gko::experimental::distributed::Matrix::create
static std::unique_ptr< Matrix > create(std::shared_ptr< const Executor > exec, mpi::communicator comm, MatrixType matrix_template)
Creates an empty distributed matrix with specified type for local matrices.
Definition: matrix.hpp:624
gko::experimental::distributed::DistributedBase
A base class for distributed objects.
Definition: base.hpp:32
gko::experimental::distributed::index_map< local_index_type, global_index_type >
gko::experimental::distributed::Matrix::get_row_gatherer
std::shared_ptr< const RowGatherer< LocalIndexType > > get_row_gatherer() const
Get read access to the row gatherer used to fetch the non-local rows during an apply.
Definition: matrix.hpp:472
gko::experimental::distributed::Matrix::read_distributed
void read_distributed(const device_matrix_data< value_type, global_index_type > &data, std::shared_ptr< const Partition< local_index_type, global_index_type >> partition, assembly_mode assembly_type=assembly_mode::local_only)
Reads a square matrix from the device_matrix_data structure and a global partition.
gko::experimental::distributed::Matrix::row_scale
void row_scale(ptr_param< const global_vector_type > scaling_factors)
Scales the rows of the matrix by the respective entries of the vector.
gko::device_matrix_data
This type is a device-side equivalent to matrix_data.
Definition: device_matrix_data.hpp:36
gko::experimental::distributed::Matrix::Matrix
Matrix(const Matrix &other)
Copy constructs a Matrix.
gko::experimental::distributed::Matrix::get_off_diag_matrix
std::shared_ptr< const LinOp > get_off_diag_matrix() const
Get read access to the stored off-diagonal matrix block.
Definition: matrix.hpp:456