PaCO++  0.05
Controlled.cc
Go to the documentation of this file.
00001 #include "Controlled.h"
00002 #include <stdio.h>
00003 #include <iostream>
00004 
00005 #define SRC_TOPOLOGY 1
00006 #define DST_TOPOLOGY 2
00007 #define ELEMENT_SIZE 4
00008 #define LOCAL_SIZE   8
00009 
00010 #define CORRECT_CONFIG 15
00011 
00012 #define DEBUG_INTERNAL
00013 #define DEBUG_INTERNAL2
00014 
00018 
00019 Controlled::Controlled()
00020 {
00021 #ifdef DEBUG_INTERNAL
00022   std::cerr<<"[new] Controlled"<<std::endl;
00023 #endif  
00024 
00025   // Common
00026   _config = 0;
00027 
00028   // By default 1->1 :)
00029   _sTopo.total=1;
00030   _dTopo.total=1;
00031   _nodeRank=0;
00032   
00033   // Client side
00034   _clientBuffer=NULL;
00035   _cm = new CommMatrix(_sTopo.total,_dTopo.total);
00036   _maxllen=0;
00037   _remaining_cm = NULL;
00038   _clientDescr.lens.length(0);
00039 
00040   // Server side
00041   _serverDescr=NULL;
00042   _serverBuffer=NULL;
00043 
00044 #ifdef DEBUG_INTERNAL
00045   std::cerr<<"[new] Controlled done"<<std::endl;
00046 #endif  
00047 
00048 }
00049 
00050 Controlled::~Controlled() 
00051 {
00052 #ifdef DEBUG_INTERNAL
00053   std::cerr<<"[del] Controlled"<<std::endl;
00054 #endif  
00055   delete _cm;
00056 }
00057 
00058 
00059 void
00060 Controlled::_setSourceTopology(unsigned long total)
00061 {
00062   PaCO::PacoTopology_t topo;
00063   topo.total = total;
00064   setSourceTopology(topo);
00065 }
00066 
00067 void
00068 Controlled::setSourceTopology(PaCO::PacoTopology_t topo)
00069 {
00070 #ifdef DEBUG_INTERNAL
00071   std::cerr << "-- setSourceTopology: " << topo.total << std::endl;
00072 #endif
00073   _config |= SRC_TOPOLOGY;
00074 
00075   if (_sTopo.total != topo.total) {
00076     _sTopo = topo;
00077     delete _cm;
00078     _cm = new CommMatrix(_sTopo.total,_dTopo.total);
00079 
00080   }
00081 }
00082 
00083 PaCO::PacoTopology_t
00084 Controlled::getSourceTopology()
00085 {
00086   std::cerr << "****** Why is the method " << __FUNCTION__ << "called?\n";
00087   abort();
00088   return _sTopo;
00089 }
00090 
00091 
00092 void
00093 Controlled::_setDestTopology(unsigned long total)
00094 {
00095   PaCO::PacoTopology_t topo;
00096   topo.total = total;
00097   setDestTopology(topo);
00098 }
00099 
00100 void
00101 Controlled::setDestTopology(PaCO::PacoTopology_t topo)
00102 {
00103 #ifdef DEBUG_INTERNAL
00104   std::cerr << "-- setDestTopology: " << topo.total << std::endl;
00105 #endif
00106   _config |= DST_TOPOLOGY;
00107 
00108   if (_dTopo.total != topo.total) {
00109     _dTopo = topo;
00110     delete _cm;
00111     _cm = new CommMatrix(_sTopo.total,_dTopo.total);
00112   }
00113 
00114 }
00115 
00116 PaCO::PacoTopology_t
00117 Controlled::getDestTopology()
00118 {
00119   std::cerr << "****** Why is the method " << __FUNCTION__ << "called?\n";
00120   abort();
00121   return _dTopo;
00122 }
00123 
00124 void
00125 Controlled::setNodeRank(long Rank)
00126 {
00127 #ifdef DEBUG_INTERNAL
00128   std::cerr << "-- setNodeRank: " << Rank << std::endl;
00129 #endif
00130   _nodeRank = Rank;
00131 }
00132 
00133 long
00134 Controlled::getNodeRank()
00135 {
00136   return _nodeRank;
00137 }
00138 
00139 void
00140 Controlled::setEltSize(unsigned long size)
00141 {
00142 #ifdef DEBUG_INTERNAL
00143   std::cerr << "-- setEltSize: " << size << std::endl;
00144 #endif
00145   _config |= ELEMENT_SIZE;
00146   _unitsize = size;
00147 }
00148 
00149 void
00150 Controlled::_setLocalLen(unsigned long elt_nb)
00151 {
00152 #ifdef DEBUG_INTERNAL
00153   std::cerr << "-- setLotalNbElt: " << elt_nb << std::endl;
00154 #endif
00155   _llen = elt_nb;
00156 }
00157 
00158 void
00159 Controlled::setMaxLocalLen(unsigned long elt_nb)
00160 {
00161 #ifdef DEBUG_INTERNAL
00162   std::cerr << "-- setMaxLocalNbElt: " << elt_nb << std::endl;
00163 #endif
00164   _config |= LOCAL_SIZE;
00165   _maxllen = elt_nb;
00166 }
00167 
00168 long
00169 Controlled::getMaxLen()
00170 {
00171   return _maxllen;
00172 }
00173 
00174 void
00175 Controlled::readFromFile(char *filename)
00176 {
00177 #ifdef DEBUG_INTERNAL
00178   std::cerr << "readFromFile-------------------- done\n";
00179 #endif
00180 
00181   //open comms file
00182   FILE *comms_file = fopen(filename, "r");
00183   if (comms_file == NULL) {
00184     perror("unable to open comms file");
00185     throw -1;
00186   }
00187 
00188   unsigned int senders, receivers;
00189   fscanf(comms_file, "%dx%d\n", &senders, &receivers);
00190 
00191   std::cerr<<" #s: "<<senders<<"  #r:"<<receivers<<std::endl;
00192 
00193   _setSourceTopology(senders);
00194   _setDestTopology(receivers);
00195    
00196   unsigned maxs[senders];
00197   for(unsigned int i = 0 ; i < senders ; i++)
00198     maxs[i]=0;
00199 
00200   //read edges in file, and add edges
00201   for(unsigned int i = 0 ; i < senders * receivers ; i++) {
00202     unsigned int value;
00203     fscanf(comms_file, "%d", &value); 
00204     unsigned int node2 = i % receivers;
00205     unsigned int node1 = (i - node2) / receivers;
00206     if (value != 0) {
00207       _cm->set(node1, node2, value);
00208 #ifdef DEBUG_INTERNAL
00209       std::cerr << " "<<node1<<" -> "<<node2<<" : "<<value<<endl;
00210 #endif
00211 
00212       maxs[node1]+=value;
00213     }
00214   }  
00215     
00216   fclose(comms_file);
00217   
00218   unsigned long max=0;
00219   for(unsigned int i = 0 ; i < senders ; i++)
00220     if (maxs[i]>max)
00221       max=maxs[i];
00222 
00223   if (_maxllen && (max>_maxllen))
00224     {
00225       std::cerr << "MaxLocalLen was set to small: "<<_maxllen<<" vs "<<max<<" (0: not set)"<<std::endl;
00226       abort();
00227     }
00228 
00229   setMaxLocalLen(max);
00230 
00231   _cm->dump();
00232 
00233 }  
00234 
00235 PieceToSend* 
00236 Controlled::computePiecesToSend(unsigned& size_out)
00237 {
00238 
00239   PieceToSend * sched;
00240 
00241 #ifdef DEBUG_INTERNAL
00242   std::cerr << "computePiecesToSend-------------------- in\n";
00243   std::cerr << " config = "<<_config<<endl;
00244   std::cerr << " #sender: "<<_cm->getSenderSize()<<std::endl;
00245   std::cerr << " #recv: "<<_cm->getReceiverSize()<<std::endl;  
00246 #endif
00247 
00248   if (_config != CORRECT_CONFIG) {
00249     std::cerr << "Controlled: incorrect configuration state "<< _config<<"/"<<CORRECT_CONFIG<<endl;
00250     abort();
00251   }
00252 
00253   sched = new PieceToSend[_cm->getSenderSize()*_cm->getReceiverSize()];
00254 
00255   unsigned count=0;
00256   for(unsigned j=0;j<_cm->getReceiverSize();j++) {  
00257     if (_cm->get(_nodeRank,j)>0) {
00258 #ifdef DEBUG_INTERNAL
00259       std::cerr << " "<<_nodeRank<<" -> "<<j<<" : "<<_cm->get(_nodeRank,j)<<std::endl;
00260 #endif
00261       sched[count].sourceNode = _nodeRank; 
00262       sched[count].destNode   = j;
00263       sched[count].size       = _cm->get(_nodeRank,j)*_unitsize;
00264       sched[count].id         = (void*) -1; /* not used */
00265       count++;
00266     }
00267   }
00268   
00269   size_out = count;
00270   
00271 #ifdef DEBUG_INTERNAL
00272   std::cerr << "computePiecesToSend-------------------- done\n";
00273 #endif
00274 
00275   return sched;
00276 }
00277 
00278 void
00279 Controlled::setDataPtr(void* dataPtr)
00280 {
00281   _clientBuffer = (char *) dataPtr;
00282 #ifdef DEBUG_INTERNAL
00283   cerr << "-- _clientBuffer set to "<<dataPtr<<endl;
00284 #endif
00285 }
00286 
00287 void *
00288 Controlled::getClientData(void *pid, int dnode, long & remaining_size_octet, long & returned_length_element, bool & end)  
00289 {
00290   if (!_remaining_cm)
00291     _remaining_cm = new CommMatrix(_cm);
00292 
00293   long rgsz = _remaining_cm->get(_nodeRank, dnode)*_unitsize;
00294   unsigned rglen;
00295 
00296   if (rgsz > remaining_size_octet) {
00297     rglen = remaining_size_octet/_unitsize;
00298     end=false;
00299   } else {
00300     rglen = _remaining_cm->get(_nodeRank, dnode);
00301     end=true;
00302   }    
00303 
00304   if (rglen>0) {
00305 
00306     returned_length_element=rglen;
00307     remaining_size_octet-=(returned_length_element*_unitsize);
00308     _remaining_cm->sub(_nodeRank, dnode, rglen);
00309   
00310     unsigned descr_len  = _clientDescr.lens.length();
00311     _clientDescr.lens.length(descr_len+1);
00312     _clientDescr.lens[descr_len]=rglen;
00313 
00314     unsigned total=0;
00315     for(unsigned i=0;i<_cm->getSenderSize();i++) {
00316       total+=_cm->get(i, dnode);
00317     }
00318     _clientDescr.llen = total;
00319 
00320   }
00321 #ifdef DEBUG_INTERNAL
00322   std::cerr << __FUNCTION__ << ": getClientData returns #elt: "<<rglen<<endl;
00323 #endif
00324 
00325   //  int dummy;
00326   //  fscanf(stdin, "%d", &dummy);  
00327 
00328 
00329   return _clientBuffer;
00330 }
00331 
00332 void
00333 Controlled::clientFree() // always called at the end of an invocation (reset some variables)
00334 {
00335 
00336 #ifdef DEBUG_INTERNAL
00337   std::cerr << "-- clientFree\n";
00338 #endif
00339   delete _remaining_cm;
00340   _remaining_cm=NULL;
00341 }
00342 
00343 void *
00344 Controlled::getDescr()
00345 {
00346 #ifdef DEBUG_INTERNAL
00347   std::cerr << "-- descr:llen: "<<_clientDescr.llen<<std::endl;
00348 #endif
00349 
00350   _clientDescr.lens.length(0);
00351 
00352   return &_clientDescr;
00353 }
00354 
00355 bool
00356 Controlled::insertData(void* rcptBuf, unsigned long element_nb)
00357 {
00358   // cp from recpBuf to _serverBuffer
00359 #ifdef DEBUG_INTERNAL
00360   std::cerr << "-- insertData:"<<element_nb<<std::endl;
00361 #endif
00362   
00363   unsigned long llen = element_nb*_unitsize;
00364   _serverToReceived -= llen;
00365 
00366   memcpy(_serverBuffer+_serverToReceived, rcptBuf, llen);
00367 
00368 #ifdef DEBUG_INTERNAL
00369   std::cerr << "-- insertData: "<<_serverToReceived<<" octects"<<std::endl;
00370 #endif
00371   
00372 
00373   return (_serverToReceived==0);
00374 }
00375 
00376 void *
00377 Controlled::getServerData(long & length) // in element !
00378 {
00379   length= _llen;
00380 #ifdef DEBUG_INTERNAL
00381   std::cerr << "-- getServerData: ptr : "<<(void*)_serverBuffer<<" #element:"<<length<<std::endl;
00382 #endif  
00383   return (void*) _serverBuffer;
00384 }
00385 
00386 void
00387 Controlled::setDescr(void * descr)
00388 {
00389   std::cerr << "-- setDescr "<<endl;
00390 
00391   _serverDescr = (ControlledLib::ControlledDescr*) descr;
00392 
00393   // Descr already received
00394 
00395   if ( _serverBuffer == NULL)
00396     {
00397       // 1st time -> allocate memory & init
00398       //this->setEltSize(_descr->usz); BUG: usz can be different in client and server (32bit vs 64bit)
00399       unsigned long len = _serverDescr->llen*_unitsize;
00400       this->_setLocalLen(_serverDescr->llen);
00401       
00402 #ifdef DEBUG_INTERNAL
00403       fprintf(stderr, "-- setDescr: stopo: %ld\tdtopo: %ld\n",_sTopo.total, _dTopo.total);
00404       fprintf(stderr, "   setDescr: local len: %ld\n", _serverDescr->llen);
00405 #endif  
00406       _serverBuffer = (char*) malloc(len*_unitsize);
00407 #ifdef DEBUG_INTERNAL
00408       std::cerr << "-- serverMalloc: "<<(void*)_serverBuffer<<" - "<<_llen<<endl;
00409 #endif
00410       _serverToReceived = len;
00411     }
00412 }
00413 
00414 void
00415 Controlled::serverFree() 
00416 { 
00417 #ifdef DEBUG_INTERNAL
00418   std::cerr << "-- serverFree: "<<(void*)_serverBuffer<<endl;
00419 #endif
00420   free(_serverBuffer);
00421   _serverBuffer=NULL; // the orb (or the user) need to free the memory!
00422 }
00423