PaCO++  0.05
PC/ClientSide.cc
Go to the documentation of this file.
1 /* Padico Advanced Examples
2  * author: Christian Pérez
3  */
4 
5 #include <stdio.h>
6 
7 #include "Schedule.h"
8 #include "DistributionBloc.h"
9 #include "Internal.h"
10 
11 //#define NO_COM
12 
13 #undef STANDALONE_FILE
14 
15 #undef DEBUG_INTERNAL
16 #undef DEBUG_COMM
17 
18 #ifdef NO_COM
19 inline char* mymalloc(unsigned sz) {
20  static unsigned base=0x1000000;
21  unsigned ret = base;
22  base+=0x1000;
23  return (char*) ret;
24 }
25 #endif
26 
27 #ifdef STANDALONE_FILE
28 int pid;
29 
30 #include "../Generated/Concret.h"
31 #include "../Generated/XServiceType.h"
32 
33 #endif
34 
38 
39 void computeSendDataBlock1DClient(const GlobalData_t& gd, const LocalData_t &sd,
40  const Topology_t &stopo, const Topology_t &dtopo,
41  vAbstrait& vdarray, vector<unsigned>& destid, void* comm)
42 {
43 
44  cerr << "In computeSendDataBlock1DClient...\n";
45 
46  vector<LocalData_t> sched_send;
47  vector<LocalData_t> sched_recv;
48 
49  sched_send.clear();
50  sched_recv.clear();
51 
55  // Compute what to send
57  cerr << "In computeSendDataBlock1DClient...computing what to send\n";
58  computeSendBlock1D(gd, sd, stopo, dtopo, sched_send);
59 
63  // Compute what to receive
65  cerr << "In computeSendDataBlock1DClient...computing what to receive\n";
66 
67  // compute how many dest local data this node has to handle
68  unsigned int nvdarray = dtopo.total/stopo.total;
69  unsigned int remaining = (nvdarray*stopo.total + sd.rank < dtopo.total)?1:0;
70  nvdarray += remaining;
71 
72  // Preparing also CORBA stuff
73  vdarray.clear();
74  vdarray.resize(nvdarray);
75  destid.clear();
76  destid.resize(nvdarray);
77 
78  // so, we simulate node from rank, rank+stopo.total ,... only if nvdarray>0
79  unsigned dbsz = blockSize(gd.len, dtopo.total);
80  // cerr << "DBSZ: " << dbsz << endl;
81  for (unsigned it=0; it<nvdarray; it++) {
82 
83  cerr << "computeSendDataBlock1DClient: it = " << it << endl;
84 
85  Abstrait* out = vdarray[it];
86 
87  out->topo().total = dtopo.total;
88  out->gd().len = gd.len;
89  out->gd().unit_size = gd.unit_size;
90 
91  // add for mode informations
92  out->mode() = PaCO::ClientSide;
93 
94  out->dist().length(1);
95  out->setSeqLength(1);
96 
97  PaCO::PacoLocalData_t& pld = out->dist()[0];
98  LocalData_t dd;
99  pld.rank = dd.rank = sd.rank + it * stopo.total;
100  pld.start = dd.start = dd.rank * dbsz;
101  pld.len = dd.len = localBlockLengthO(gd.len, dd.rank, dtopo.total, dbsz);
102 
103 #ifdef DEBUG_INTERNAL
104  fprintf(stderr, "%d: -- r:%d gl:%d ll:%d start:%d bz:%d dt:%d\n", pid,
105  dd.rank, gd.len, dd.len, dd.start, dbsz, dtopo.total);
106 #endif
107 
108  destid[it] = dd.rank;
109 
112  // Allocating memory
113 #ifdef NO_COM
114  dd.base = (char*) mymalloc(pld.len * gd.unit_size);
115  out->setDataLength(0, pld.len);
116 #else
117 #ifdef DEBUG_INTERNAL
118  cerr << "Allocating a sequence of length " << pld.len << endl;
119 #endif
120  out->setDataLength(0, pld.len);
121  if (pld.len > 0 )
122  dd.base = out->getDataBuffer(0, false);
123  else
124  dd.base = (char*) 1;
125 #endif
126 
127  if (dd.base==0) {
128  cerr << "Cannot allocate memory for #elements" << pld.len << endl;
129  } else {
130 #ifdef DEBUG_INTERNAL
131  fprintf(stderr, "dd.base = %p\n", dd.base);
132 #endif
133  }
134 
135  computeReceiveBlock1D(gd, dd, stopo, dtopo, sched_recv);
136  }
137 
141  // Doing local communication
143  fprintf(stderr, "In computeSendDataBlock1DClient...Doing local communications with ctopo: %ld\n", dtopo.total);
144  doSchedule(gd, sd, stopo, sched_send, sched_recv, comm);
145 
146  cerr << "In computeSendDataBlock1DClient...ok\n";
147 }
148 
152 
153 // simply send data from source i to dest i % dtopo.total
154 // if less sources than destination: dest j < source j % stopo.total
155 
156 // Client Side function
157 void computeSendDataBlock1DServer(const GlobalData_t& gd, const LocalData_t &sd,
158  const Topology_t &stopo, const Topology_t &dtopo,
159  vAbstrait& vdarray, vector<unsigned>& destid)
160 {
161 
162 
163  // Easy: node i send data to node i%dtopo.total
164  // It has to send an empty message to nodes i+stopo.total, i+2*stopo.total ... < dtopo.total
165 
166  // How messages to send ?
167  unsigned int nvdarray = dtopo.total/stopo.total;
168  unsigned int remaining = (nvdarray*stopo.total + sd.rank < dtopo.total)?1:0;
169  nvdarray += remaining;
170 
171  // alwaays something to send
172  if ( nvdarray == 0 ) nvdarray=1;
173 
174  // Preparing CORBA stuff
175  vdarray.clear();
176  vdarray.resize(nvdarray);
177  destid.clear();
178  destid.resize(nvdarray);
179 
180  for (unsigned it=0; it<nvdarray; it++) {
181 
182  Abstrait* out = vdarray[it];
183 
184  out->topo().total = stopo.total;
185  out->gd().len = gd.len;
186  out->gd().unit_size = gd.unit_size;
187 
188  // add for mode information
189  out->mode() = PaCO::ServerSide;
190 
191  if ( it == 0 ) { // always data to send
192  out->dist().length(1);
193  out->setSeqLength(1);
194 
195  out->dist()[0].rank = sd.rank;
196  out->dist()[0].start = sd.start;
197  out->dist()[0].len = sd.len;
198  out->DataReplace(0, sd.len, sd.base, false);
199  } else { // always nothing to send
200  out->dist().length(0);
201  out->setSeqLength(0);
202  }
203  destid[it] = ( sd.rank + it * stopo.total ) % dtopo.total;
204  }
205 }
206 
209 
211 }
212 
215 
216 // vOut represents what localData/stopo have to send to nodes of dtopo (vOut[].rank is in dtopo space)
217 void computeSendDataBlock1D(const GlobalData_t& gd, const LocalData_t &sd,
218  const Topology_t &stopo, const Topology_t &dtopo,
219  vAbstrait& vdarray, vector<unsigned>& destid,
220  const PaCO::distLoc_t& mode, void* comm) {
221 
222  switch(mode) {
223  case PaCO::none: cerr << "INTERNAL ERROR: " << __FILE__ << " " << __FUNCTION__ << endl;
224  case PaCO::ClientSide: computeSendDataBlock1DClient(gd, sd, stopo, dtopo, vdarray, destid, comm); break;
225  case PaCO::ServerSide: computeSendDataBlock1DServer(gd, sd, stopo, dtopo, vdarray, destid); break;
227  }
228 
229 }
230 
vector< BasicBC > sd
Definition: debug.cc:14
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 computeSendBlock1D(const GlobalData_t &gd, const LocalData_t &sd, const Topology_t &stopo, const Topology_t &dtopo, const ParisBlock_param_t *param, vector< LocalData_t > &vOut)
Definition: Schedule.cc:38
void computeSendDataBlock1DServer(const GlobalData_t &gd, const LocalData_t &sd, const Topology_t &stopo, const Topology_t &dtopo, vAbstrait &vdarray, vector< unsigned > &destid)
distLoc_t
Definition: PaCO++.idl:12
void computeSendDataBlock1DComm()
unsigned long start
Definition: PaCO++.idl:27
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 doSchedule(const GlobalData_t &gd, const LocalData_t &ld, const Topology_t &ctopo, vector< LocalData_t > &sched_send, vector< LocalData_t > &sched_recv, void *comm)
Definition: Schedule.cc:227
unsigned long rank
Definition: PaCO++.idl:26
static unsigned blockSize(const unsigned glen, const unsigned nbprocs, const ParisBlock_param_t *param)
vector< BasicBC > dd
Definition: debug.cc:15
static unsigned localBlockLengthO(unsigned glen, unsigned rank, unsigned total, unsigned bsz)
void computeReceiveBlock1D(const GlobalData_t &gd, const LocalData_t &dd, const Topology_t &stopo, const Topology_t &dtopo, const ParisBlock_param_t *param, vector< LocalData_t > &vOut)
Definition: Schedule.cc:135
unsigned long len
Definition: PaCO++.idl:28