Chris@16: // Copyright (C) 2005, 2006 Douglas Gregor . Chris@16: Chris@16: // Use, modification and distribution is subject to the Boost Software Chris@16: // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // Message Passing Interface 1.1 -- Section 4.4. Broadcast Chris@16: #ifndef BOOST_MPI_BROADCAST_HPP Chris@16: #define BOOST_MPI_BROADCAST_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace mpi { Chris@16: Chris@16: /************************************************************************ Chris@16: * Specializations * Chris@16: ************************************************************************/ Chris@16: Chris@16: /** Chris@16: * INTERNAL ONLY Chris@16: */ Chris@16: template<> Chris@16: BOOST_MPI_DECL void Chris@16: broadcast(const communicator& comm, Chris@16: const packed_oarchive& oa, Chris@16: int root); Chris@16: Chris@16: /** Chris@16: * INTERNAL ONLY Chris@16: */ Chris@16: template<> Chris@16: BOOST_MPI_DECL void Chris@16: broadcast(const communicator& comm, packed_oarchive& oa, Chris@16: int root); Chris@16: Chris@16: /** Chris@16: * INTERNAL ONLY Chris@16: */ Chris@16: template<> Chris@16: BOOST_MPI_DECL void Chris@16: broadcast(const communicator& comm, packed_iarchive& ia, Chris@16: int root); Chris@16: Chris@16: /** Chris@16: * INTERNAL ONLY Chris@16: */ Chris@16: template<> Chris@16: BOOST_MPI_DECL void Chris@16: broadcast(const communicator& comm, Chris@16: const packed_skeleton_oarchive& oa, Chris@16: int root); Chris@16: Chris@16: /** Chris@16: * INTERNAL ONLY Chris@16: */ Chris@16: template<> Chris@16: void Chris@16: broadcast(const communicator& comm, Chris@16: packed_skeleton_oarchive& oa, int root); Chris@16: Chris@16: /** Chris@16: * INTERNAL ONLY Chris@16: */ Chris@16: template<> Chris@16: void Chris@16: broadcast(const communicator& comm, Chris@16: packed_skeleton_iarchive& ia, int root); Chris@16: Chris@16: /** Chris@16: * INTERNAL ONLY Chris@16: */ Chris@16: template<> Chris@16: void broadcast(const communicator& comm, content& c, int root); Chris@16: Chris@16: /** Chris@16: * INTERNAL ONLY Chris@16: */ Chris@16: template<> Chris@16: void broadcast(const communicator& comm, const content& c, Chris@16: int root); Chris@16: Chris@16: /************************************************************************ Chris@16: * broadcast() implementation * Chris@16: ************************************************************************/ Chris@16: namespace detail { Chris@16: // We're sending a type that has an associated MPI datatype, so Chris@16: // we'll use MPI_Bcast to do all of the work. Chris@16: template Chris@16: void Chris@16: broadcast_impl(const communicator& comm, T* values, int n, int root, Chris@16: mpl::true_) Chris@16: { Chris@16: BOOST_MPI_CHECK_RESULT(MPI_Bcast, Chris@16: (values, n, Chris@16: boost::mpi::get_mpi_datatype(*values), Chris@16: root, MPI_Comm(comm))); Chris@16: } Chris@16: Chris@16: // We're sending a type that does not have an associated MPI Chris@16: // datatype, so we'll need to serialize it. Unfortunately, this Chris@16: // means that we cannot use MPI_Bcast, so we'll just send from the Chris@16: // root to everyone else. Chris@16: template Chris@16: void Chris@16: broadcast_impl(const communicator& comm, T* values, int n, int root, Chris@16: mpl::false_) Chris@16: { Chris@16: if (comm.rank() == root) { Chris@16: packed_oarchive oa(comm); Chris@16: for (int i = 0; i < n; ++i) Chris@16: oa << values[i]; Chris@16: broadcast(comm, oa, root); Chris@16: } else { Chris@16: packed_iarchive ia(comm); Chris@16: broadcast(comm, ia, root); Chris@16: for (int i = 0; i < n; ++i) Chris@16: ia >> values[i]; Chris@16: } Chris@16: } Chris@16: } // end namespace detail Chris@16: Chris@16: template Chris@16: void broadcast(const communicator& comm, T& value, int root) Chris@16: { Chris@16: detail::broadcast_impl(comm, &value, 1, root, is_mpi_datatype()); Chris@16: } Chris@16: Chris@16: template Chris@16: void broadcast(const communicator& comm, T* values, int n, int root) Chris@16: { Chris@16: detail::broadcast_impl(comm, values, n, root, is_mpi_datatype()); Chris@16: } Chris@16: Chris@16: } } // end namespace boost::mpi Chris@16: Chris@16: // If the user has already included skeleton_and_content.hpp, include Chris@16: // the code to broadcast skeletons and content. Chris@16: #ifdef BOOST_MPI_SKELETON_AND_CONTENT_HPP Chris@16: # include Chris@16: #endif Chris@16: Chris@16: #endif // BOOST_MPI_BROADCAST_HPP