preCICE v3.1.1
Loading...
Searching...
No Matches
Public Member Functions | Private Member Functions | Private Attributes | List of all members
precice::com::MPISinglePortsCommunication Class Reference

Provides connection methods based on MPI ports (part of MPI 2.0). More...

#include <MPISinglePortsCommunication.hpp>

Inheritance diagram for precice::com::MPISinglePortsCommunication:
[legend]
Collaboration diagram for precice::com::MPISinglePortsCommunication:
[legend]

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
Communicationoperator= (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_Commcommunicator (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
 

Detailed Description

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.

Constructor & Destructor Documentation

◆ MPISinglePortsCommunication()

precice::com::MPISinglePortsCommunication::MPISinglePortsCommunication ( std::string addressDirectory = ".")
explicit

Definition at line 22 of file MPISinglePortsCommunication.cpp.

Here is the call graph for this function:

◆ ~MPISinglePortsCommunication()

precice::com::MPISinglePortsCommunication::~MPISinglePortsCommunication ( )
virtual

Definition at line 30 of file MPISinglePortsCommunication.cpp.

Here is the call graph for this function:

Member Function Documentation

◆ acceptConnection()

void precice::com::MPISinglePortsCommunication::acceptConnection ( std::string const & acceptorName,
std::string const & requesterName,
std::string const & tag,
int acceptorRank,
int rankOffset = 0 )
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.

Parameters
[in]acceptorNameName of calling participant.
[in]requesterNameName of remote participant to connect to.
[in]tagTag for establishing this connection
[in]acceptorRankRank of the accpeting process, usually the calling one.

Implements precice::com::Communication.

Definition at line 49 of file MPISinglePortsCommunication.cpp.

Here is the call graph for this function:

◆ acceptConnectionAsServer()

void precice::com::MPISinglePortsCommunication::acceptConnectionAsServer ( std::string const & acceptorName,
std::string const & requesterName,
std::string const & tag,
int acceptorRank,
int requesterCommunicatorSize )
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.

Here is the call graph for this function:

◆ cleanupEstablishment()

void precice::com::MPISinglePortsCommunication::cleanupEstablishment ( std::string const & acceptorName,
std::string const & requesterName )
overridevirtual

Clean-up environment used to establish the communication.

Parameters
[in]acceptorNameName of calling participant.
[in]requesterNameName of remote participant to connect to.

Reimplemented from precice::com::Communication.

Definition at line 275 of file MPISinglePortsCommunication.cpp.

Here is the call graph for this function:

◆ closeConnection()

void precice::com::MPISinglePortsCommunication::closeConnection ( )
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.

Here is the call graph for this function:

◆ communicator()

MPI_Comm & precice::com::MPISinglePortsCommunication::communicator ( Rank rank)
overrideprivatevirtual

Returns the communicator.

Implements precice::com::MPICommunication.

Definition at line 239 of file MPISinglePortsCommunication.cpp.

Here is the call graph for this function:

◆ getRemoteCommunicatorSize()

size_t precice::com::MPISinglePortsCommunication::getRemoteCommunicatorSize ( )
overridevirtual

Returns the number of processes in the remote communicator.

Precondition
A connection to the remote participant has been set up.

Implements precice::com::Communication.

Definition at line 36 of file MPISinglePortsCommunication.cpp.

Here is the call graph for this function:

◆ prepareEstablishment()

void precice::com::MPISinglePortsCommunication::prepareEstablishment ( std::string const & acceptorName,
std::string const & requesterName )
overridevirtual

Prepare environment used to establish the communication.

Parameters
[in]acceptorNameName of calling participant.
[in]requesterNameName of remote participant to connect to.

Reimplemented from precice::com::Communication.

Definition at line 262 of file MPISinglePortsCommunication.cpp.

Here is the call graph for this function:

◆ rank()

int precice::com::MPISinglePortsCommunication::rank ( int rank)
overrideprivatevirtual

Implements precice::com::MPICommunication.

Definition at line 250 of file MPISinglePortsCommunication.cpp.

Here is the call graph for this function:

◆ requestConnection()

void precice::com::MPISinglePortsCommunication::requestConnection ( std::string const & acceptorName,
std::string const & requesterName,
std::string const & tag,
int requesterRank,
int requesterCommunicatorSize )
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.

Parameters
[in]acceptorNameName of remote participant to connect to.
[in]requesterNameName of calling participant.
[in]tagTag for establishing this connection
[in]requesterRankRank of the requester (has to go from 0 to N-1)
[in]requesterCommunicatorSizeSize of the requester (N)

Implements precice::com::Communication.

Definition at line 151 of file MPISinglePortsCommunication.cpp.

Here is the call graph for this function:

◆ requestConnectionAsClient()

void precice::com::MPISinglePortsCommunication::requestConnectionAsClient ( std::string const & acceptorName,
std::string const & requesterName,
std::string const & tag,
std::set< int > const & acceptorRanks,
int requesterRank )
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.

Parameters
[in]acceptorNameName of calling participant.
[in]requesterNameName of remote participant to connect to
[in]tagTag for establishing this connection
[in]acceptorRanksSet of ranks that accept a connection
[in]requesterRankRank that requests the connection, usually the caller's rank

Implements precice::com::Communication.

Definition at line 185 of file MPISinglePortsCommunication.cpp.

Here is the call graph for this function:

Member Data Documentation

◆ _addressDirectory

std::string precice::com::MPISinglePortsCommunication::_addressDirectory
private

Definition at line 83 of file MPISinglePortsCommunication.hpp.

◆ _direct

std::map<int, MPI_Comm> precice::com::MPISinglePortsCommunication::_direct
private

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.

◆ _global

MPI_Comm precice::com::MPISinglePortsCommunication::_global = MPI_COMM_NULL
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.

◆ _initialCommSize

int precice::com::MPISinglePortsCommunication::_initialCommSize = -1
private

The communicator size known from acceptConnection and requestConnection.

Definition at line 107 of file MPISinglePortsCommunication.hpp.

◆ _isAcceptor

bool precice::com::MPISinglePortsCommunication::_isAcceptor = false
private

Definition at line 112 of file MPISinglePortsCommunication.hpp.

◆ _log

logging::Logger precice::com::MPISinglePortsCommunication::_log {"com::MPISinglePortsCommunication"}
private

Definition at line 81 of file MPISinglePortsCommunication.hpp.

◆ _portName

std::string precice::com::MPISinglePortsCommunication::_portName = std::string(MPI_MAX_PORT_NAME, '\0')
private

Name of the port used for connection.

Definition at line 110 of file MPISinglePortsCommunication.hpp.


The documentation for this class was generated from the following files: