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

Reply via email to