PaCO++  0.05
ServerSide.cc
Go to the documentation of this file.
00001 /* Padico Advanced Examples
00002  * author: Christian Pérez
00003  */
00004 
00005 #include <stdio.h>
00006 
00007 #include "Schedule.h"
00008 #include "DistributionBloc.h"
00009 #include "Internal.h"
00010 
00011 #define DEBUG_INTERNAL
00012 
00013 /************************************************************/
00014 /************************************************************/
00015 /************************************************************/
00016 
00018 void computeReceiveDataBlock1DServer(vAbstrait* vdarray, const Topology_t &dtopo, Abstrait* varray, void* comm)
00019 {
00020 
00021   cerr << "In computeReceiveDataBlock1DServer...\n";
00022 
00023   vector<LocalData_t> sched_send;
00024   vector<LocalData_t> sched_recv;
00025 
00026   sched_send.clear();
00027   sched_recv.clear();
00028 
00029   // Init data from 1st: all entries are assumed to be identical !
00030   GlobalData_t& gd = (*vdarray)[0]->gd();
00031   Topology_t& stopo= (*vdarray)[0]->topo();
00032 
00036   // Compute what to send
00038   cerr << "In computeReceiveDataBlock1DServer...computing what to send\n";
00039   for (unsigned it=0; it<vdarray->size(); it++) { 
00040     if ((*vdarray)[it]->dist().length()==0) {
00041       cerr << "Dist data empty: nothing to send\n";
00042     } else {
00043       cerr << "it = " << it << endl;
00044       PaCO::PacoLocalData_t psd = (*vdarray)[it]->dist()[0];
00045       LocalData_t  sd;
00046       sd.rank  = psd.rank;
00047       sd.start = psd.start;
00048       sd.len   = psd.len;
00049       sd.base  = (*vdarray)[it]->getDataBuffer(0, false);
00050       computeSendBlock1D(gd, sd, stopo, dtopo, sched_send);
00051     }
00052   }
00053 
00057   // Compute what to receive
00059   cerr << "In computeReceiveDataBlock1DServer...computing what to receive\n";
00060   
00063   // Allocating memory
00064 
00065   unsigned dbsz = blockSize(gd.len, dtopo.total);
00066   LocalData_t vd;
00067   vd.rank  = varray->dist()[0].rank;
00068   vd.start = vd.rank * dbsz;
00069   vd.len   = localBlockLengthO(gd.len, vd.rank, dtopo.total, dbsz);
00070 
00071 #ifdef DEBUG_INTERNAL
00072   cerr << "Allocating a sequence of length " << vd.len << endl;
00073 #endif
00074   varray->setSeqLength(1);
00075   varray->setDataLength(0, vd.len);
00076   if (vd.len > 0 )
00077     vd.base = varray->getDataBuffer(0, false);
00078   else
00079     vd.base = (char*) 1;
00080   
00081   if (vd.base==0) {
00082     cerr << "Cannot allocate memory for #elements" << vd.len  << endl;
00083   } else {
00084 #ifdef DEBUG_INTERNAL
00085     fprintf(stderr, "dd.base = %p\n", vd.base);
00086 #endif
00087   }
00088   
00089   computeReceiveBlock1D(gd, vd, stopo, dtopo, sched_recv);
00090 
00094   // Doing local communication
00096   fprintf(stderr, "In computeReceiveDataBlock1DServer...Doing local communications with ctopo: %ld\n", dtopo.total);
00097   doSchedule(gd, vd, dtopo, sched_send, sched_recv, comm); 
00098 
00099   cerr << "In computeReceiveDataBlock1DServer...ok\n";
00100 }
00101 
00104 
00105 unsigned nbofPart(const PaCO::distLoc_t& mode, const unsigned stotal, const unsigned dtotal, const unsigned drank)  {
00106   switch(mode) {
00107   case PaCO::none: cerr << "INTERNAL ERROR: " << __FILE__ << " " << __FUNCTION__ << endl; return 0;
00108   case PaCO::ClientSide: return 1; 
00109   case PaCO::ServerSide:
00110     {
00111       unsigned int nvdarray  = stotal/dtotal;
00112       unsigned int remaining = (nvdarray*dtotal + drank < stotal)?1:0;
00113       nvdarray += remaining;
00114       if ( nvdarray == 0 ) return 1; // alway at least one
00115       return nvdarray;
00116     }
00117   case PaCO::CommSide: cerr << "INTERNAL ERROR: not yet implemented in " << __FILE__ << " " << __FUNCTION__ << endl; return 0;
00118   }
00119   return 0;
00120 }
00121 
00122 unsigned posofPart(const PaCO::distLoc_t& mode, const unsigned dtotal, const unsigned srank)  {
00123   switch(mode) {
00124   case PaCO::none: cerr << "INTERNAL ERROR: " << __FILE__ << " " << __FUNCTION__ << endl; return 0;
00125   case PaCO::ClientSide: return 0; 
00126   case PaCO::ServerSide: return srank / dtotal;
00127   case PaCO::CommSide: cerr << "INTERNAL ERROR: not yet implemented in " << __FILE__ << " " << __FUNCTION__ << endl; return 0;
00128   }
00129   return 0;
00130 }
00131 
00134 
00135 bool computeReceiveDataBlock1D(vAbstrait* vdarray, const PaCO::distLoc_t& mode,
00136                 const unsigned dtotal, const unsigned drank,
00137                 /*out*/ Abstrait* varray, void* comm) {
00138 
00139   cerr << "In computeReceiveDataBlock1D...\n";
00140   
00141   switch(mode) {
00142   case PaCO::none:
00143     cerr << "INTERNAL ERROR: " << __FILE__ << " " << __FUNCTION__ << endl;
00144     break;
00145   case PaCO::ClientSide:
00146     cerr << "Client Side case" <<endl;
00147     varray->CopyAndGetSequenceOwner((*vdarray)[0]);
00148     cerr << "Return true" << endl;
00149     return true;
00150     break; 
00151     
00152   case PaCO::ServerSide: {
00153     // data has been sent from source i to dest i % dtopo.total
00154     // so dest j has : j, j + dtopo.total, j+2*dtopo.total
00155     // so it may be 1 (at least activation) or more
00156     cerr << " vdaray size: " << vdarray->size() << endl;
00157 
00158 //      unsigned stotal = (*vdarray)[0]->topo().total;
00159 //      unsigned int nvdarray  = stotal/dtotal;
00160 //      unsigned int remaining = (nvdarray*dtotal + drank < stotal)?1:0;
00161 //      nvdarray += remaining;
00162 //      if ( nvdarray == 0 ) nvdarray=1; // alway at least one
00163 
00164 //      fprintf(stderr, "computeReceiveDataBlock1D: Node %d : got %d of %d data\n", drank, vdarray->size(), nvdarray);
00165     
00166 //      if (vdarray->size() == nvdarray) {
00167 
00168     cerr << "DOING  LOCAL REDISTRIBUTION width drank: "<< drank << endl;
00169     Topology_t dtopo;
00170     dtopo.total   = dtotal;
00171 
00172     varray->topo() = (*vdarray)[0]->topo();
00173     varray->gd()   = (*vdarray)[0]->gd();
00174     varray->dist().length(1);
00175     varray->dist()[0].rank  = drank;
00176 
00177     computeReceiveDataBlock1DServer(vdarray, dtopo, varray, comm);
00178 
00179     return true;
00180     break;
00181   }
00182   case PaCO::CommSide:
00183     break;
00184   }
00185   return false;
00186 }
00187 
00191