You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
74 lines
2.3 KiB
74 lines
2.3 KiB
// Copyright 2005 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_PARALLEL_GLOBAL_INDEX_MAP_HPP |
|
#define BOOST_PARALLEL_GLOBAL_INDEX_MAP_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 <boost/property_map/property_map.hpp> |
|
#include <vector> |
|
#include <boost/shared_ptr.hpp> |
|
|
|
namespace boost { namespace parallel { |
|
|
|
template<typename IndexMap, typename GlobalMap> |
|
class global_index_map |
|
{ |
|
public: |
|
typedef typename property_traits<IndexMap>::key_type key_type; |
|
typedef typename property_traits<IndexMap>::value_type value_type; |
|
typedef value_type reference; |
|
typedef readable_property_map_tag category; |
|
|
|
template<typename ProcessGroup> |
|
global_index_map(ProcessGroup pg, value_type num_local_indices, |
|
IndexMap index_map, GlobalMap global) |
|
: index_map(index_map), global(global) |
|
{ |
|
typedef typename ProcessGroup::process_id_type process_id_type; |
|
starting_index.reset(new std::vector<value_type>(num_processes(pg) + 1)); |
|
send(pg, 0, 0, num_local_indices); |
|
synchronize(pg); |
|
|
|
// Populate starting_index in all processes |
|
if (process_id(pg) == 0) { |
|
(*starting_index)[0] = 0; |
|
for (process_id_type src = 0; src < num_processes(pg); ++src) { |
|
value_type n; |
|
receive(pg, src, 0, n); |
|
(*starting_index)[src + 1] = (*starting_index)[src] + n; |
|
} |
|
for (process_id_type dest = 1; dest < num_processes(pg); ++dest) |
|
send(pg, dest, 1, &starting_index->front(), num_processes(pg)); |
|
synchronize(pg); |
|
} else { |
|
synchronize(pg); |
|
receive(pg, 0, 1, &starting_index->front(), num_processes(pg)); |
|
} |
|
} |
|
|
|
friend inline value_type |
|
get(const global_index_map& gim, const key_type& x) |
|
{ |
|
using boost::get; |
|
return (*gim.starting_index)[get(gim.global, x).first] |
|
+ get(gim.index_map, x); |
|
} |
|
|
|
private: |
|
shared_ptr<std::vector<value_type> > starting_index; |
|
IndexMap index_map; |
|
GlobalMap global; |
|
}; |
|
|
|
} } // end namespace boost::parallel |
|
|
|
#endif // BOOST_PARALLEL_GLOBAL_INDEX_MAP_HPP
|
|
|