PaCO++  0.05
Controlled.cc
Go to the documentation of this file.
1 #include "Controlled.h"
2 #include <stdio.h>
3 #include <iostream>
4 
5 #define SRC_TOPOLOGY 1
6 #define DST_TOPOLOGY 2
7 #define ELEMENT_SIZE 4
8 #define LOCAL_SIZE 8
9 
10 #define CORRECT_CONFIG 15
11 
12 #define DEBUG_INTERNAL
13 #define DEBUG_INTERNAL2
14 
18 
20 {
21 #ifdef DEBUG_INTERNAL
22  std::cerr<<"[new] Controlled"<<std::endl;
23 #endif
24 
25  // Common
26  _config = 0;
27 
28  // By default 1->1 :)
29  _sTopo.total=1;
30  _dTopo.total=1;
31  _nodeRank=0;
32 
33  // Client side
34  _clientBuffer=NULL;
36  _maxllen=0;
37  _remaining_cm = NULL;
38  _clientDescr.lens.length(0);
39 
40  // Server side
41  _serverDescr=NULL;
42  _serverBuffer=NULL;
43 
44 #ifdef DEBUG_INTERNAL
45  std::cerr<<"[new] Controlled done"<<std::endl;
46 #endif
47 
48 }
49 
51 {
52 #ifdef DEBUG_INTERNAL
53  std::cerr<<"[del] Controlled"<<std::endl;
54 #endif
55  delete _cm;
56 }
57 
58 
59 void
60 Controlled::_setSourceTopology(unsigned long total)
61 {
63  topo.total = total;
64  setSourceTopology(topo);
65 }
66 
67 void
69 {
70 #ifdef DEBUG_INTERNAL
71  std::cerr << "-- setSourceTopology: " << topo.total << std::endl;
72 #endif
74 
75  if (_sTopo.total != topo.total) {
76  _sTopo = topo;
77  delete _cm;
79 
80  }
81 }
82 
85 {
86  std::cerr << "****** Why is the method " << __FUNCTION__ << "called?\n";
87  abort();
88  return _sTopo;
89 }
90 
91 
92 void
93 Controlled::_setDestTopology(unsigned long total)
94 {
96  topo.total = total;
97  setDestTopology(topo);
98 }
99 
100 void
102 {
103 #ifdef DEBUG_INTERNAL
104  std::cerr << "-- setDestTopology: " << topo.total << std::endl;
105 #endif
107 
108  if (_dTopo.total != topo.total) {
109  _dTopo = topo;
110  delete _cm;
112  }
113 
114 }
115 
118 {
119  std::cerr << "****** Why is the method " << __FUNCTION__ << "called?\n";
120  abort();
121  return _dTopo;
122 }
123 
124 void
126 {
127 #ifdef DEBUG_INTERNAL
128  std::cerr << "-- setNodeRank: " << Rank << std::endl;
129 #endif
130  _nodeRank = Rank;
131 }
132 
133 long
135 {
136  return _nodeRank;
137 }
138 
139 void
140 Controlled::setEltSize(unsigned long size)
141 {
142 #ifdef DEBUG_INTERNAL
143  std::cerr << "-- setEltSize: " << size << std::endl;
144 #endif
146  _unitsize = size;
147 }
148 
149 void
150 Controlled::_setLocalLen(unsigned long elt_nb)
151 {
152 #ifdef DEBUG_INTERNAL
153  std::cerr << "-- setLotalNbElt: " << elt_nb << std::endl;
154 #endif
155  _llen = elt_nb;
156 }
157 
158 void
159 Controlled::setMaxLocalLen(unsigned long elt_nb)
160 {
161 #ifdef DEBUG_INTERNAL
162  std::cerr << "-- setMaxLocalNbElt: " << elt_nb << std::endl;
163 #endif
164  _config |= LOCAL_SIZE;
165  _maxllen = elt_nb;
166 }
167 
168 long
170 {
171  return _maxllen;
172 }
173 
174 void
176 {
177 #ifdef DEBUG_INTERNAL
178  std::cerr << "readFromFile-------------------- done\n";
179 #endif
180 
181  //open comms file
182  FILE *comms_file = fopen(filename, "r");
183  if (comms_file == NULL) {
184  perror("unable to open comms file");
185  throw -1;
186  }
187 
188  unsigned int senders, receivers;
189  fscanf(comms_file, "%dx%d\n", &senders, &receivers);
190 
191  std::cerr<<" #s: "<<senders<<" #r:"<<receivers<<std::endl;
192 
193  _setSourceTopology(senders);
194  _setDestTopology(receivers);
195 
196  unsigned maxs[senders];
197  for(unsigned int i = 0 ; i < senders ; i++)
198  maxs[i]=0;
199 
200  //read edges in file, and add edges
201  for(unsigned int i = 0 ; i < senders * receivers ; i++) {
202  unsigned int value;
203  fscanf(comms_file, "%d", &value);
204  unsigned int node2 = i % receivers;
205  unsigned int node1 = (i - node2) / receivers;
206  if (value != 0) {
207  _cm->set(node1, node2, value);
208 #ifdef DEBUG_INTERNAL
209  std::cerr << " "<<node1<<" -> "<<node2<<" : "<<value<<endl;
210 #endif
211 
212  maxs[node1]+=value;
213  }
214  }
215 
216  fclose(comms_file);
217 
218  unsigned long max=0;
219  for(unsigned int i = 0 ; i < senders ; i++)
220  if (maxs[i]>max)
221  max=maxs[i];
222 
223  if (_maxllen && (max>_maxllen))
224  {
225  std::cerr << "MaxLocalLen was set to small: "<<_maxllen<<" vs "<<max<<" (0: not set)"<<std::endl;
226  abort();
227  }
228 
229  setMaxLocalLen(max);
230 
231  _cm->dump();
232 
233 }
234 
235 PieceToSend*
237 {
238 
239  PieceToSend * sched;
240 
241 #ifdef DEBUG_INTERNAL
242  std::cerr << "computePiecesToSend-------------------- in\n";
243  std::cerr << " config = "<<_config<<endl;
244  std::cerr << " #sender: "<<_cm->getSenderSize()<<std::endl;
245  std::cerr << " #recv: "<<_cm->getReceiverSize()<<std::endl;
246 #endif
247 
248  if (_config != CORRECT_CONFIG) {
249  std::cerr << "Controlled: incorrect configuration state "<< _config<<"/"<<CORRECT_CONFIG<<endl;
250  abort();
251  }
252 
253  sched = new PieceToSend[_cm->getSenderSize()*_cm->getReceiverSize()];
254 
255  unsigned count=0;
256  for(unsigned j=0;j<_cm->getReceiverSize();j++) {
257  if (_cm->get(_nodeRank,j)>0) {
258 #ifdef DEBUG_INTERNAL
259  std::cerr << " "<<_nodeRank<<" -> "<<j<<" : "<<_cm->get(_nodeRank,j)<<std::endl;
260 #endif
261  sched[count].sourceNode = _nodeRank;
262  sched[count].destNode = j;
263  sched[count].size = _cm->get(_nodeRank,j)*_unitsize;
264  sched[count].id = (void*) -1; /* not used */
265  count++;
266  }
267  }
268 
269  size_out = count;
270 
271 #ifdef DEBUG_INTERNAL
272  std::cerr << "computePiecesToSend-------------------- done\n";
273 #endif
274 
275  return sched;
276 }
277 
278 void
280 {
281  _clientBuffer = (char *) dataPtr;
282 #ifdef DEBUG_INTERNAL
283  cerr << "-- _clientBuffer set to "<<dataPtr<<endl;
284 #endif
285 }
286 
287 void *
288 Controlled::getClientData(void *pid, int dnode, long & remaining_size_octet, long & returned_length_element, bool & end)
289 {
290  if (!_remaining_cm)
292 
293  long rgsz = _remaining_cm->get(_nodeRank, dnode)*_unitsize;
294  unsigned rglen;
295 
296  if (rgsz > remaining_size_octet) {
297  rglen = remaining_size_octet/_unitsize;
298  end=false;
299  } else {
300  rglen = _remaining_cm->get(_nodeRank, dnode);
301  end=true;
302  }
303 
304  if (rglen>0) {
305 
306  returned_length_element=rglen;
307  remaining_size_octet-=(returned_length_element*_unitsize);
308  _remaining_cm->sub(_nodeRank, dnode, rglen);
309 
310  unsigned descr_len = _clientDescr.lens.length();
311  _clientDescr.lens.length(descr_len+1);
312  _clientDescr.lens[descr_len]=rglen;
313 
314  unsigned total=0;
315  for(unsigned i=0;i<_cm->getSenderSize();i++) {
316  total+=_cm->get(i, dnode);
317  }
318  _clientDescr.llen = total;
319 
320  }
321 #ifdef DEBUG_INTERNAL
322  std::cerr << __FUNCTION__ << ": getClientData returns #elt: "<<rglen<<endl;
323 #endif
324 
325  // int dummy;
326  // fscanf(stdin, "%d", &dummy);
327 
328 
329  return _clientBuffer;
330 }
331 
332 void
333 Controlled::clientFree() // always called at the end of an invocation (reset some variables)
334 {
335 
336 #ifdef DEBUG_INTERNAL
337  std::cerr << "-- clientFree\n";
338 #endif
339  delete _remaining_cm;
340  _remaining_cm=NULL;
341 }
342 
343 void *
345 {
346 #ifdef DEBUG_INTERNAL
347  std::cerr << "-- descr:llen: "<<_clientDescr.llen<<std::endl;
348 #endif
349 
350  _clientDescr.lens.length(0);
351 
352  return &_clientDescr;
353 }
354 
355 bool
356 Controlled::insertData(void* rcptBuf, unsigned long element_nb)
357 {
358  // cp from recpBuf to _serverBuffer
359 #ifdef DEBUG_INTERNAL
360  std::cerr << "-- insertData:"<<element_nb<<std::endl;
361 #endif
362 
363  unsigned long llen = element_nb*_unitsize;
364  _serverToReceived -= llen;
365 
366  memcpy(_serverBuffer+_serverToReceived, rcptBuf, llen);
367 
368 #ifdef DEBUG_INTERNAL
369  std::cerr << "-- insertData: "<<_serverToReceived<<" octects"<<std::endl;
370 #endif
371 
372 
373  return (_serverToReceived==0);
374 }
375 
376 void *
377 Controlled::getServerData(long & length) // in element !
378 {
379  length= _llen;
380 #ifdef DEBUG_INTERNAL
381  std::cerr << "-- getServerData: ptr : "<<(void*)_serverBuffer<<" #element:"<<length<<std::endl;
382 #endif
383  return (void*) _serverBuffer;
384 }
385 
386 void
387 Controlled::setDescr(void * descr)
388 {
389  std::cerr << "-- setDescr "<<endl;
390 
392 
393  // Descr already received
394 
395  if ( _serverBuffer == NULL)
396  {
397  // 1st time -> allocate memory & init
398  //this->setEltSize(_descr->usz); BUG: usz can be different in client and server (32bit vs 64bit)
399  unsigned long len = _serverDescr->llen*_unitsize;
401 
402 #ifdef DEBUG_INTERNAL
403  fprintf(stderr, "-- setDescr: stopo: %ld\tdtopo: %ld\n",_sTopo.total, _dTopo.total);
404  fprintf(stderr, " setDescr: local len: %ld\n", _serverDescr->llen);
405 #endif
406  _serverBuffer = (char*) malloc(len*_unitsize);
407 #ifdef DEBUG_INTERNAL
408  std::cerr << "-- serverMalloc: "<<(void*)_serverBuffer<<" - "<<_llen<<endl;
409 #endif
410  _serverToReceived = len;
411  }
412 }
413 
414 void
416 {
417 #ifdef DEBUG_INTERNAL
418  std::cerr << "-- serverFree: "<<(void*)_serverBuffer<<endl;
419 #endif
420  free(_serverBuffer);
421  _serverBuffer=NULL; // the orb (or the user) need to free the memory!
422 }
423 
virtual bool insertData(void *rcptBuf, unsigned long element_nb)
Definition: Controlled.cc:356
void _setDestTopology(unsigned long total)
Definition: Controlled.cc:93
virtual void * getDescr()
Definition: Controlled.cc:344
char * _serverBuffer
Definition: Controlled.h:43
CommMatrix * _remaining_cm
Definition: Controlled.h:35
unsigned _nodeRank
Definition: Controlled.h:26
char * _clientBuffer
Definition: Controlled.h:31
virtual PieceToSend * computePiecesToSend(unsigned &size)
Definition: Controlled.cc:236
virtual void clientFree()
Definition: Controlled.cc:333
void setMaxLocalLen(unsigned long elt_nb)
Definition: Controlled.cc:159
virtual ~Controlled()
Definition: Controlled.cc:50
void readFromFile(char *filename)
Definition: Controlled.cc:175
void dump() const
Definition: CommMatrix.cc:43
void sub(unsigned sid, unsigned rid, long val)
Definition: CommMatrix.h:24
PaCO::PacoTopology_t _sTopo
Definition: Controlled.h:23
unsigned getReceiverSize() const
Definition: CommMatrix.h:19
unsigned _llen
Definition: Controlled.h:41
virtual PaCO::PacoTopology_t getSourceTopology()
Definition: Controlled.cc:84
void _setLocalLen(unsigned long elt_nb)
Definition: Controlled.cc:150
unsigned _config
Definition: Controlled.h:21
ControlledLib::ControlledDescr * _serverDescr
Definition: Controlled.h:45
#define SRC_TOPOLOGY
Definition: Controlled.cc:5
long get(unsigned sid, unsigned rid) const
Definition: CommMatrix.h:22
virtual void setNodeRank(long Rank)
Definition: Controlled.cc:125
long getMaxLen()
Definition: Controlled.cc:169
void setEltSize(unsigned long size)
Definition: Controlled.cc:140
#define LOCAL_SIZE
Definition: Controlled.cc:8
virtual void setDestTopology(PaCO::PacoTopology_t topo)
Definition: Controlled.cc:101
virtual void setDescr(void *descr)
Definition: Controlled.cc:387
unsigned long total
Definition: PaCO++.idl:35
virtual void * getServerData(long &length)
Definition: Controlled.cc:377
virtual PaCO::PacoTopology_t getDestTopology()
Definition: Controlled.cc:117
virtual void setDataPtr(void *dataPtr)
Definition: Controlled.cc:279
unsigned getSenderSize() const
Definition: CommMatrix.h:18
void set(unsigned sid, unsigned rid, long val)
Definition: CommMatrix.h:21
CommMatrix * _cm
Definition: Controlled.h:34
unsigned _maxllen
Definition: Controlled.h:37
#define CORRECT_CONFIG
Definition: Controlled.cc:10
virtual long getNodeRank()
Definition: Controlled.cc:134
unsigned long _serverToReceived
Definition: Controlled.h:42
void _setSourceTopology(unsigned long total)
Definition: Controlled.cc:60
unsigned _unitsize
Definition: Controlled.h:27
PaCO::PacoTopology_t _dTopo
Definition: Controlled.h:24
#define DST_TOPOLOGY
Definition: Controlled.cc:6
ControlledLib::ControlledDescr _clientDescr
Definition: Controlled.h:32
#define ELEMENT_SIZE
Definition: Controlled.cc:7
virtual void serverFree()
Definition: Controlled.cc:415
virtual void setSourceTopology(PaCO::PacoTopology_t topo)
Definition: Controlled.cc:68
virtual void * getClientData(void *pid, int server_node, long &size, long &length, bool &end)
Definition: Controlled.cc:288