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; } }