PaCO++
0.05
|
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