Ginkgo  Generated from pipelines/2897303314 branch based on develop. Ginkgo version 2.0.0
A numerical linear algebra library targeting many-core architectures
neighborhood_communicator.hpp
1 // SPDX-FileCopyrightText: 2017 - 2026 The Ginkgo authors
2 //
3 // SPDX-License-Identifier: BSD-3-Clause
4 
5 #ifndef GKO_PUBLIC_CORE_DISTRIBUTED_NEIGHBORHOOD_COMMUNICATOR_HPP_
6 #define GKO_PUBLIC_CORE_DISTRIBUTED_NEIGHBORHOOD_COMMUNICATOR_HPP_
7 
8 
9 #include <ginkgo/config.hpp>
10 
11 
12 #if GINKGO_BUILD_MPI
13 
14 
15 #include <ginkgo/core/base/mpi.hpp>
16 #include <ginkgo/core/distributed/collective_communicator.hpp>
17 #include <ginkgo/core/distributed/index_map.hpp>
18 
19 
20 namespace gko {
21 namespace experimental {
22 namespace mpi {
23 
24 
34 public:
36 
37  NeighborhoodCommunicator(const NeighborhoodCommunicator& other) = default;
38 
40 
41  NeighborhoodCommunicator& operator=(const NeighborhoodCommunicator& other) =
42  default;
43 
45 
52 
66  template <typename LocalIndexType, typename GlobalIndexType>
68  communicator base,
70 
71  std::unique_ptr<CollectiveCommunicator> create_with_same_type(
72  communicator base, index_map_ptr imap) const override;
73 
80  [[nodiscard]] std::unique_ptr<CollectiveCommunicator> create_inverse()
81  const override;
82 
86  [[nodiscard]] std::pair<std::unique_ptr<CollectiveCommunicator>,
87  std::vector<comm_index_type>>
88  resize(std::shared_ptr<const Executor> exec,
89  const std::vector<comm_index_type>& send_factors) const override;
90 
91  [[nodiscard]] comm_index_type get_recv_size() const override;
92 
93  [[nodiscard]] comm_index_type get_send_size() const override;
94 
104  friend bool operator==(const NeighborhoodCommunicator& a,
105  const NeighborhoodCommunicator& b);
106 
112  friend bool operator!=(const NeighborhoodCommunicator& a,
113  const NeighborhoodCommunicator& b);
114 
115 protected:
122  request i_all_to_all_v_impl(std::shared_ptr<const Executor> exec,
123  const void* send_buffer, MPI_Datatype send_type,
124  void* recv_buffer,
125  MPI_Datatype recv_type) const override;
126 
127 private:
128  communicator comm_;
129 
130  std::vector<comm_index_type> send_sizes_;
131  std::vector<comm_index_type> send_offsets_;
132  std::vector<comm_index_type> recv_sizes_;
133  std::vector<comm_index_type> recv_offsets_;
134 };
135 
136 
137 } // namespace mpi
138 } // namespace experimental
139 } // namespace gko
140 
141 
142 #endif
143 #endif // GKO_PUBLIC_CORE_DISTRIBUTED_NEIGHBORHOOD_COMMUNICATOR_HPP_
gko::experimental::mpi::NeighborhoodCommunicator::create_with_same_type
std::unique_ptr< CollectiveCommunicator > create_with_same_type(communicator base, index_map_ptr imap) const override
Creates a new CollectiveCommunicator with the same dynamic type.
gko::experimental::mpi::NeighborhoodCommunicator::get_send_size
comm_index_type get_send_size() const override
Get the number of elements sent by this process within this communication pattern.
gko::experimental::mpi::CollectiveCommunicator::i_all_to_all_v
request i_all_to_all_v(std::shared_ptr< const Executor > exec, const SendType *send_buffer, RecvType *recv_buffer) const
Non-blocking all-to-all communication.
Definition: collective_communicator.hpp:157
gko::experimental::mpi::request
The request class is a light, move-only wrapper around the MPI_Request handle.
Definition: mpi.hpp:330
gko::experimental::mpi::CollectiveCommunicator
Interface for a collective communicator.
Definition: collective_communicator.hpp:31
gko::experimental::mpi::NeighborhoodCommunicator::resize
std::pair< std::unique_ptr< CollectiveCommunicator >, std::vector< comm_index_type > > resize(std::shared_ptr< const Executor > exec, const std::vector< comm_index_type > &send_factors) const override
Create new communicator that sends and receives a different number of elements to/from each rank in i...
gko::experimental::mpi::NeighborhoodCommunicator::get_recv_size
comm_index_type get_recv_size() const override
Get the number of elements received by this process within this communication pattern.
gko
The Ginkgo namespace.
Definition: abstract_factory.hpp:19
gko::experimental::mpi::communicator
A thin wrapper of MPI_Comm that supports most MPI calls.
Definition: mpi.hpp:418
gko::experimental::mpi::comm_index_type
int comm_index_type
Index type for enumerating processes in a distributed application.
Definition: types.hpp:1135
gko::experimental::mpi::NeighborhoodCommunicator::create_inverse
std::unique_ptr< CollectiveCommunicator > create_inverse() const override
Creates the inverse NeighborhoodCommunicator by switching sources and destinations.
gko::experimental::mpi::NeighborhoodCommunicator
A CollectiveCommunicator that uses a neighborhood topology.
Definition: neighborhood_communicator.hpp:33
gko::experimental::mpi::CollectiveCommunicator::index_map_ptr
std::variant< const distributed::index_map< int32, int32 > *, const distributed::index_map< int32, int64 > *, const distributed::index_map< int64, int64 > * > index_map_ptr
All allowed index_map types (as const *)
Definition: collective_communicator.hpp:39
gko::experimental::mpi::NeighborhoodCommunicator::operator==
friend bool operator==(const NeighborhoodCommunicator &a, const NeighborhoodCommunicator &b)
Compares two communicators for equality locally.
gko::experimental::distributed::index_map
This class defines mappings between global and local indices.
Definition: index_map.hpp:70
gko::experimental::mpi::NeighborhoodCommunicator::operator!=
friend bool operator!=(const NeighborhoodCommunicator &a, const NeighborhoodCommunicator &b)
Compares two communicators for inequality.