mirror of
https://github.com/boostorg/mpi.git
synced 2026-02-25 04:22:17 +00:00
Add support for MPI groups
[SVN r37831]
This commit is contained in:
115
src/group.cpp
Normal file
115
src/group.cpp
Normal file
@@ -0,0 +1,115 @@
|
||||
// Copyright (C) 2007 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)
|
||||
#include <boost/mpi/group.hpp>
|
||||
#include <boost/mpi/communicator.hpp>
|
||||
|
||||
namespace boost { namespace mpi {
|
||||
|
||||
group::group(const MPI_Group& in_group, bool adopt)
|
||||
{
|
||||
if (in_group != MPI_GROUP_EMPTY) {
|
||||
if (adopt) group_ptr.reset(new MPI_Group(in_group), group_free());
|
||||
else group_ptr.reset(new MPI_Group(in_group));
|
||||
}
|
||||
}
|
||||
|
||||
group::group(const communicator& comm)
|
||||
{
|
||||
MPI_Group gr;
|
||||
BOOST_MPI_CHECK_RESULT(MPI_Comm_group, ((MPI_Comm)comm, &gr));
|
||||
|
||||
if (gr != MPI_GROUP_EMPTY)
|
||||
group_ptr.reset(new MPI_Group(gr), group_free());
|
||||
}
|
||||
|
||||
optional<int> group::rank() const
|
||||
{
|
||||
if (!group_ptr)
|
||||
return optional<int>();
|
||||
|
||||
int rank;
|
||||
BOOST_MPI_CHECK_RESULT(MPI_Group_rank, (*group_ptr, &rank));
|
||||
if (rank == MPI_UNDEFINED)
|
||||
return optional<int>();
|
||||
else
|
||||
return rank;
|
||||
}
|
||||
|
||||
int group::size() const
|
||||
{
|
||||
if (!group_ptr)
|
||||
return 0;
|
||||
|
||||
int size;
|
||||
BOOST_MPI_CHECK_RESULT(MPI_Group_size, (*group_ptr, &size));
|
||||
return size;
|
||||
}
|
||||
|
||||
bool operator==(const group& g1, const group& g2)
|
||||
{
|
||||
int result;
|
||||
BOOST_MPI_CHECK_RESULT(MPI_Group_compare,
|
||||
((MPI_Group)g1, (MPI_Group)g2, &result));
|
||||
return result == MPI_IDENT;
|
||||
}
|
||||
|
||||
group operator|(const group& g1, const group& g2)
|
||||
{
|
||||
MPI_Group result;
|
||||
BOOST_MPI_CHECK_RESULT(MPI_Group_union,
|
||||
((MPI_Group)g1, (MPI_Group)g2, &result));
|
||||
return group(result, /*adopt=*/true);
|
||||
}
|
||||
|
||||
group operator&(const group& g1, const group& g2)
|
||||
{
|
||||
MPI_Group result;
|
||||
BOOST_MPI_CHECK_RESULT(MPI_Group_intersection,
|
||||
((MPI_Group)g1, (MPI_Group)g2, &result));
|
||||
return group(result, /*adopt=*/true);
|
||||
}
|
||||
|
||||
group operator-(const group& g1, const group& g2)
|
||||
{
|
||||
MPI_Group result;
|
||||
BOOST_MPI_CHECK_RESULT(MPI_Group_difference,
|
||||
((MPI_Group)g1, (MPI_Group)g2, &result));
|
||||
return group(result, /*adopt=*/true);
|
||||
}
|
||||
|
||||
template<>
|
||||
int*
|
||||
group::translate_ranks(int* first, int* last, const group& to_group, int* out)
|
||||
{
|
||||
BOOST_MPI_CHECK_RESULT(MPI_Group_translate_ranks,
|
||||
((MPI_Group)*this,
|
||||
last-first,
|
||||
first,
|
||||
(MPI_Group)to_group,
|
||||
out));
|
||||
return out + (last - first);
|
||||
}
|
||||
|
||||
template<> group group::include(int* first, int* last)
|
||||
{
|
||||
MPI_Group result;
|
||||
BOOST_MPI_CHECK_RESULT(MPI_Group_incl,
|
||||
((MPI_Group)*this, last - first, first, &result));
|
||||
return group(result, /*adopt=*/true);
|
||||
}
|
||||
|
||||
template<> group group::exclude(int* first, int* last)
|
||||
{
|
||||
MPI_Group result;
|
||||
BOOST_MPI_CHECK_RESULT(MPI_Group_excl,
|
||||
((MPI_Group)*this, last - first, first, &result));
|
||||
return group(result, /*adopt=*/true);
|
||||
}
|
||||
|
||||
} } // end namespace boost::mpi
|
||||
Reference in New Issue
Block a user