PaCO++  0.05
PC/ClientSide.cc File Reference
#include <stdio.h>
#include "Schedule.h"
#include "DistributionBloc.h"
#include "Internal.h"
Include dependency graph for PC/ClientSide.cc:

Go to the source code of this file.

Functions

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 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 computeSendDataBlock1DComm ()
 
void computeSendDataBlock1DServer (const GlobalData_t &gd, const LocalData_t &sd, const Topology_t &stopo, const Topology_t &dtopo, vAbstrait &vdarray, vector< unsigned > &destid)
 

Function Documentation

◆ 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:

◆ computeSendDataBlock1DClient()

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 
)

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

References blockSize(), PaCO::ClientSide, computeReceiveBlock1D(), computeSendBlock1D(), dd, doSchedule(), PaCO::PacoLocalData_s::len, localBlockLengthO(), PaCO::PacoLocalData_s::rank, and PaCO::PacoLocalData_s::start.

Referenced by computeSendDataBlock1D().

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 }
vector< BasicBC > sd
Definition: debug.cc:14
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
unsigned long start
Definition: PaCO++.idl:27
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
Here is the call graph for this function:

◆ computeSendDataBlock1DComm()

void computeSendDataBlock1DComm ( )

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

Referenced by computeSendDataBlock1D().

210  {
211 }

◆ computeSendDataBlock1DServer()

void computeSendDataBlock1DServer ( const GlobalData_t &  gd,
const LocalData_t &  sd,
const Topology_t &  stopo,
const Topology_t &  dtopo,
vAbstrait &  vdarray,
vector< unsigned > &  destid 
)

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

References PaCO::ServerSide.

Referenced by computeSendDataBlock1D().

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 }
vector< BasicBC > sd
Definition: debug.cc:14