PaCO++  0.05
ServerSide.cc File Reference
#include <stdio.h>
#include "Schedule.h"
#include "DistributionBloc.h"
#include "Internal.h"
Include dependency graph for PC/ServerSide.cc:

Go to the source code of this file.

Defines

#define DEBUG_INTERNAL

Functions

bool computeReceiveDataBlock1D (vAbstrait *vdarray, const PaCO::distLoc_t &mode, const unsigned dtotal, const unsigned drank, Abstrait *varray, void *comm)
void computeReceiveDataBlock1DServer (vAbstrait *vdarray, const Topology_t &dtopo, Abstrait *varray, void *comm)
 varray must contain the rank of the caller
unsigned nbofPart (const PaCO::distLoc_t &mode, const unsigned stotal, const unsigned dtotal, const unsigned drank)
unsigned posofPart (const PaCO::distLoc_t &mode, const unsigned dtotal, const unsigned srank)

Define Documentation

#define DEBUG_INTERNAL

Definition at line 11 of file PC/ServerSide.cc.


Function Documentation

bool computeReceiveDataBlock1D ( vAbstrait *  vdarray,
const PaCO::distLoc_t mode,
const unsigned  dtotal,
const unsigned  drank,
Abstrait *  varray,
void *  comm 
)

Definition at line 135 of file PC/ServerSide.cc.

References PaCO::ClientSide, PaCO::CommSide, computeReceiveDataBlock1DServer(), PaCO::none, and PaCO::ServerSide.

                                                {

  cerr << "In computeReceiveDataBlock1D...\n";
  
  switch(mode) {
  case PaCO::none:
    cerr << "INTERNAL ERROR: " << __FILE__ << " " << __FUNCTION__ << endl;
    break;
  case PaCO::ClientSide:
    cerr << "Client Side case" <<endl;
    varray->CopyAndGetSequenceOwner((*vdarray)[0]);
    cerr << "Return true" << endl;
    return true;
    break; 
    
  case PaCO::ServerSide: {
    // data has been sent from source i to dest i % dtopo.total
    // so dest j has : j, j + dtopo.total, j+2*dtopo.total
    // so it may be 1 (at least activation) or more
    cerr << " vdaray size: " << vdarray->size() << endl;

//      unsigned stotal = (*vdarray)[0]->topo().total;
//      unsigned int nvdarray  = stotal/dtotal;
//      unsigned int remaining = (nvdarray*dtotal + drank < stotal)?1:0;
//      nvdarray += remaining;
//      if ( nvdarray == 0 ) nvdarray=1; // alway at least one

//      fprintf(stderr, "computeReceiveDataBlock1D: Node %d : got %d of %d data\n", drank, vdarray->size(), nvdarray);
    
//      if (vdarray->size() == nvdarray) {

    cerr << "DOING  LOCAL REDISTRIBUTION width drank: "<< drank << endl;
    Topology_t dtopo;
    dtopo.total   = dtotal;

    varray->topo() = (*vdarray)[0]->topo();
    varray->gd()   = (*vdarray)[0]->gd();
    varray->dist().length(1);
    varray->dist()[0].rank  = drank;

    computeReceiveDataBlock1DServer(vdarray, dtopo, varray, comm);

    return true;
    break;
  }
  case PaCO::CommSide:
    break;
  }
  return false;
}

Here is the call graph for this function:

void computeReceiveDataBlock1DServer ( vAbstrait *  vdarray,
const Topology_t &  dtopo,
Abstrait *  varray,
void *  comm 
)

varray must contain the rank of the caller

Definition at line 18 of file PC/ServerSide.cc.

References blockSize(), computeReceiveBlock1D(), computeSendBlock1D(), doSchedule(), PaCO::PacoLocalData_s::len, localBlockLengthO(), PaCO::PacoLocalData_s::rank, sd, and PaCO::PacoLocalData_s::start.

{

  cerr << "In computeReceiveDataBlock1DServer...\n";

  vector<LocalData_t> sched_send;
  vector<LocalData_t> sched_recv;

  sched_send.clear();
  sched_recv.clear();

  // Init data from 1st: all entries are assumed to be identical !
  GlobalData_t& gd = (*vdarray)[0]->gd();
  Topology_t& stopo= (*vdarray)[0]->topo();

  // Compute what to send
  cerr << "In computeReceiveDataBlock1DServer...computing what to send\n";
  for (unsigned it=0; it<vdarray->size(); it++) { 
    if ((*vdarray)[it]->dist().length()==0) {
      cerr << "Dist data empty: nothing to send\n";
    } else {
      cerr << "it = " << it << endl;
      PaCO::PacoLocalData_t psd = (*vdarray)[it]->dist()[0];
      LocalData_t  sd;
      sd.rank  = psd.rank;
      sd.start = psd.start;
      sd.len   = psd.len;
      sd.base  = (*vdarray)[it]->getDataBuffer(0, false);
      computeSendBlock1D(gd, sd, stopo, dtopo, sched_send);
    }
  }

  // Compute what to receive
  cerr << "In computeReceiveDataBlock1DServer...computing what to receive\n";
  
  // Allocating memory

  unsigned dbsz = blockSize(gd.len, dtopo.total);
  LocalData_t vd;
  vd.rank  = varray->dist()[0].rank;
  vd.start = vd.rank * dbsz;
  vd.len   = localBlockLengthO(gd.len, vd.rank, dtopo.total, dbsz);

#ifdef DEBUG_INTERNAL
  cerr << "Allocating a sequence of length " << vd.len << endl;
#endif
  varray->setSeqLength(1);
  varray->setDataLength(0, vd.len);
  if (vd.len > 0 )
    vd.base = varray->getDataBuffer(0, false);
  else
    vd.base = (char*) 1;
  
  if (vd.base==0) {
    cerr << "Cannot allocate memory for #elements" << vd.len  << endl;
  } else {
#ifdef DEBUG_INTERNAL
    fprintf(stderr, "dd.base = %p\n", vd.base);
#endif
  }
  
  computeReceiveBlock1D(gd, vd, stopo, dtopo, sched_recv);

  // Doing local communication
  fprintf(stderr, "In computeReceiveDataBlock1DServer...Doing local communications with ctopo: %ld\n", dtopo.total);
  doSchedule(gd, vd, dtopo, sched_send, sched_recv, comm); 

  cerr << "In computeReceiveDataBlock1DServer...ok\n";
}

Here is the call graph for this function:

unsigned nbofPart ( const PaCO::distLoc_t mode,
const unsigned  stotal,
const unsigned  dtotal,
const unsigned  drank 
)

Definition at line 105 of file PC/ServerSide.cc.

References PaCO::ClientSide, PaCO::CommSide, PaCO::none, and PaCO::ServerSide.

Referenced by ParisBlockMPC::computeReceive(), BasicDistributionLibrary::computeReceive(), and ParisBlock::computeReceive().

                                                                                                                  {
  switch(mode) {
  case PaCO::none: cerr << "INTERNAL ERROR: " << __FILE__ << " " << __FUNCTION__ << endl; return 0;
  case PaCO::ClientSide: return 1; 
  case PaCO::ServerSide:
    {
      unsigned int nvdarray  = stotal/dtotal;
      unsigned int remaining = (nvdarray*dtotal + drank < stotal)?1:0;
      nvdarray += remaining;
      if ( nvdarray == 0 ) return 1; // alway at least one
      return nvdarray;
    }
  case PaCO::CommSide: cerr << "INTERNAL ERROR: not yet implemented in " << __FILE__ << " " << __FUNCTION__ << endl; return 0;
  }
  return 0;
}
unsigned posofPart ( const PaCO::distLoc_t mode,
const unsigned  dtotal,
const unsigned  srank 
)

Definition at line 122 of file PC/ServerSide.cc.

References PaCO::ClientSide, PaCO::CommSide, PaCO::none, and PaCO::ServerSide.

Referenced by ParisBlockMPC::computeReceive(), BasicDistributionLibrary::computeReceive(), and ParisBlock::computeReceive().

                                                                                            {
  switch(mode) {
  case PaCO::none: cerr << "INTERNAL ERROR: " << __FILE__ << " " << __FUNCTION__ << endl; return 0;
  case PaCO::ClientSide: return 0; 
  case PaCO::ServerSide: return srank / dtotal;
  case PaCO::CommSide: cerr << "INTERNAL ERROR: not yet implemented in " << __FILE__ << " " << __FUNCTION__ << endl; return 0;
  }
  return 0;
}