PaCO++  0.05
PC/Schedule.h File Reference
#include <vector>
#include <Abstrait.h>
Include dependency graph for PC/Schedule.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

void computeReceiveBlock1D (const GlobalData_t &gd, const LocalData_t &dd, const Topology_t &stopo, const Topology_t &dtopo, vector< LocalData_t > &vOut)
 
bool computeReceiveDataBlock1D (vAbstrait *sdata, const PaCO::distLoc_t &mode, const unsigned total, const unsigned rank, Abstrait *varray, void *comm)
 
void computeSendBlock1D (const GlobalData_t &gd, const LocalData_t &sd, const Topology_t &stopo, const Topology_t &dtopo, vector< LocalData_t > &vOut)
 
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 computeSendRemoteDataBlock1D (const GlobalData_t &gd, const LocalData_t &sd, const Topology_t &stopo, const Topology_t &dtopo, vector< LocalData_t > &vOut, const PaCO::distLoc_t mode)
 
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)
 
unsigned nbofPart (const PaCO::distLoc_t &mode, const unsigned stotal, const unsigned dtotal, const unsigned drank)
 
unsigned posofPart (const PaCO::distLoc_t &mode, const unsigned dtotal, const unsigned srank)
 

Function Documentation

◆ computeReceiveBlock1D()

void computeReceiveBlock1D ( const GlobalData_t &  gd,
const LocalData_t &  dd,
const Topology_t &  stopo,
const Topology_t &  dtopo,
vector< LocalData_t > &  vOut 
)

Definition at line 105 of file PC/Schedule.cc.

References blockSize(), getProcRangeInf(), and getProcRangeSup().

107  {
108 
109 #ifdef DEBUG_INTERNAL
110  cerr << "\nIn compute Receive Schedule--------------------\n";
111 
112  fprintf(stderr, "stopo: %ld\tdtopo: %ld\n",stopo.total, dtopo.total);
113  fprintf(stderr, "gd.len %ld\tdd.start %d\tdd.len %d\n", gd.len, dd.start, dd.len);
114 
115 #endif
116 
117  if (stopo.total == dtopo.total) {
118  vOut.push_back(dd);
119 #ifdef DEBUG_INTERNAL
120  fprintf(stderr, " rank:%d start:%d len:%d base:%p\n", dd.rank, dd.start, dd.len, dd.base);
121 #endif
122  } else {
123  // Apend mode
124  vOut.reserve(vOut.size()+stopo.total); // in bloc mode, at most one msg from each src node
125 
126  unsigned sbsz = blockSize(gd.len, stopo.total);
127 
128  unsigned long dlow = dd.start;
129  unsigned long dhigh = dlow + dd.len;
130 
131  unsigned fpid, lpid;
132  fpid = getProcRangeInf(dlow, sbsz);
133  lpid = getProcRangeSup(dhigh, sbsz);
134 
135 #ifdef DEBUG_INTERNAL
136  fprintf(stderr, " loop from %d to %d width stotal: %ld\n", fpid, lpid, stopo.total);
137 #endif
138 
139  // for each dest bloc
140  for(unsigned i=fpid; i <= lpid; i++) {
141 
142  vOut.resize(vOut.size()+1);
143  LocalData_t& s = vOut[vOut.size()-1];
144 
145  s.rank = i;
146  unsigned tmp = i*sbsz;
147  s.start = ( dlow >= tmp)?dlow:tmp; // max
148 
149  tmp = (i+1)*sbsz;
150  unsigned end = ( dhigh <= tmp)?dhigh:tmp; // min
151 
152  s.len = end - s.start;
153 
154  s.base = dd.base + ((s.start - dd.start) * gd.unit_size);
155 
156 #ifdef DEBUG_INTERNAL
157  fprintf(stderr, " r: from:%d start:%d len:%d base:%p\n", s.rank, s.start, s.len, s.base);
158 #endif
159  }
160  }
161 }
static unsigned getProcRangeInf(unsigned low, unsigned bsz)
Definition: BasicBC.cc:23
static unsigned blockSize(const unsigned glen, const unsigned nbprocs, const ParisBlock_param_t *param)
vector< BasicBC > dd
Definition: debug.cc:15
static unsigned getProcRangeSup(unsigned high, unsigned bsz)
Definition: BasicBC.cc:28
Here is the call graph for this function:

◆ computeReceiveDataBlock1D()

bool computeReceiveDataBlock1D ( vAbstrait *  sdata,
const PaCO::distLoc_t mode,
const unsigned  total,
const unsigned  rank,
Abstrait *  varray,
void *  comm 
)

Definition at line 135 of file PC/ServerSide.cc.

References PaCO::ClientSide, PaCO::CommSide, computeReceiveDataBlock1DServer(), PaCO::none, and PaCO::ServerSide.

137  {
138 
139  cerr << "In computeReceiveDataBlock1D...\n";
140 
141  switch(mode) {
142  case PaCO::none:
143  cerr << "INTERNAL ERROR: " << __FILE__ << " " << __FUNCTION__ << endl;
144  break;
145  case PaCO::ClientSide:
146  cerr << "Client Side case" <<endl;
147  varray->CopyAndGetSequenceOwner((*vdarray)[0]);
148  cerr << "Return true" << endl;
149  return true;
150  break;
151 
152  case PaCO::ServerSide: {
153  // data has been sent from source i to dest i % dtopo.total
154  // so dest j has : j, j + dtopo.total, j+2*dtopo.total
155  // so it may be 1 (at least activation) or more
156  cerr << " vdaray size: " << vdarray->size() << endl;
157 
158 // unsigned stotal = (*vdarray)[0]->topo().total;
159 // unsigned int nvdarray = stotal/dtotal;
160 // unsigned int remaining = (nvdarray*dtotal + drank < stotal)?1:0;
161 // nvdarray += remaining;
162 // if ( nvdarray == 0 ) nvdarray=1; // alway at least one
163 
164 // fprintf(stderr, "computeReceiveDataBlock1D: Node %d : got %d of %d data\n", drank, vdarray->size(), nvdarray);
165 
166 // if (vdarray->size() == nvdarray) {
167 
168  cerr << "DOING LOCAL REDISTRIBUTION width drank: "<< drank << endl;
169  Topology_t dtopo;
170  dtopo.total = dtotal;
171 
172  varray->topo() = (*vdarray)[0]->topo();
173  varray->gd() = (*vdarray)[0]->gd();
174  varray->dist().length(1);
175  varray->dist()[0].rank = drank;
176 
177  computeReceiveDataBlock1DServer(vdarray, dtopo, varray, comm);
178 
179  return true;
180  break;
181  }
182  case PaCO::CommSide:
183  break;
184  }
185  return false;
186 }
void computeReceiveDataBlock1DServer(vAbstrait *vdarray, const Topology_t &dtopo, Abstrait *varray, void *comm)
varray must contain the rank of the caller
Here is the call graph for this function:

◆ computeSendBlock1D()

void computeSendBlock1D ( const GlobalData_t &  gd,
const LocalData_t &  sd,
const Topology_t &  stopo,
const Topology_t &  dtopo,
vector< LocalData_t > &  vOut 
)

Definition at line 39 of file PC/Schedule.cc.

References blockSize(), getProcRangeInf(), and getProcRangeSup().

41  {
42 
43 #ifdef DEBUG_INTERNAL
44  cerr << "\nIn compute Send Schedule--------------------\n";
45 
46  fprintf(stderr, "stopo: %ld\tdtopo: %ld\n",stopo.total, dtopo.total);
47  fprintf(stderr, "gd.len %ld\tsd.start %d\tsd.len %d\n",gd.len, sd.start, sd.len);
48 #endif
49 
50  if (stopo.total == dtopo.total) {
51  // vOut.reserve(vOut.size()+dtopo.total); // in bloc mode, at most one msg to each dest node
52  vOut.push_back(sd);
53 #ifdef DEBUG_INTERNAL
54  fprintf(stderr, " rank:%d start:%d len:%d base:%p\n", sd.rank, sd.start, sd.len, sd.base);
55 #endif
56  } else {
57  // Append mode
58  vOut.reserve(vOut.size()+dtopo.total); // in bloc mode, at most one msg to each dest node
59 
60  unsigned dbsz = blockSize(gd.len, dtopo.total);
61 
62  unsigned long slow = sd.start;
63  unsigned long shigh = slow + sd.len;
64 
65  unsigned fpid, lpid;
66  fpid = getProcRangeInf(slow, dbsz);
67  lpid = getProcRangeSup(shigh, dbsz);
68 
69 #ifdef DEBUG_INTERNAL
70  fprintf(stderr, " loop from %d to %d width dtotal: %ld\n", fpid, lpid, dtopo.total);
71 #endif
72 
73  // for each dest bloc
74  for(unsigned i=fpid; i <= lpid; i++) {
75 
76  vOut.resize(vOut.size()+1);
77  LocalData_t& s = vOut[vOut.size()-1];
78 
79  s.rank = i;
80  unsigned tmp = i*dbsz;
81  s.start = ( slow >= tmp)?slow:tmp; // max
82 
83  tmp = (i+1)*dbsz;
84  unsigned end = ( shigh <= tmp)?shigh:tmp; // min
85 
86  s.len = end - s.start;
87 
88  s.base = sd.base + ((s.start - sd.start) * gd.unit_size);
89 
90 #ifdef DEBUG_INTERNAL
91  fprintf(stderr, " s: to:%d start:%d len:%d base:%p\n", s.rank, s.start, s.len, s.base);
92 #endif
93  }
94  }
95 #ifdef DEBUG_INTERNAL
96  cerr << "\nIn compute Send Schedule-------------------- done\n";
97 #endif
98 }
vector< BasicBC > sd
Definition: debug.cc:14
static unsigned getProcRangeInf(unsigned low, unsigned bsz)
Definition: BasicBC.cc:23
static unsigned blockSize(const unsigned glen, const unsigned nbprocs, const ParisBlock_param_t *param)
static unsigned getProcRangeSup(unsigned high, unsigned bsz)
Definition: BasicBC.cc:28
Here is the call graph for this function:

◆ computeSendDataBlock1D()

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 
)

Definition at line 217 of file PC/ClientSide.cc.

References PaCO::ClientSide, PaCO::CommSide, computeSendDataBlock1DClient(), computeSendDataBlock1DComm(), computeSendDataBlock1DServer(), PaCO::none, and PaCO::ServerSide.

220  {
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 }
vector< BasicBC > sd
Definition: debug.cc:14
void computeSendDataBlock1DServer(const GlobalData_t &gd, const LocalData_t &sd, const Topology_t &stopo, const Topology_t &dtopo, vAbstrait &vdarray, vector< unsigned > &destid)
void computeSendDataBlock1DComm()
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)
Here is the call graph for this function:

◆ computeSendRemoteDataBlock1D()

void computeSendRemoteDataBlock1D ( const GlobalData_t &  gd,
const LocalData_t &  sd,
const Topology_t &  stopo,
const Topology_t &  dtopo,
vector< LocalData_t > &  vOut,
const PaCO::distLoc_t  mode 
)

◆ doSchedule()

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 at line 227 of file Schedule.cc.

References blockSize(), PaCO::ClientSide, cmp_rank(), computeBlockBoundInf0(), computeSendDataBlock1D(), getProcId(), localBlockLengthO(), main(), and sd.

Referenced by computeReceiveDataBlock1DServer(), and computeSendDataBlock1DClient().

228  {
229 
230 #ifdef DEBUG_INTERNAL
231  cerr << "\nIn doSchedule--------------------\n";
232 #endif
233 
234  MPI_Comm mpi_comm = *(MPI_Comm*) comm;
235 
236 #ifdef DEBUG_COMM
237  fprintf(stderr," MPI_COMM_WORLD=%d mpi_comm=%d\n", MPI_COMM_WORLD, mpi_comm);
238 #endif
239 
240  if (sched_send.size() || sched_recv.size()) {
241 
242  MPI_Request sreq[sched_send.size()];
243  MPI_Request rreq[sched_recv.size()];
244  unsigned si, ri;
245  si=0;
246  ri=0;
247 
248  MPI_Status sstat[sched_send.size()];
249  MPI_Status rstat[sched_recv.size()];
250 
251  vector<LocalData_t*> local_recv;
252  vector<LocalData_t*> local_send;
253 
254  local_recv.clear();
255  local_send.clear();
256 
258  // Sorting data
259 
260  if (sched_send.size()) std::stable_sort(sched_send.begin(), sched_send.end(), cmp_rank);
261  if (sched_recv.size()) std::stable_sort(sched_recv.begin(), sched_recv.end(), cmp_rank);
262 
264  // Sending data
265 
266  // Post Asynchronous MPI receive
267 #ifdef DEBUG_COM
268  cerr << " #sched_recv: " << sched_recv.size() << endl;
269 #endif
270  for(unsigned i=0; i < sched_recv.size(); i++) {
271  unsigned from = getProcId(sched_recv[i].rank, ctopo);
272  if (from == ld.rank) {
273 #ifdef DEBUG_COMM
274  fprintf(stderr, " recv: schedr no=%d start=%d len=%d from=%d LOCAL\n", i,
275  sched_recv[i].start, sched_recv[i].len, from);
276 #endif
277  local_recv.push_back(&sched_recv[i]);
278  } else {
279 #ifdef DEBUG_COMM
280  fprintf(stderr, " recv: schedr no=%d start=%d len=%d from=%d base=%p\n", i,
281  sched_recv[i].start, sched_recv[i].len, from, sched_recv[i].base);
282 #endif
283 
284  int err = MPI_Irecv(sched_recv[i].base, sched_recv[i].len*gd.unit_size,
285  MPI_BYTE, from, 51, mpi_comm, &rreq[ri++]);
286  if (err!= MPI_SUCCESS) {
287  cerr << "EROR IN MPI_Irecv: return value is "<<err<<endl;
288  }
289  }
290  }
291 
292  // Send data via MPI
293 #ifdef DEBUG_COMM
294  cerr << " #sched_send: " << sched_send.size() << endl;
295 #endif
296  for(unsigned i=0; i < sched_send.size(); i++) {
297  unsigned to = getProcId(sched_send[i].rank, ctopo);
298  if (to == ld.rank) {
299 #ifdef DEBUG_COMM
300  fprintf(stderr, " send: scheds no=%d start=%d len=%d to=%d LOCAL\n", i,
301  sched_send[i].start, sched_send[i].len, to);
302 #endif
303  local_send.push_back(&sched_send[i]);
304  } else {
305 #ifdef DEBUG_COMM
306  fprintf(stderr, " send: scheds no=%d start=%d len=%d to=%d base=%p\n", i,
307  sched_send[i].start, sched_send[i].len, to, sched_send[i].base);
308 #endif
309 
310  int err = MPI_Isend(sched_send[i].base, sched_send[i].len*gd.unit_size,
311  MPI_BYTE, to, 51, mpi_comm, &sreq[si++]);
312  if (err!= MPI_SUCCESS) {
313  cerr << "EROR IN MPI_Isend: return value is "<<err<<endl;
314  }
315  }
316  }
317 
318  // Do local communication vie memcpy
319  if (local_recv.size() != local_send.size()) {
320  cerr << "Error: local recv & send have different size: " << local_recv.size() << " " << local_send.size() << endl;
321  }
322  for(unsigned i=0; i < local_recv.size(); i++) {
323  if (local_recv[i]->len != local_send[i]->len) {
324  cerr << "Error: local recv & send have different len for i= "<<i<< " :" << local_recv[i]->len << " " << local_send[i]->len << endl;
325  }
326 #ifdef DEBUG_COMM
327  fprintf(stderr, " local: scheds no=%d start=%d len=%d\n", i,
328  sched_send[i].start, sched_send[i].len);
329 #endif
330  memcpy(local_recv[i]->base, local_send[i]->base, local_send[i]->len*gd.unit_size);
331  }
332 
333 
334  // Wait all receive & send
335 #ifdef DEBUG_INTERNAL
336  cerr << "WAITING local communications to end...\n";
337 #endif
338 
339  int err;
340  err = MPI_Waitall(si, sreq, sstat);
341  if (err!= MPI_SUCCESS) {
342  cerr << "EROR IN MPI_WaitAll for send: return value is "<<err<<endl;
343  }
344  err = MPI_Waitall(ri, rreq, rstat);
345  if (err!= MPI_SUCCESS) {
346  cerr << "EROR IN MPI_WaitAll for recv: return value is "<<err<<endl;
347  }
348 #ifdef DEBUG_INTERNAL
349  cerr << "WAITING local communications to end...ok \n";
350 #endif
351  }
352 }
static unsigned getProcId(unsigned rank, Topology_t topo)
Definition: Internal.h:11
bool cmp_rank(const LocalData_t &a, const LocalData_t &b)
Definition: Schedule.cc:27
Here is the call graph for this function:

◆ nbofPart()

unsigned nbofPart ( const PaCO::distLoc_t mode,
const unsigned  stotal,
const unsigned  dtotal,
const unsigned  drank 
)

Definition at line 120 of file ServerSide.cc.

References PaCO::ClientSide, PaCO::CommSide, PaCO::none, and PaCO::ServerSide.

120  {
121  switch(mode) {
122  case PaCO::none: cerr << "INTERNAL ERROR: " << __FILE__ << " " << __FUNCTION__ << endl; return 0;
123  case PaCO::ClientSide: return 1;
124  case PaCO::ServerSide:
125  {
126  unsigned int nvdarray = stotal/dtotal;
127  unsigned int remaining = (nvdarray*dtotal + drank < stotal)?1:0;
128  nvdarray += remaining;
129  if ( nvdarray == 0 ) return 1; // alway at least one
130  return nvdarray;
131  }
132  case PaCO::CommSide: cerr << "INTERNAL ERROR: not yet implemented in " << __FILE__ << " " << __FUNCTION__ << endl; return 0;
133  }
134  return 0;
135 }

◆ posofPart()

unsigned posofPart ( const PaCO::distLoc_t mode,
const unsigned  dtotal,
const unsigned  srank 
)

Definition at line 138 of file ServerSide.cc.

References PaCO::ClientSide, PaCO::CommSide, PaCO::none, and PaCO::ServerSide.

138  {
139  switch(mode) {
140  case PaCO::none: cerr << "INTERNAL ERROR: " << __FILE__ << " " << __FUNCTION__ << endl; return 0;
141  case PaCO::ClientSide: return 0;
142  case PaCO::ServerSide: return srank / dtotal;
143  case PaCO::CommSide: cerr << "INTERNAL ERROR: not yet implemented in " << __FILE__ << " " << __FUNCTION__ << endl; return 0;
144  }
145  return 0;
146 }