60 InputIterator first_stash_idx,
61 InputIterator last_stash_idx,
67 typedef typename Stash::size_type
size_type;
69 mpi::communicator comm = ownership.
comm();
80 std::vector<size_type> msg_size(nproc, 0);
81 std::vector<size_type> msg_mark(nproc, 0);
86 for (InputIterator iter_idx = first_stash_idx; iter_idx != last_stash_idx; iter_idx++, i++) {
87 for (; iproc < nproc; iproc++) {
88 if (*iter_idx >= ownership[iproc] && *iter_idx < ownership[iproc+1]) {
90 if (!msg_mark[iproc]) {
97 assert_macro (iproc != nproc,
"bad stash data: index "<<*iter_idx<<
" out of range [0:"<<ownership[nproc]<<
"[");
103 if (msg_size [my_proc] != 0) {
104 msg_size [my_proc] = 0;
105 msg_mark [my_proc] = 0;
112 std::vector<size_type> work (nproc);
115 msg_mark.begin().operator->(),
117 work.begin().operator->(),
118 std::plus<size_type>());
119 size_type receive_nproc = work [my_proc];
126 msg_size.begin().operator->(),
128 work.begin().operator->(),
129 mpi::maximum<size_type>());
130 size_type receive_max_size = work [my_proc];
142 receive.data.resize (receive_nproc*receive_max_size);
143 receive.waits.clear();
144 for (
size_t i_receive = 0; i_receive < receive_nproc; i_receive++) {
145 mpi::request i_req = comm.irecv (
148 receive.data.begin().operator->() + i_receive*receive_max_size,
150 receive.waits.push_back (std::make_pair(i_receive, i_req));
158 send.data.resize (stash.size());
159 copy (stash.begin(), stash.end(), send.data.begin());
170 for (
size_type iproc = 0; iproc < nproc; iproc++) {
172 if (i_msg_size == 0)
continue;
173 mpi::request i_req = comm.isend (
176 send.data.begin().operator->() + i_start,
178 send.waits.push_back(std::make_pair(i_send,i_req));
180 i_start += i_msg_size;
183 return receive_max_size;
Stash::size_type mpi_assembly_begin(const Stash &stash, InputIterator first_stash_idx, InputIterator last_stash_idx, const distributor &ownership, Message &receive, Message &send)