166 lines
5.8 KiB
C++
166 lines
5.8 KiB
C++
|
// 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
|