Update of /cvsroot/boost/boost/boost/mpi
In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv6755/boost/mpi
Modified Files:
communicator.hpp group.hpp
Added Files:
intercommunicator.hpp
Log Message:
Add support for MPI intercommunicators
--- NEW FILE: intercommunicator.hpp ---
// 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;
class 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>& comm_ptr)
{
this->comm_ptr = comm_ptr;
}
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
Index: communicator.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/mpi/communicator.hpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- communicator.hpp 1 Jun 2007 18:22:00 -0000 1.6
+++ communicator.hpp 4 Jun 2007 14:49:13 -0000 1.7
@@ -89,12 +89,20 @@
/**
* INTERNAL ONLY
*
- * Forward-declaration of @c group needed for the @c group
- * constructor.
+ * Forward declaration of @c group needed for the @c group
+ * constructor and accessor.
*/
class group;
/**
+ * INTERNAL ONLY
+ *
+ * Forward declaration of @c intercommunicator needed for the "cast"
+ * from a communicator to an intercommunicator.
+ */
+class intercommunicator;
+
+/**
* @brief A communicator that permits communication and
* synchronization among a set of processes.
*
@@ -126,9 +134,13 @@
* ignored. Otherwise, the @p kind parameters 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.
+ * - 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 @p comm is a valid MPI
+ * intracommunicator or if the underlying MPI implementation
+ * supports MPI 2.0 (which supports duplication of
+ * intercommunicators).
*
* - If @p kind is @c comm_take_ownership, take ownership of @c
* comm. It will be freed automatically when all of the Boost.MPI
@@ -156,7 +168,7 @@
* @param subgroup A subgroup of the MPI communicator, @p comm, for
* which we will construct a new communicator.
*/
- communicator(const communicator& comm, const group& subgroup);
+ communicator(const communicator& comm, const boost::mpi::group& subgroup);
/**
* @brief Determine the rank of the executing process in a
@@ -178,6 +190,13 @@
*/
int size() const;
+ /**
+ * This routine constructs a new group whose members are the
+ * processes within this communicator. Equivalent to
+ * calling @c MPI_Comm_group.
+ */
+ boost::mpi::group group() const;
+
// ----------------------------------------------------------------
// Point-to-point communication
// ----------------------------------------------------------------
@@ -767,6 +786,16 @@
communicator split(int color, int key) const;
/**
+ * Determine if the communicator is in fact an intercommunicator
+ * and, if so, return that intercommunicator.
+ *
+ * @returns an @c optional containing the intercommunicator, if this
+ * communicator is in fact an intercommunicator. Otherwise, returns
+ * an empty @c optional.
+ */
+ optional<intercommunicator> as_intercommunicator() const;
+
+ /**
* Determines whether this communicator has a Cartesian topology.
*/
bool has_cartesian_topology() const;
@@ -876,7 +905,7 @@
}
};
- private:
+
/**
* INTERNAL ONLY
*
Index: group.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/mpi/group.hpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- group.hpp 1 Jun 2007 16:56:43 -0000 1.2
+++ group.hpp 4 Jun 2007 14:49:13 -0000 1.3
@@ -23,14 +23,6 @@
namespace boost { namespace mpi {
/**
- * INTERNAL ONLY
- *
- * Forward-declaration of @c communicator needed for the @c
- * communicator constructor.
- */
-class communicator;
-
-/**
* @brief A @c group is a representation of a subset of the processes
* within a @c communicator.
*
@@ -69,18 +61,6 @@
group(const MPI_Group& in_group, bool adopt);
/**
- *
- * @brief Constructs a group from a communicator.
- *
- * This routine constructs a new group whose members are the
- * processes within the given communicator, @p comm. Equivalent to
- * calling @c MPI_Comm_group.
- *
- * @param comm The communicator whose group we are constructing.
- */
- group(const communicator& comm);
-
- /**
* @brief Determine the rank of the calling process in the group.
*
* This routine is equivalent to @c MPI_Group_rank.
@@ -197,7 +177,7 @@
/**
* INTERNAL ONLY
*
- * Function object that frees an MPI communicator and deletes the
+ * Function object that frees an MPI group and deletes the
* memory associated with it. Intended to be used as a deleter with
* shared_ptr.
*/
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Boost-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/boost-cvs