|
PaCO++
0.05
|

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) |
| 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.
{
switch(mode) {
case PaCO::none: cerr << "INTERNAL ERROR: " << __FILE__ << " " << __FUNCTION__ << endl;
case PaCO::ClientSide: computeSendDataBlock1DClient(gd, sd, stopo, dtopo, vdarray, destid, comm); break;
case PaCO::ServerSide: computeSendDataBlock1DServer(gd, sd, stopo, dtopo, vdarray, destid); break;
case PaCO::CommSide: computeSendDataBlock1DComm (); break;
}
}

| 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.
{
cerr << "In computeSendDataBlock1DClient...\n";
vector<LocalData_t> sched_send;
vector<LocalData_t> sched_recv;
sched_send.clear();
sched_recv.clear();
// Compute what to send
cerr << "In computeSendDataBlock1DClient...computing what to send\n";
computeSendBlock1D(gd, sd, stopo, dtopo, sched_send);
// Compute what to receive
cerr << "In computeSendDataBlock1DClient...computing what to receive\n";
// compute how many dest local data this node has to handle
unsigned int nvdarray = dtopo.total/stopo.total;
unsigned int remaining = (nvdarray*stopo.total + sd.rank < dtopo.total)?1:0;
nvdarray += remaining;
// Preparing also CORBA stuff
vdarray.clear();
vdarray.resize(nvdarray);
destid.clear();
destid.resize(nvdarray);
// so, we simulate node from rank, rank+stopo.total ,... only if nvdarray>0
unsigned dbsz = blockSize(gd.len, dtopo.total);
// cerr << "DBSZ: " << dbsz << endl;
for (unsigned it=0; it<nvdarray; it++) {
cerr << "computeSendDataBlock1DClient: it = " << it << endl;
Abstrait* out = vdarray[it];
out->topo().total = dtopo.total;
out->gd().len = gd.len;
out->gd().unit_size = gd.unit_size;
// add for mode informations
out->mode() = PaCO::ClientSide;
out->dist().length(1);
out->setSeqLength(1);
PaCO::PacoLocalData_t& pld = out->dist()[0];
LocalData_t dd;
pld.rank = dd.rank = sd.rank + it * stopo.total;
pld.start = dd.start = dd.rank * dbsz;
pld.len = dd.len = localBlockLengthO(gd.len, dd.rank, dtopo.total, dbsz);
#ifdef DEBUG_INTERNAL
fprintf(stderr, "%d: -- r:%d gl:%d ll:%d start:%d bz:%d dt:%d\n", pid,
dd.rank, gd.len, dd.len, dd.start, dbsz, dtopo.total);
#endif
destid[it] = dd.rank;
// Allocating memory
#ifdef NO_COM
dd.base = (char*) mymalloc(pld.len * gd.unit_size);
out->setDataLength(0, pld.len);
#else
#ifdef DEBUG_INTERNAL
cerr << "Allocating a sequence of length " << pld.len << endl;
#endif
out->setDataLength(0, pld.len);
if (pld.len > 0 )
dd.base = out->getDataBuffer(0, false);
else
dd.base = (char*) 1;
#endif
if (dd.base==0) {
cerr << "Cannot allocate memory for #elements" << pld.len << endl;
} else {
#ifdef DEBUG_INTERNAL
fprintf(stderr, "dd.base = %p\n", dd.base);
#endif
}
computeReceiveBlock1D(gd, dd, stopo, dtopo, sched_recv);
}
// Doing local communication
fprintf(stderr, "In computeSendDataBlock1DClient...Doing local communications with ctopo: %ld\n", dtopo.total);
doSchedule(gd, sd, stopo, sched_send, sched_recv, comm);
cerr << "In computeSendDataBlock1DClient...ok\n";
}

| void computeSendDataBlock1DComm | ( | ) |
Definition at line 210 of file PC/ClientSide.cc.
{
}
| 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.
{
// Easy: node i send data to node i%dtopo.total
// It has to send an empty message to nodes i+stopo.total, i+2*stopo.total ... < dtopo.total
// How messages to send ?
unsigned int nvdarray = dtopo.total/stopo.total;
unsigned int remaining = (nvdarray*stopo.total + sd.rank < dtopo.total)?1:0;
nvdarray += remaining;
// alwaays something to send
if ( nvdarray == 0 ) nvdarray=1;
// Preparing CORBA stuff
vdarray.clear();
vdarray.resize(nvdarray);
destid.clear();
destid.resize(nvdarray);
for (unsigned it=0; it<nvdarray; it++) {
Abstrait* out = vdarray[it];
out->topo().total = stopo.total;
out->gd().len = gd.len;
out->gd().unit_size = gd.unit_size;
// add for mode information
out->mode() = PaCO::ServerSide;
if ( it == 0 ) { // always data to send
out->dist().length(1);
out->setSeqLength(1);
out->dist()[0].rank = sd.rank;
out->dist()[0].start = sd.start;
out->dist()[0].len = sd.len;
out->DataReplace(0, sd.len, sd.base, false);
} else { // always nothing to send
out->dist().length(0);
out->setSeqLength(0);
}
destid[it] = ( sd.rank + it * stopo.total ) % dtopo.total;
}
}