You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
165 lines
5.6 KiB
165 lines
5.6 KiB
// Copyright (C) 2007 The Trustees of Indiana University. |
|
|
|
// Authors: Douglas Gregor |
|
// Andrew Lumsdaine |
|
|
|
// Use, modification and distribution is subject to the Boost Software |
|
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at |
|
// http://www.boost.org/LICENSE_1_0.txt) |
|
|
|
/** @file intercommunicator.hpp |
|
* |
|
* This header defines the @c intercommunicator class, which permits |
|
* communication between different process groups. |
|
*/ |
|
#ifndef BOOST_MPI_INTERCOMMUNICATOR_HPP |
|
#define BOOST_MPI_INTERCOMMUNICATOR_HPP |
|
|
|
#include <boost/mpi/communicator.hpp> |
|
|
|
namespace boost { namespace mpi { |
|
|
|
/** |
|
* INTERNAL ONLY |
|
* |
|
* Forward declaration of the MPI "group" representation, for use in |
|
* the description of the @c intercommunicator class. |
|
*/ |
|
class group; |
|
|
|
/** |
|
* @brief Communication facilities among processes in different |
|
* groups. |
|
* |
|
* The @c intercommunicator class provides communication facilities |
|
* among processes from different groups. An intercommunicator is |
|
* always associated with two process groups: one "local" process |
|
* group, containing the process that initiates an MPI operation |
|
* (e.g., the sender in a @c send operation), and one "remote" process |
|
* group, containing the process that is the target of the MPI |
|
* operation. |
|
* |
|
* While intercommunicators have essentially the same point-to-point |
|
* operations as intracommunicators (the latter communicate only |
|
* within a single process group), all communication with |
|
* intercommunicators occurs between the processes in the local group |
|
* and the processes in the remote group; communication within a group |
|
* must use a different (intra-)communicator. |
|
* |
|
*/ |
|
class BOOST_MPI_DECL intercommunicator : public communicator |
|
{ |
|
private: |
|
friend class communicator; |
|
|
|
/** |
|
* INTERNAL ONLY |
|
* |
|
* Construct an intercommunicator given a shared pointer to the |
|
* underlying MPI_Comm. This operation is used for "casting" from a |
|
* communicator to an intercommunicator. |
|
*/ |
|
explicit intercommunicator(const shared_ptr<MPI_Comm>& cp) |
|
{ |
|
this->comm_ptr = cp; |
|
} |
|
|
|
public: |
|
/** |
|
* Build a new Boost.MPI intercommunicator based on the MPI |
|
* intercommunicator @p comm. |
|
* |
|
* @p comm may be any valid MPI intercommunicator. If @p comm is |
|
* MPI_COMM_NULL, an empty communicator (that cannot be used for |
|
* communication) is created and the @p kind parameter is |
|
* ignored. Otherwise, the @p kind parameter determines how the |
|
* Boost.MPI communicator will be related to @p comm: |
|
* |
|
* - If @p kind is @c comm_duplicate, duplicate @c comm to create |
|
* a new communicator. This new communicator will be freed when |
|
* the Boost.MPI communicator (and all copies of it) is |
|
* destroyed. This option is only permitted if the underlying MPI |
|
* implementation supports MPI 2.0; duplication of |
|
* intercommunicators is not available in MPI 1.x. |
|
* |
|
* - If @p kind is @c comm_take_ownership, take ownership of @c |
|
* comm. It will be freed automatically when all of the Boost.MPI |
|
* communicators go out of scope. |
|
* |
|
* - If @p kind is @c comm_attach, this Boost.MPI communicator |
|
* will reference the existing MPI communicator @p comm but will |
|
* not free @p comm when the Boost.MPI communicator goes out of |
|
* scope. This option should only be used when the communicator is |
|
* managed by the user. |
|
*/ |
|
intercommunicator(const MPI_Comm& comm, comm_create_kind kind) |
|
: communicator(comm, kind) { } |
|
|
|
/** |
|
* Constructs a new intercommunicator whose local group is @p local |
|
* and whose remote group is @p peer. The intercommunicator can then |
|
* be used to communicate between processes in the two groups. This |
|
* constructor is equivalent to a call to @c MPI_Intercomm_create. |
|
* |
|
* @param local The intracommunicator containing all of the |
|
* processes that will go into the local group. |
|
* |
|
* @param local_leader The rank within the @p local |
|
* intracommunicator that will serve as its leader. |
|
* |
|
* @param peer The intracommunicator containing all of the processes |
|
* that will go into the remote group. |
|
* |
|
* @param remote_leader The rank within the @p peer group that will |
|
* serve as its leader. |
|
*/ |
|
intercommunicator(const communicator& local, int local_leader, |
|
const communicator& peer, int remote_leader); |
|
|
|
/** |
|
* Returns the size of the local group, i.e., the number of local |
|
* processes that are part of the group. |
|
*/ |
|
int local_size() const { return this->size(); } |
|
|
|
/** |
|
* Returns the local group, containing all of the local processes in |
|
* this intercommunicator. |
|
*/ |
|
boost::mpi::group local_group() const; |
|
|
|
/** |
|
* Returns the rank of this process within the local group. |
|
*/ |
|
int local_rank() const { return this->rank(); } |
|
|
|
/** |
|
* Returns the size of the remote group, i.e., the number of |
|
* processes that are part of the remote group. |
|
*/ |
|
int remote_size() const; |
|
|
|
/** |
|
* Returns the remote group, containing all of the remote processes |
|
* in this intercommunicator. |
|
*/ |
|
boost::mpi::group remote_group() const; |
|
|
|
/** |
|
* Merge the local and remote groups in this intercommunicator into |
|
* a new intracommunicator containing the union of the processes in |
|
* both groups. This method is equivalent to @c MPI_Intercomm_merge. |
|
* |
|
* @param high Whether the processes in this group should have the |
|
* higher rank numbers than the processes in the other group. Each |
|
* of the processes within a particular group shall have the same |
|
* "high" value. |
|
* |
|
* @returns the new, merged intracommunicator |
|
*/ |
|
communicator merge(bool high) const; |
|
}; |
|
|
|
} } // end namespace boost::mpi |
|
|
|
#endif // BOOST_MPI_INTERCOMMUNICATOR_HPP
|
|
|