00001
00008 #include "ComlibStrategy.h"
00009 #include "register.h"
00010
00011
00012 void CharmStrategy::pup(PUP::er &p) {
00013
00014 p | nginfo;
00015 p | ginfo;
00016 p | ainfo;
00017
00018 p | mflag;
00019 p | onFinish;
00020 }
00021
00022
00023
00024
00025
00034 int CharmStrategy::deliverToIndices(void *msg, int numDestIdxs, const CkArrayIndex* indices ){
00035 int count = 0;
00036
00037 envelope *env = UsrToEnv(msg);
00038 int ep = env->getsetArrayEp();
00039 CkUnpackMessage(&env);
00040
00041 CkArrayID destination_aid = env->getsetArrayMgr();
00042 CkArray *a=(CkArray *)_localBranch(destination_aid);
00043
00044 env->setPacked(0);
00045 env->getsetArrayHops()=1;
00046 env->setUsed(0);
00047
00048
00049
00050 if(numDestIdxs > 0){
00051
00052
00053 for(int i=0; i<numDestIdxs-1;i++){
00054 env->getsetArrayIndex() = indices[i];
00055
00056
00057
00058 if(_entryTable[ep]->noKeep)
00059
00060 count += a->deliver((CkArrayMessage *)msg, CkDeliver_inline, CK_MSG_KEEP);
00061 else {
00062 void *newmsg = CkCopyMsg(&msg);
00063 count += a->deliver((CkArrayMessage *)newmsg, CkDeliver_queue);
00064 }
00065 }
00066
00067
00068 env->getsetArrayIndex() = indices[numDestIdxs-1];
00069
00070 if(_entryTable[ep]->noKeep){
00071 count += a->deliver((CkArrayMessage *)msg, CkDeliver_inline, CK_MSG_KEEP);
00072 CmiFree(env);
00073 }
00074 else {
00075 count += a->deliver((CkArrayMessage *)msg, CkDeliver_queue);
00076 }
00077
00078 }
00079 else
00080 CkFreeMsg(msg);
00081
00082 return count;
00083 }
00084
00085
00086
00087
00088
00089
00090
00091
00092 void CharmMessageHolder::pup(PUP::er &p) {
00093
00094
00095
00096 MessageHolder::pup(p);
00097
00098
00099
00100 sec_id = NULL;
00101 }
00102
00103
00104 PUPable_def(CharmMessageHolder)
00105
00106 ComlibNodeGroupInfo::ComlibNodeGroupInfo() {
00107 isNodeGroup = 0;
00108 ngid.setZero();
00109 }
00110
00111 void ComlibNodeGroupInfo::pup(PUP::er &p) {
00112 p | isNodeGroup;
00113 p | ngid;
00114 }
00115
00116 ComlibGroupInfo::ComlibGroupInfo() {
00117
00118 isSrcGroup = 0;
00119 isDestGroup = 0;
00120 nsrcpes = 0;
00121 ndestpes = 0;
00122 srcpelist = NULL;
00123 destpelist = NULL;
00124 sgid.setZero();
00125 dgid.setZero();
00126 }
00127
00128 ComlibGroupInfo::~ComlibGroupInfo() {
00129 if(nsrcpes > 0 && srcpelist != NULL)
00130 delete [] srcpelist;
00131
00132 if(ndestpes > 0 && destpelist != NULL)
00133 delete [] destpelist;
00134 }
00135
00136 void ComlibGroupInfo::pup(PUP::er &p){
00137
00138 p | sgid;
00139 p | dgid;
00140 p | nsrcpes;
00141 p | ndestpes;
00142
00143 p | isSrcGroup;
00144 p | isDestGroup;
00145
00146 if(p.isUnpacking()) {
00147 if(nsrcpes > 0)
00148 srcpelist = new int[nsrcpes];
00149
00150 if(ndestpes > 0)
00151 destpelist = new int[ndestpes];
00152 }
00153
00154 if(nsrcpes > 0)
00155 p(srcpelist, nsrcpes);
00156
00157 if(ndestpes > 0)
00158 p(destpelist, ndestpes);
00159 }
00160
00161 void ComlibGroupInfo::setSourceGroup(CkGroupID gid, int *pelist,
00162 int npes) {
00163 this->sgid = gid;
00164 srcpelist = pelist;
00165 nsrcpes = npes;
00166 isSrcGroup = 1;
00167
00168 if(nsrcpes == 0) {
00169 nsrcpes = CkNumPes();
00170 srcpelist = new int[nsrcpes];
00171 for(int count =0; count < nsrcpes; count ++)
00172 srcpelist[count] = count;
00173 }
00174 }
00175
00176 void ComlibGroupInfo::getSourceGroup(CkGroupID &gid, int *&pelist,
00177 int &npes){
00178 gid = this->sgid;
00179 npes = nsrcpes;
00180
00181 pelist = new int [nsrcpes];
00182 memcpy(pelist, srcpelist, npes * sizeof(int));
00183 }
00184
00185 void ComlibGroupInfo::getSourceGroup(CkGroupID &gid){
00186 gid = this->sgid;
00187 }
00188
00189 void ComlibGroupInfo::setDestinationGroup(CkGroupID gid, int *pelist,
00190 int npes) {
00191 this->dgid = gid;
00192 destpelist = pelist;
00193 ndestpes = npes;
00194 isDestGroup = 1;
00195
00196 if(ndestpes == 0) {
00197 ndestpes = CkNumPes();
00198 destpelist = new int[ndestpes];
00199 for(int count =0; count < ndestpes; count ++)
00200 destpelist[count] = count;
00201 }
00202 }
00203
00204 void ComlibGroupInfo::getDestinationGroup(CkGroupID &gid, int *&pelist,
00205 int &npes) {
00206 gid = this->dgid;
00207 npes = ndestpes;
00208
00209 pelist = new int [ndestpes];
00210 memcpy(pelist, destpelist, npes * sizeof(int));
00211 }
00212
00213 void ComlibGroupInfo::getDestinationGroup(CkGroupID &gid) {
00214 gid = this->dgid;
00215 }
00216
00217 int *ComlibGroupInfo::getCombinedCountList() {
00218 int *result = new int[CkNumPes()];
00219 int i;
00220 for (i=0; i<CkNumPes(); ++i) result[i] = 0;
00221 if (nsrcpes != 0) {
00222 for (i=0; i<nsrcpes; ++i) result[srcpelist[i]] |= 1;
00223 } else {
00224 for (i=0; i<CkNumPes(); ++i) result[i] |= 1;
00225 }
00226 if (ndestpes != 0) {
00227 for (i=0; i<ndestpes; ++i) result[destpelist[i]] |= 2;
00228 } else {
00229 for (i=0; i<CkNumPes(); ++i) result[i] |= 2;
00230 }
00231 return result;
00232 }
00233
00234
00235 ComlibArrayInfo::ComlibArrayInfo() {
00236
00237 src_aid.setZero();
00238 isAllSrc = 0;
00239 totalSrc = 0;
00240 isSrcArray = 0;
00241
00242 dest_aid.setZero();
00243 isAllDest = 0;
00244 totalDest = 0;
00245 isDestArray = 0;
00246 }
00247
00248
00249 void ComlibArrayInfo::setSourceArray(CkArrayID aid, CkArrayIndex *e, int nind){
00250 src_aid = aid;
00251 isSrcArray = 1;
00252
00253 src_elements.removeAll();
00254 for (int i=0; i<nind; ++i){
00255 CkAssert(e[i].nInts == 1);
00256 src_elements.push_back(e[i]);
00257 }
00258
00259 if (nind == 0)
00260 isAllSrc = 1;
00261 else
00262 isAllSrc = 0;
00263
00264 totalSrc = nind;
00265
00266 CkAssert(src_elements.size() == totalSrc);
00267
00268 }
00269
00270
00271 void ComlibArrayInfo::setDestinationArray(CkArrayID aid, CkArrayIndex *e, int nind){
00272 ComlibPrintf("[%d] ComlibArrayInfo::setDestinationArray dest_elements\n", CkMyPe());
00273 dest_aid = aid;
00274 isDestArray = 1;
00275
00276 dest_elements.removeAll();
00277 for (int i=0; i<nind; ++i){
00278 CkAssert(e[i].nInts > 0);
00279 dest_elements.push_back(e[i]);
00280 }
00281
00282 if (nind == 0)
00283 isAllDest = 1;
00284 else
00285 isAllDest = 0;
00286
00287 totalDest = nind;
00288 CkAssert(dest_elements.size() == totalDest);
00289
00290 }
00291
00292
00294
00295 void ComlibArrayInfo::pup(PUP::er &p){
00296 p | src_aid;
00297 p | isSrcArray;
00298 p | isAllSrc;
00299 p | totalSrc;
00300 p | src_elements;
00301 p | new_src_elements;
00302
00303 p | dest_aid;
00304 p | isDestArray;
00305 p | isAllDest;
00306 p | totalDest;
00307 p | dest_elements;
00308 p | new_dest_elements;
00309
00310 if (p.isPacking() || p.isUnpacking()) {
00311
00312
00313
00314 purge();
00315 }
00316
00317
00318 }
00319
00320
00321 void ComlibArrayInfo::printDestElementList() {
00322 char buf[100000];
00323 buf[0] = '\0';
00324 for(int i=0;i<dest_elements.size();i++){
00325 sprintf(buf+strlen(buf), " %d", dest_elements[i].data()[0]);
00326 }
00327 CkPrintf("[%d] dest_elements = %s\n", CkMyPe(), buf);
00328 }
00329
00330
00331 void ComlibArrayInfo::newElement(CkArrayID &id, const CkArrayIndex &idx) {
00332 CkAbort("New Comlib implementation does not allow dynamic element insertion yet\n");
00333
00334
00335
00336 }
00337
00338 void ComlibArrayInfo::purge() {
00339
00340
00341 if (isSrcArray) {
00342 CkArray *a = (CkArray *)_localBranch(src_aid);
00343
00344
00345 for (int i=src_elements.size()-1; i>=0; --i) {
00346 if (a->homePe(src_elements[i]) != CkMyPe()) {
00347 ComlibPrintf("[%d] ComlibArrayInfo::purge removing home=%d src element %d i=%d\n", CkMyPe(),a->homePe(src_elements[i]), src_elements[i].data()[0], i);
00348 src_elements.remove(i);
00349 }
00350 }
00351 }
00352
00353 if (isDestArray) {
00354 CkArray *a = (CkArray *)_localBranch(dest_aid);
00355
00356
00357 for (int i=dest_elements.size()-1; i>=0; --i) {
00358 if (a->homePe(dest_elements[i]) != CkMyPe()) {
00359 ComlibPrintf("[%d] ComlibArrayInfo::purge removing home=%d dest element %d i=%d\n", CkMyPe(), a->homePe(dest_elements[i]), dest_elements[i].data()[0], i);
00360 dest_elements.remove(i);
00361 }
00362 }
00363 }
00364
00365 }
00366
00367 int *ComlibArrayInfo::getCombinedCountList() {
00368 int *result = new int[CkNumPes()];
00369 int i;
00370 for (i=0; i<CkNumPes(); ++i) result[i] = 0;
00371 CkArray *a = (CkArray *)_localBranch(src_aid);
00372 if (src_elements.size() != 0) {
00373 for (i=0; i<src_elements.size(); ++i) result[a->homePe(src_elements[i])] |= 1;
00374 } else {
00375 for (i=0; i<CkNumPes(); ++i) result[i] |= 1;
00376 }
00377 a = (CkArray *)_localBranch(dest_aid);
00378 if (dest_elements.size() != 0) {
00379 for (i=0; i<dest_elements.size(); ++i) result[a->homePe(dest_elements[i])] |= 2;
00380 } else {
00381 for (i=0; i<CkNumPes(); ++i) result[i] |= 2;
00382 }
00383 return result;
00384 }
00385
00386
00387
00389 void ComlibArrayInfo::localBroadcast(envelope *env) {
00390 int count = localMulticast(&dest_elements, env);
00391 if(com_debug){
00392 CkPrintf("[%d] ComlibArrayInfo::localBroadcast to %d elements (%d non local)\n",CmiMyPe(),dest_elements.size(),count);
00393 printDestElementList();
00394 }
00395
00396 }
00397
00398
00399
00419 #include "register.h"
00420 int ComlibArrayInfo::localMulticast(CkVec<CkArrayIndex>*vec,
00421 envelope *env){
00422 int count = 0;
00423
00424 int nelements = vec->size();
00425 if(nelements == 0) {
00426 CmiFree(env);
00427 return 0;
00428 }
00429
00430 void *msg = EnvToUsr(env);
00431 int ep = env->getsetArrayEp();
00432 CkUnpackMessage(&env);
00433
00434 CkArrayID destination_aid = env->getsetArrayMgr();
00435 env->setPacked(0);
00436 env->getsetArrayHops()=1;
00437 env->setUsed(0);
00438
00439 CkArrayIndex idx;
00440
00441
00442 for(int i = 0; i < nelements-1; i ++){
00443 idx = (*vec)[i];
00444
00445
00446 env->getsetArrayIndex() = idx;
00447
00448
00449 CkArray *a=(CkArray *)_localBranch(destination_aid);
00450 if(_entryTable[ep]->noKeep)
00451 count += a->deliver((CkArrayMessage *)msg, CkDeliver_inline, CK_MSG_KEEP);
00452 else {
00453 void *newmsg = CkCopyMsg(&msg);
00454 count += a->deliver((CkArrayMessage *)newmsg, CkDeliver_queue);
00455 }
00456
00457 }
00458
00459 idx = (*vec)[nelements-1];
00460
00461 env->getsetArrayIndex() = idx;
00462
00463
00464 CkArray *a=(CkArray *)_localBranch(destination_aid);
00465 if(_entryTable[ep]->noKeep) {
00466 count += a->deliver((CkArrayMessage *)msg, CkDeliver_inline, CK_MSG_KEEP);
00467 CmiFree(env);
00468 }
00469 else
00470 count += a->deliver((CkArrayMessage *)msg, CkDeliver_queue);
00471
00472 return count;
00473 }
00474
00477 void ComlibArrayInfo::deliver(envelope *env){
00478 ComlibPrintf("In ComlibArrayInfo::deliver()\n");
00479
00480 env->setUsed(0);
00481 env->getsetArrayHops()=1;
00482 CkUnpackMessage(&env);
00483
00484 CkArray *a=(CkArray *)_localBranch(env->getsetArrayMgr());
00485 a->deliver((CkArrayMessage *)EnvToUsr(env), CkDeliver_queue);
00486 }
00487
00488