PaCO++
0.05
|
00001 /* Padico Advanced Examples 00002 * author: Christian Pérez 00003 */ 00004 00005 #include <stdio.h> 00006 00007 #include "Schedule.h" 00008 #include "DistributionBloc.h" 00009 #include "Internal.h" 00010 00011 #define DEBUG_INTERNAL 00012 00013 /************************************************************/ 00014 /************************************************************/ 00015 /************************************************************/ 00016 00018 void computeReceiveDataBlock1DServer(vAbstrait* vdarray, const Topology_t &dtopo, Abstrait* varray, void* comm) 00019 { 00020 00021 cerr << "In computeReceiveDataBlock1DServer...\n"; 00022 00023 vector<LocalData_t> sched_send; 00024 vector<LocalData_t> sched_recv; 00025 00026 sched_send.clear(); 00027 sched_recv.clear(); 00028 00029 // Init data from 1st: all entries are assumed to be identical ! 00030 GlobalData_t& gd = (*vdarray)[0]->gd(); 00031 Topology_t& stopo= (*vdarray)[0]->topo(); 00032 00036 // Compute what to send 00038 cerr << "In computeReceiveDataBlock1DServer...computing what to send\n"; 00039 for (unsigned it=0; it<vdarray->size(); it++) { 00040 if ((*vdarray)[it]->dist().length()==0) { 00041 cerr << "Dist data empty: nothing to send\n"; 00042 } else { 00043 cerr << "it = " << it << endl; 00044 PaCO::PacoLocalData_t psd = (*vdarray)[it]->dist()[0]; 00045 LocalData_t sd; 00046 sd.rank = psd.rank; 00047 sd.start = psd.start; 00048 sd.len = psd.len; 00049 sd.base = (*vdarray)[it]->getDataBuffer(0, false); 00050 computeSendBlock1D(gd, sd, stopo, dtopo, sched_send); 00051 } 00052 } 00053 00057 // Compute what to receive 00059 cerr << "In computeReceiveDataBlock1DServer...computing what to receive\n"; 00060 00063 // Allocating memory 00064 00065 unsigned dbsz = blockSize(gd.len, dtopo.total); 00066 LocalData_t vd; 00067 vd.rank = varray->dist()[0].rank; 00068 vd.start = vd.rank * dbsz; 00069 vd.len = localBlockLengthO(gd.len, vd.rank, dtopo.total, dbsz); 00070 00071 #ifdef DEBUG_INTERNAL 00072 cerr << "Allocating a sequence of length " << vd.len << endl; 00073 #endif 00074 varray->setSeqLength(1); 00075 varray->setDataLength(0, vd.len); 00076 if (vd.len > 0 ) 00077 vd.base = varray->getDataBuffer(0, false); 00078 else 00079 vd.base = (char*) 1; 00080 00081 if (vd.base==0) { 00082 cerr << "Cannot allocate memory for #elements" << vd.len << endl; 00083 } else { 00084 #ifdef DEBUG_INTERNAL 00085 fprintf(stderr, "dd.base = %p\n", vd.base); 00086 #endif 00087 } 00088 00089 computeReceiveBlock1D(gd, vd, stopo, dtopo, sched_recv); 00090 00094 // Doing local communication 00096 fprintf(stderr, "In computeReceiveDataBlock1DServer...Doing local communications with ctopo: %ld\n", dtopo.total); 00097 doSchedule(gd, vd, dtopo, sched_send, sched_recv, comm); 00098 00099 cerr << "In computeReceiveDataBlock1DServer...ok\n"; 00100 } 00101 00104 00105 unsigned nbofPart(const PaCO::distLoc_t& mode, const unsigned stotal, const unsigned dtotal, const unsigned drank) { 00106 switch(mode) { 00107 case PaCO::none: cerr << "INTERNAL ERROR: " << __FILE__ << " " << __FUNCTION__ << endl; return 0; 00108 case PaCO::ClientSide: return 1; 00109 case PaCO::ServerSide: 00110 { 00111 unsigned int nvdarray = stotal/dtotal; 00112 unsigned int remaining = (nvdarray*dtotal + drank < stotal)?1:0; 00113 nvdarray += remaining; 00114 if ( nvdarray == 0 ) return 1; // alway at least one 00115 return nvdarray; 00116 } 00117 case PaCO::CommSide: cerr << "INTERNAL ERROR: not yet implemented in " << __FILE__ << " " << __FUNCTION__ << endl; return 0; 00118 } 00119 return 0; 00120 } 00121 00122 unsigned posofPart(const PaCO::distLoc_t& mode, const unsigned dtotal, const unsigned srank) { 00123 switch(mode) { 00124 case PaCO::none: cerr << "INTERNAL ERROR: " << __FILE__ << " " << __FUNCTION__ << endl; return 0; 00125 case PaCO::ClientSide: return 0; 00126 case PaCO::ServerSide: return srank / dtotal; 00127 case PaCO::CommSide: cerr << "INTERNAL ERROR: not yet implemented in " << __FILE__ << " " << __FUNCTION__ << endl; return 0; 00128 } 00129 return 0; 00130 } 00131 00134 00135 bool computeReceiveDataBlock1D(vAbstrait* vdarray, const PaCO::distLoc_t& mode, 00136 const unsigned dtotal, const unsigned drank, 00137 /*out*/ Abstrait* varray, void* comm) { 00138 00139 cerr << "In computeReceiveDataBlock1D...\n"; 00140 00141 switch(mode) { 00142 case PaCO::none: 00143 cerr << "INTERNAL ERROR: " << __FILE__ << " " << __FUNCTION__ << endl; 00144 break; 00145 case PaCO::ClientSide: 00146 cerr << "Client Side case" <<endl; 00147 varray->CopyAndGetSequenceOwner((*vdarray)[0]); 00148 cerr << "Return true" << endl; 00149 return true; 00150 break; 00151 00152 case PaCO::ServerSide: { 00153 // data has been sent from source i to dest i % dtopo.total 00154 // so dest j has : j, j + dtopo.total, j+2*dtopo.total 00155 // so it may be 1 (at least activation) or more 00156 cerr << " vdaray size: " << vdarray->size() << endl; 00157 00158 // unsigned stotal = (*vdarray)[0]->topo().total; 00159 // unsigned int nvdarray = stotal/dtotal; 00160 // unsigned int remaining = (nvdarray*dtotal + drank < stotal)?1:0; 00161 // nvdarray += remaining; 00162 // if ( nvdarray == 0 ) nvdarray=1; // alway at least one 00163 00164 // fprintf(stderr, "computeReceiveDataBlock1D: Node %d : got %d of %d data\n", drank, vdarray->size(), nvdarray); 00165 00166 // if (vdarray->size() == nvdarray) { 00167 00168 cerr << "DOING LOCAL REDISTRIBUTION width drank: "<< drank << endl; 00169 Topology_t dtopo; 00170 dtopo.total = dtotal; 00171 00172 varray->topo() = (*vdarray)[0]->topo(); 00173 varray->gd() = (*vdarray)[0]->gd(); 00174 varray->dist().length(1); 00175 varray->dist()[0].rank = drank; 00176 00177 computeReceiveDataBlock1DServer(vdarray, dtopo, varray, comm); 00178 00179 return true; 00180 break; 00181 } 00182 case PaCO::CommSide: 00183 break; 00184 } 00185 return false; 00186 } 00187 00191