31 #ifndef __TASMANIAN_ADDONS_MPIDREAMSCATTER_HPP 
   32 #define __TASMANIAN_ADDONS_MPIDREAMSCATTER_HPP 
   56 #ifdef Tasmanian_ENABLE_MPI 
   85 template<
class Likelihood>
 
   86 int MPILikelihoodSend(Likelihood 
const &likely, 
int destination, 
int tag, MPI_Comm comm, 
int outputs_begin = 0, 
int outputs_end = -1){
 
   88     likely.write(ss, outputs_begin, outputs_end);
 
   89     while(ss.str().size() % 16 != 0) ss << 
" ";
 
   90     return MPI_Send(ss.str().c_str(), (
int) (ss.str().size() / 16), MPI_LONG_DOUBLE, destination, tag, comm);
 
  115 template<
class Likelihood>
 
  116 int MPILikelihoodRecv(Likelihood &likely, 
int source, 
int tag, MPI_Comm comm, MPI_Status *status = MPI_STATUS_IGNORE){
 
  117     MPI_Status internal_status;
 
  118     if (status == MPI_STATUS_IGNORE) status = &internal_status;
 
  121     MPI_Probe(source, tag, comm, status);
 
  122     MPI_Get_count(status, MPI_LONG_DOUBLE, &short_data_size);
 
  126     std::vector<char> buff(data_size);
 
  127     auto result = MPI_Recv(buff.data(), (
int) (data_size / 16), MPI_LONG_DOUBLE, source, tag, comm, status);
 
  130     std::istream is(&data_buffer);
 
  159 template<
class Likelihood>
 
  164         int num_ranks; MPI_Comm_size(comm, &num_ranks);
 
  165         int num_effective_ranks = std::min(num_ranks, source.getNumOutputs());
 
  167         int stride = source.getNumOutputs() / num_effective_ranks;
 
  168         int extras = source.getNumOutputs() % num_effective_ranks;
 
  171         auto offset = [&](
int rank)->
int{ 
return rank * stride + std::min(rank, extras); };
 
  173         for(
int rank=0; rank<num_effective_ranks; rank++){
 
  175                 std::stringstream ss;
 
  176                 source.write(ss, offset(rank), offset(rank+1));
 
  177                 destination.read(ss);
 
  179                 auto result = 
MPILikelihoodSend(source, rank, tag, comm, offset(rank), offset(rank+1));
 
  180                 if (result != MPI_SUCCESS) 
return result;
 
  183         for(
int rank=num_effective_ranks; rank<num_ranks; rank++){ 
 
  185                 destination = Likelihood();
 
  188                 if (result != MPI_SUCCESS) 
return result;
 
Coverts a vector to basic stream-buffer.
Definition: tsgMPIScatterGrid.hpp:72
int MPILikelihoodRecv(Likelihood &likely, int source, int tag, MPI_Comm comm, MPI_Status *status=MPI_STATUS_IGNORE)
Receive a likelihood from another process in the MPI comm.
Definition: tsgMPIScatterDream.hpp:116
int MPILikelihoodScatter(Likelihood const &source, Likelihood &destination, int root, int tag, MPI_Comm comm)
Split the likelihood across the comm where each rank receives an equal portion of the total outputs.
Definition: tsgMPIScatterDream.hpp:160
int MPILikelihoodSend(Likelihood const &likely, int destination, int tag, MPI_Comm comm, int outputs_begin=0, int outputs_end=-1)
Send a likelihood to another process in the MPI comm.
Definition: tsgMPIScatterDream.hpp:86
int getMPIRank(MPI_Comm comm)
Utility to return the rank within the given comm.
Definition: tsgMPIScatterGrid.hpp:87
size_t size_mult(IntA a, IntB b)
Converts two integer-like variables to size_t and returns the product..
Definition: tsgUtils.hpp:82
Encapsulates the Tasmanian DREAM module.
Definition: TasmanianDREAM.hpp:80
Sparse Grids send/receive through MPI.