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

Go to the source code of this file.

Functions

void computeSendDataBlock1D (const GlobalData_t &gd, const LocalData_t &sd, const Topology_t &stopo, const Topology_t &dtopo, vAbstrait &vdarray, vector< unsigned > &destid, const PaCO::distLoc_t &mode, void *comm)
void computeSendDataBlock1DClient (const GlobalData_t &gd, const LocalData_t &sd, const Topology_t &stopo, const Topology_t &dtopo, vAbstrait &vdarray, vector< unsigned > &destid, void *comm)
void computeSendDataBlock1DComm ()
void computeSendDataBlock1DServer (const GlobalData_t &gd, const LocalData_t &sd, const Topology_t &stopo, const Topology_t &dtopo, vAbstrait &vdarray, vector< unsigned > &destid)

Function Documentation

void computeSendDataBlock1D ( const GlobalData_t &  gd,
const LocalData_t &  sd,
const Topology_t &  stopo,
const Topology_t &  dtopo,
vAbstrait &  vdarray,
vector< unsigned > &  destid,
const PaCO::distLoc_t mode,
void *  comm 
)

Definition at line 217 of file PC/ClientSide.cc.

References PaCO::ClientSide, PaCO::CommSide, computeSendDataBlock1DClient(), computeSendDataBlock1DComm(), computeSendDataBlock1DServer(), PaCO::none, and PaCO::ServerSide.

                                                    {

  switch(mode) {
  case PaCO::none: cerr << "INTERNAL ERROR: " << __FILE__ << " " << __FUNCTION__ << endl;
  case PaCO::ClientSide: computeSendDataBlock1DClient(gd, sd, stopo, dtopo, vdarray, destid, comm); break;
  case PaCO::ServerSide: computeSendDataBlock1DServer(gd, sd, stopo, dtopo, vdarray, destid); break;
  case PaCO::CommSide:   computeSendDataBlock1DComm  (); break;   
  }
  
}

Here is the call graph for this function:

void computeSendDataBlock1DClient ( const GlobalData_t &  gd,
const LocalData_t &  sd,
const Topology_t &  stopo,
const Topology_t &  dtopo,
vAbstrait &  vdarray,
vector< unsigned > &  destid,
void *  comm 
)

Definition at line 39 of file PC/ClientSide.cc.

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

{

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

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

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

  // Compute what to send
  cerr << "In computeSendDataBlock1DClient...computing what to send\n";
  computeSendBlock1D(gd, sd, stopo, dtopo, sched_send);

  // Compute what to receive
  cerr << "In computeSendDataBlock1DClient...computing what to receive\n";

  // compute how many dest local data this node has to handle
  unsigned int nvdarray  = dtopo.total/stopo.total;
  unsigned int remaining = (nvdarray*stopo.total + sd.rank < dtopo.total)?1:0;
  nvdarray += remaining;

  // Preparing also CORBA stuff
  vdarray.clear();
  vdarray.resize(nvdarray);
  destid.clear();
  destid.resize(nvdarray);

  // so, we simulate node from rank, rank+stopo.total ,... only if nvdarray>0
  unsigned dbsz = blockSize(gd.len, dtopo.total);
  //  cerr << "DBSZ: " << dbsz << endl;
  for (unsigned it=0; it<nvdarray; it++) {

    cerr << "computeSendDataBlock1DClient: it = " << it << endl;

    Abstrait* out = vdarray[it];

    out->topo().total   = dtopo.total;
    out->gd().len       = gd.len;
    out->gd().unit_size = gd.unit_size;

    // add for mode informations
    out->mode() = PaCO::ClientSide;

    out->dist().length(1);
    out->setSeqLength(1);

    PaCO::PacoLocalData_t& pld = out->dist()[0];
    LocalData_t dd;
    pld.rank  = dd.rank  = sd.rank + it * stopo.total;
    pld.start = dd.start = dd.rank * dbsz;
    pld.len   = dd.len   = localBlockLengthO(gd.len, dd.rank, dtopo.total, dbsz);

#ifdef DEBUG_INTERNAL
    fprintf(stderr, "%d: -- r:%d gl:%d ll:%d start:%d bz:%d dt:%d\n", pid,
       dd.rank, gd.len, dd.len, dd.start, dbsz, dtopo.total);
#endif

    destid[it] = dd.rank;

    // Allocating memory
#ifdef NO_COM
    dd.base = (char*) mymalloc(pld.len * gd.unit_size);
    out->setDataLength(0, pld.len);
#else
#ifdef DEBUG_INTERNAL
    cerr << "Allocating a sequence of length " << pld.len << endl;
#endif
    out->setDataLength(0, pld.len);
    if (pld.len > 0 )
      dd.base = out->getDataBuffer(0, false);
    else
      dd.base = (char*) 1;
#endif

    if (dd.base==0) {
      cerr << "Cannot allocate memory for #elements" << pld.len  << endl;
    } else {
#ifdef DEBUG_INTERNAL
      fprintf(stderr, "dd.base = %p\n", dd.base);
#endif
    }

    computeReceiveBlock1D(gd, dd, stopo, dtopo, sched_recv);
  }

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

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

Here is the call graph for this function:

Definition at line 210 of file PC/ClientSide.cc.

                                  {
}
void computeSendDataBlock1DServer ( const GlobalData_t &  gd,
const LocalData_t &  sd,
const Topology_t &  stopo,
const Topology_t &  dtopo,
vAbstrait &  vdarray,
vector< unsigned > &  destid 
)

Definition at line 157 of file PC/ClientSide.cc.

References PaCO::ServerSide.

{


  // Easy: node i send data to node i%dtopo.total
  // It has to send an empty message to nodes i+stopo.total, i+2*stopo.total ... < dtopo.total

  // How messages to send ?
  unsigned int nvdarray  = dtopo.total/stopo.total;
  unsigned int remaining = (nvdarray*stopo.total + sd.rank < dtopo.total)?1:0;
  nvdarray += remaining;

  // alwaays something to send
  if ( nvdarray == 0 ) nvdarray=1;

  // Preparing  CORBA stuff
  vdarray.clear();
  vdarray.resize(nvdarray);
  destid.clear();
  destid.resize(nvdarray);

  for (unsigned it=0; it<nvdarray; it++) {

    Abstrait* out = vdarray[it];

    out->topo().total   = stopo.total;
    out->gd().len       = gd.len;
    out->gd().unit_size = gd.unit_size;
    
    // add for mode information
    out->mode() = PaCO::ServerSide;

    if ( it == 0 ) { // always data to send
      out->dist().length(1);
      out->setSeqLength(1);

      out->dist()[0].rank  = sd.rank;
      out->dist()[0].start = sd.start;
      out->dist()[0].len   = sd.len;
      out->DataReplace(0, sd.len, sd.base, false);
    } else { // always nothing to send
      out->dist().length(0);
      out->setSeqLength(0);
    }
    destid[it] = ( sd.rank + it * stopo.total ) % dtopo.total;
  }
}