void bi::MarginalSISHandler<B,A,S>::handle(boost::mpi::communicator child, boost::mpi::status status) { switch (status.tag()) { case MPI_TAG_STOPPER_LOGWEIGHTS: handleStopperLogWeights(child, status); break; case MPI_TAG_ADAPTER_SAMPLES: handleAdapterSamples(child, status); break; default: BI_WARN_MSG(false, "Misbehaving child, out-of-sequence tag " << status.tag()); } }
void mpi_process_group::receive_batch(boost::mpi::status& status) const { //std::cerr << "Handling batch\n"; outgoing_messages batch; //impl_->comm.recv(status.source(),status.tag(),batch); //receive_oob(*this,status.source(),msg_batch,batch); // Determine how big the receive buffer should be #if BOOST_VERSION >= 103600 int size = status.count<boost::mpi::packed>().get(); #else int size; MPI_Status mpi_status(status); MPI_Get_count(&mpi_status, MPI_PACKED, &size); #endif // Allocate the receive buffer boost::mpi::packed_iarchive in(impl_->comm,size); // Receive the message data MPI_Recv(in.address(), size, MPI_PACKED, status.source(), status.tag(), impl_->comm, MPI_STATUS_IGNORE); // Unpack the message data in >> batch; receive_batch(status.source(),batch); }
void bi::MarginalSISHandler<B,A,S>::handleAdapterSamples( boost::mpi::communicator child, boost::mpi::status status) { typedef typename temp_host_matrix<real>::type matrix_type; static const int N = B::NP; /* add samples */ boost::optional<int> n = status.template count<real>(); if (n) { matrix_type Z(N + T, *n / (N + T)); child.recv(status.source(), status.tag(), Z.buf(), *n); for (int j = 0; j < Z.size2(); ++j) { adapter.add(subrange(column(Z,j), 0, N), subrange(column(Z,j), N, T)); } } /* send new proposal if necessary */ if (adapter.stop(t)) { adapter.adapt(t); BOOST_AUTO(q, adapter.get(t)); BOOST_AUTO(iter, node.children.begin()); for (; iter != node.children.end(); ++iter) { node.requests.push_front(iter->isend(0, MPI_TAG_ADAPTER_PROPOSAL, q)); } ///@todo Serialize q into archive just once, then send to all. This may ///be how broadcast is already implemented in Boost.MPI. } }
void bi::MarginalSISHandler<B,A,S>::handleStopperLogWeights( boost::mpi::communicator child, boost::mpi::status status) { typedef typename temp_host_vector<real>::type vector_type; double maxlw = BI_INF; /* add weights */ boost::optional<int> n = status.template count<real>(); if (n) { vector_type lws(*n); child.recv(status.source(), status.tag(), lws.buf(), *n); stopper.add(lws, maxlw); } /* signal stop if necessary */ if (stopper.stop()) { BOOST_AUTO(iter, node.children.begin()); for (; iter != node.children.end(); ++iter) { node.requests.push_front(iter->isend(0, MPI_TAG_STOPPER_STOP)); } } }