| // Copyright 2004 The Trustees of Indiana University. |
| |
| // 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) |
| |
| // Authors: Douglas Gregor |
| // Andrew Lumsdaine |
| #ifndef BOOST_GRAPH_PARALLEL_PROCESS_GROUP_HPP |
| #define BOOST_GRAPH_PARALLEL_PROCESS_GROUP_HPP |
| |
| #ifndef BOOST_GRAPH_USE_MPI |
| #error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included" |
| #endif |
| |
| #include <cstdlib> |
| #include <utility> |
| |
| namespace boost { namespace graph { namespace parallel { |
| |
| /** |
| * A special type used as a flag to a process group constructor that |
| * indicates that the copy of a process group will represent a new |
| * distributed data structure. |
| */ |
| struct attach_distributed_object { }; |
| |
| /** |
| * Describes the context in which a trigger is being invoked to |
| * receive a message. |
| */ |
| enum trigger_receive_context { |
| /// No trigger is active at this time. |
| trc_none, |
| /// The trigger is being invoked during synchronization, at the end |
| /// of a superstep. |
| trc_in_synchronization, |
| /// The trigger is being invoked as an "early" receive of a message |
| /// that was sent through the normal "send" operations to be |
| /// received by the end of the superstep, but the process group sent |
| /// the message earlier to clear its buffers. |
| trc_early_receive, |
| /// The trigger is being invoked for an out-of-band message, which |
| /// must be handled immediately. |
| trc_out_of_band, |
| /// The trigger is being invoked for an out-of-band message, which |
| /// must be handled immediately and has alredy been received by |
| /// an MPI_IRecv call. |
| trc_irecv_out_of_band |
| }; |
| |
| // Process group tags |
| struct process_group_tag {}; |
| struct linear_process_group_tag : virtual process_group_tag {}; |
| struct messaging_process_group_tag : virtual process_group_tag {}; |
| struct immediate_process_group_tag : virtual messaging_process_group_tag {}; |
| struct bsp_process_group_tag : virtual messaging_process_group_tag {}; |
| struct batch_process_group_tag : virtual messaging_process_group_tag {}; |
| struct locking_process_group_tag : virtual process_group_tag {}; |
| struct spawning_process_group_tag : virtual process_group_tag {}; |
| |
| struct process_group_archetype |
| { |
| typedef int process_id_type; |
| }; |
| |
| void wait(process_group_archetype&); |
| void synchronize(process_group_archetype&); |
| int process_id(const process_group_archetype&); |
| int num_processes(const process_group_archetype&); |
| |
| template<typename T> void send(process_group_archetype&, int, int, const T&); |
| |
| template<typename T> |
| process_group_archetype::process_id_type |
| receive(const process_group_archetype& pg, |
| process_group_archetype::process_id_type source, int tag, T& value); |
| |
| template<typename T> |
| std::pair<process_group_archetype::process_id_type, std::size_t> |
| receive(const process_group_archetype& pg, int tag, T values[], std::size_t n); |
| |
| template<typename T> |
| std::pair<process_group_archetype::process_id_type, std::size_t> |
| receive(const process_group_archetype& pg, |
| process_group_archetype::process_id_type source, int tag, T values[], |
| std::size_t n); |
| |
| } } } // end namespace boost::graph::parallel |
| |
| namespace boost { namespace graph { namespace distributed { |
| using parallel::trigger_receive_context; |
| using parallel::trc_early_receive; |
| using parallel::trc_out_of_band; |
| using parallel::trc_irecv_out_of_band; |
| using parallel::trc_in_synchronization; |
| using parallel::trc_none; |
| using parallel::attach_distributed_object; |
| } } } // end namespace boost::graph::distributed |
| |
| #endif // BOOST_GRAPH_PARALLEL_PROCESS_GROUP_HPP |