preCICE v3.1.2
|
Provides connection methods based on MPI ports (part of MPI 2.0). More...
#include <MPISinglePortsCommunication.hpp>
Public Member Functions | |
MPISinglePortsCommunication (std::string addressDirectory=".") | |
virtual | ~MPISinglePortsCommunication () |
virtual size_t | getRemoteCommunicatorSize () override |
Returns the number of processes in the remote communicator. | |
virtual void | acceptConnection (std::string const &acceptorName, std::string const &requesterName, std::string const &tag, int acceptorRank, int rankOffset=0) override |
Accepts connection from another communicator, which has to call requestConnection(). | |
virtual void | acceptConnectionAsServer (std::string const &acceptorName, std::string const &requesterName, std::string const &tag, int acceptorRank, int requesterCommunicatorSize) override |
requesterCommunicatorSize is not used, since connection is always made on the entire communicator | |
virtual void | requestConnection (std::string const &acceptorName, std::string const &requesterName, std::string const &tag, int requesterRank, int requesterCommunicatorSize) override |
Connects to another communicator, which has to call acceptConnection(). | |
virtual void | requestConnectionAsClient (std::string const &acceptorName, std::string const &requesterName, std::string const &tag, std::set< int > const &acceptorRanks, int requesterRank) override |
Connects to another communicator, which has to call acceptConnectionAsServer(). | |
virtual void | prepareEstablishment (std::string const &acceptorName, std::string const &requesterName) override |
Prepare environment used to establish the communication. | |
virtual void | cleanupEstablishment (std::string const &acceptorName, std::string const &requesterName) override |
Clean-up environment used to establish the communication. | |
virtual void | closeConnection () override |
Disconnects from communication space, i.e. participant. | |
Public Member Functions inherited from precice::com::MPICommunication | |
MPICommunication () | |
virtual | ~MPICommunication () |
Destructor, empty. | |
virtual void | send (std::string const &itemToSend, Rank rankReceiver) override |
Sends a std::string to process with given rank. | |
virtual void | send (precice::span< const int > itemsToSend, Rank rankReceiver) override |
Sends an array of integer values. | |
virtual PtrRequest | aSend (precice::span< const int > itemsToSend, Rank rankReceiver) override |
Asynchronously sends an array of integer values. | |
virtual void | send (precice::span< const double > itemsToSend, Rank rankReceiver) override |
Sends an array of double values. | |
virtual PtrRequest | aSend (precice::span< const double > itemsToSend, Rank rankReceiver) override |
Asynchronously sends an array of double values. | |
virtual void | send (double itemToSend, Rank rankReceiver) override |
Sends a double to process with given rank. | |
virtual PtrRequest | aSend (const double &itemToSend, Rank rankReceiver) override |
Asynchronously sends a double to process with given rank. | |
virtual void | send (int itemToSend, Rank rankReceiver) override |
Sends an int to process with given rank. | |
virtual PtrRequest | aSend (const int &itemToSend, Rank rankReceiver) override |
Asynchronously sends an int to process with given rank. | |
virtual void | send (bool itemToSend, Rank rankReceiver) override |
Sends a bool to process with given rank. | |
virtual PtrRequest | aSend (const bool &itemToSend, Rank rankReceiver) override |
Asynchronously sends a bool to process with given rank. | |
virtual void | receive (std::string &itemToReceive, Rank rankSender) override |
Receives a std::string from process with given rank. | |
virtual void | receive (precice::span< int > itemsToReceive, Rank rankSender) override |
Receives an array of integer values. | |
virtual void | receive (precice::span< double > itemsToReceive, Rank rankSender) override |
Receives an array of double values. | |
virtual PtrRequest | aReceive (precice::span< double > itemsToReceive, int rankSender) override |
Asynchronously receives an array of double values. | |
virtual void | receive (double &itemToReceive, Rank rankSender) override |
Receives a double from process with given rank. | |
virtual PtrRequest | aReceive (double &itemToReceive, Rank rankSender) override |
Asynchronously receives a double from process with given rank. | |
virtual void | receive (int &itemToReceive, Rank rankSender) override |
Receives an int from process with given rank. | |
virtual PtrRequest | aReceive (int &itemToReceive, Rank rankSender) override |
Asynchronously receives an int from process with given rank. | |
virtual void | receive (bool &itemToReceive, Rank rankSender) override |
Receives a bool from process with given rank. | |
virtual PtrRequest | aReceive (bool &itemToReceive, Rank rankSender) override |
Asynchronously receives a bool from process with given rank. | |
Public Member Functions inherited from precice::com::Communication | |
Communication & | operator= (Communication &&)=delete |
virtual | ~Communication () |
Destructor, empty. | |
void | setRankOffset (Rank rankOffset) |
Set rank offset. | |
virtual bool | isConnected () |
Returns true, if a connection to a remote participant has been setup. | |
auto | remoteCommunicatorRanks () |
Returns a range over all valid remote ranks. | |
void | connectIntraComm (std::string const &participantName, std::string const &tag, int rank, int size) |
virtual void | reduceSum (precice::span< double const > itemsToSend, precice::span< double > itemsToReceive, Rank primaryRank) |
Performs a reduce summation on the rank given by primaryRank. | |
virtual void | reduceSum (precice::span< double const > itemsToSend, precice::span< double > itemsToReceive) |
Performs a reduce summation on the primary rank, every other rank has to call reduceSum. | |
virtual void | reduceSum (int itemToSend, int &itemToReceive, Rank primaryRank) |
virtual void | reduceSum (int itemsToSend, int &itemsToReceive) |
virtual void | allreduceSum (precice::span< double const > itemsToSend, precice::span< double > itemsToReceive, Rank primaryRank) |
virtual void | allreduceSum (precice::span< double const > itemsToSend, precice::span< double > itemsToReceive) |
virtual void | allreduceSum (double itemToSend, double &itemToReceive, Rank primaryRank) |
virtual void | allreduceSum (double itemToSend, double &itemToReceive) |
virtual void | allreduceSum (int itemToSend, int &itemToReceive, Rank primaryRank) |
virtual void | allreduceSum (int itemToSend, int &itemToReceive) |
virtual void | broadcast (precice::span< const int > itemsToSend) |
virtual void | broadcast (precice::span< int > itemsToReceive, Rank rankBroadcaster) |
virtual void | broadcast (int itemToSend) |
virtual void | broadcast (int &itemToReceive, Rank rankBroadcaster) |
virtual void | broadcast (precice::span< const double > itemsToSend) |
virtual void | broadcast (precice::span< double > itemsToReceive, Rank rankBroadcaster) |
virtual void | broadcast (double itemToSend) |
virtual void | broadcast (double &itemToReceive, Rank rankBroadcaster) |
virtual void | broadcast (bool itemToSend) |
virtual void | broadcast (bool &itemToReceive, Rank rankBroadcaster) |
virtual void | broadcast (std::vector< int > const &v) |
virtual void | broadcast (std::vector< int > &v, Rank rankBroadcaster) |
virtual void | broadcast (std::vector< double > const &v) |
virtual void | broadcast (std::vector< double > &v, Rank rankBroadcaster) |
void | sendRange (precice::span< const double > itemsToSend, Rank rankReceiver) |
Sends a range of doubles (size + content) | |
void | sendRange (precice::span< const int > itemsToSend, Rank rankReceiver) |
Sends a range of ints (size + content) | |
std::vector< int > | receiveRange (Rank rankSender, AsVectorTag< int >) |
Receives a range of ints as a vector<int> | |
std::vector< double > | receiveRange (Rank rankSender, AsVectorTag< double >) |
Receives a range of doubles as a vector<double> | |
Private Member Functions | |
virtual MPI_Comm & | communicator (Rank rank) override |
Returns the communicator. | |
virtual Rank | rank (int rank) override |
Private Attributes | |
logging::Logger | _log {"com::MPISinglePortsCommunication"} |
std::string | _addressDirectory |
std::map< int, MPI_Comm > | _direct |
A map of direct communication channels based on MPI_COMM_SELF on both sides. | |
MPI_Comm | _global = MPI_COMM_NULL |
The global inter-communicator that connects all ranks. | |
int | _initialCommSize = -1 |
The communicator size known from acceptConnection and requestConnection. | |
std::string | _portName = std::string(MPI_MAX_PORT_NAME, '\0') |
Name of the port used for connection. | |
bool | _isAcceptor = false |
Additional Inherited Members | |
Protected Member Functions inherited from precice::com::Communication | |
virtual int | adjustRank (Rank rank) const |
Adjusts the given rank bases on the _rankOffset. | |
Protected Attributes inherited from precice::com::Communication | |
int | _rankOffset = 0 |
Rank offset for primaries-secondary communication, since ranks are from 0 to size-2. | |
bool | _isConnected = false |
Provides connection methods based on MPI ports (part of MPI 2.0).
The two participants to be connected can be run in two process groups started up individually, i.e. not within the same process group.
Notes on the implementation:
acceptConnection / requestConnection still uses one communicator per connection, created on MPI_COMM_SELF.
acceptConnectionAsServer / requestConnectionAsClient just uses communicator[0], so it actually creates just one comm.
The reason of that is that the first variant is called in various different ways, mostly just from the accepting/receiving rank. In order to just use a single communicator, accept/request must be called on the entire global communicator. This would require quite some rework of the calling code. The gains would also be minuscule, because accept/request is mainly used for 1:1 connection anyways.
The latter, in contrast, is only called from m2n::PointToPointCommunication, due to that the p2p class was also heavily modified. But this connection method is the most important, because it does the m2n heavy lifiting.
If we agree, that acceptConnection / requestConnection just does 1:1 connection, we can rewrite and simplify the code.
Definition at line 36 of file MPISinglePortsCommunication.hpp.
|
explicit |
Definition at line 22 of file MPISinglePortsCommunication.cpp.
|
virtual |
Definition at line 30 of file MPISinglePortsCommunication.cpp.
|
overridevirtual |
Accepts connection from another communicator, which has to call requestConnection().
Establishes a 1-to-N communication, whereas the acceptor's side is the "1". Contrary to acceptConnectionAsServer(), the other side needs to be a proper communicator with ranks from 0 to N-1. It is not necessary to know this "N" a-priori on the acceptor's side. This communication is used for the 1:1 communication between two primary ranks and for the intra-participant communication. For the last case, setRankOffset() has to be set.
[in] | acceptorName | Name of calling participant. |
[in] | requesterName | Name of remote participant to connect to. |
[in] | tag | Tag for establishing this connection |
[in] | acceptorRank | Rank of the accpeting process, usually the calling one. |
Implements precice::com::Communication.
Definition at line 49 of file MPISinglePortsCommunication.cpp.
|
overridevirtual |
requesterCommunicatorSize is not used, since connection is always made on the entire communicator
Implements precice::com::Communication.
Definition at line 111 of file MPISinglePortsCommunication.cpp.
|
overridevirtual |
Clean-up environment used to establish the communication.
[in] | acceptorName | Name of calling participant. |
[in] | requesterName | Name of remote participant to connect to. |
Reimplemented from precice::com::Communication.
Definition at line 275 of file MPISinglePortsCommunication.cpp.
|
overridevirtual |
Disconnects from communication space, i.e. participant.
This method is called on destruction.
Implements precice::com::Communication.
Definition at line 208 of file MPISinglePortsCommunication.cpp.
|
overrideprivatevirtual |
Returns the communicator.
Implements precice::com::MPICommunication.
Definition at line 239 of file MPISinglePortsCommunication.cpp.
|
overridevirtual |
Returns the number of processes in the remote communicator.
Implements precice::com::Communication.
Definition at line 36 of file MPISinglePortsCommunication.cpp.
|
overridevirtual |
Prepare environment used to establish the communication.
[in] | acceptorName | Name of calling participant. |
[in] | requesterName | Name of remote participant to connect to. |
Reimplemented from precice::com::Communication.
Definition at line 262 of file MPISinglePortsCommunication.cpp.
|
overrideprivatevirtual |
Implements precice::com::MPICommunication.
Definition at line 250 of file MPISinglePortsCommunication.cpp.
|
overridevirtual |
Connects to another communicator, which has to call acceptConnection().
Establishes a 1-to-N communication, whereas the requestor's side is the "N". Contrary to requestConnectionAsClient(), this side needs to be a proper communicator with ranks from 0 to N-1. All ranks need to call this function. This communication is used for the 1:1 communication between two primary ranks, and for the intra-participant communication.
[in] | acceptorName | Name of remote participant to connect to. |
[in] | requesterName | Name of calling participant. |
[in] | tag | Tag for establishing this connection |
[in] | requesterRank | Rank of the requester (has to go from 0 to N-1) |
[in] | requesterCommunicatorSize | Size of the requester (N) |
Implements precice::com::Communication.
Definition at line 151 of file MPISinglePortsCommunication.cpp.
|
overridevirtual |
Connects to another communicator, which has to call acceptConnectionAsServer().
Establishes a 1-to-N communication, whereas the requestor's side is the "N". Contrary to requestConnection(), this side can have arbitrary ranks (e.g. 2,3,7). All ranks need to call this function. This communication is only used in PointToPointCommunication, i.e. for the M-to-N communication between two participants.
[in] | acceptorName | Name of calling participant. |
[in] | requesterName | Name of remote participant to connect to |
[in] | tag | Tag for establishing this connection |
[in] | acceptorRanks | Set of ranks that accept a connection |
[in] | requesterRank | Rank that requests the connection, usually the caller's rank |
Implements precice::com::Communication.
Definition at line 185 of file MPISinglePortsCommunication.cpp.
|
private |
Definition at line 83 of file MPISinglePortsCommunication.hpp.
A map of direct communication channels based on MPI_COMM_SELF on both sides.
These 1-1 connections are used until the has been a _global communicator established.
These direct connections connect MPI_COMM_SELF on both sides. The call to establish such a connection is thus not collective.
These connections are required for the primary and the intra-participant communications connections.
Definition at line 94 of file MPISinglePortsCommunication.hpp.
|
private |
The global inter-communicator that connects all ranks.
Once established, this is the default communicator for all communication.
The call to establish this communicator is collective over both communicators. Thus the call to requestConnectionAsClient() and acceptConnectionAsServer() is the only time window where this global communicator can be established.
Definition at line 104 of file MPISinglePortsCommunication.hpp.
|
private |
The communicator size known from acceptConnection and requestConnection.
Definition at line 107 of file MPISinglePortsCommunication.hpp.
|
private |
Definition at line 112 of file MPISinglePortsCommunication.hpp.
|
private |
Definition at line 81 of file MPISinglePortsCommunication.hpp.
|
private |
Name of the port used for connection.
Definition at line 110 of file MPISinglePortsCommunication.hpp.