00001
00005
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00076
00077
00078
00079 #include "RectMulticastStrategy.h"
00080 CkpvDeclare(comRectHashType *, com_rect_ptr);
00081 #ifdef CMK_RECT_API
00082 #include "bgltorus.h"
00083 #include "bgml.h"
00084 extern "C" void * bgl_machine_RectBcastInit (unsigned commID, const BGTsRC_Geometry_t* geometry);
00085
00086 extern "C" void bgl_machine_RectBcast (unsigned commid, const char * sndbuf, unsigned sndlen);
00087
00088
00089 extern "C" void bgl_machine_RectBcastConfigure (void *(*Fn)(int));
00090
00091 extern "C" void isSane( void *, unsigned);
00092
00093 CkpvExtern(CkGroupID, cmgrID);
00094
00095 void *sourceOffRectstrategyHandler(void *msg) {
00096 CmiMsgHeaderExt *conv_header = (CmiMsgHeaderExt *) msg;
00097 int instid = conv_header->stratid;
00098 ComlibPrintf("sourceOff handler called on %d\n",CkMyPe(), instid);
00099
00100 RectMulticastStrategy *strat = (RectMulticastStrategy *) ConvComlibGetStrategy(instid);
00101 strat->handleMessageForward(msg);
00102 return NULL;
00103 }
00104
00105 void * rectRequest (int comm) {
00106
00107 #ifdef COMLIB_RECT_DEBUG
00108 CkAssert(CkpvAccess(com_rect_ptr)->get(comm)!=NULL);
00109 isSane(CkpvAccess(com_rect_ptr)->get(comm),comm);
00110 #endif
00111 return CkpvAccess(com_rect_ptr)->get(comm);
00112 }
00113
00114 RectMulticastStrategy::RectMulticastStrategy(CkArrayID aid)
00115 : Strategy(), CharmStrategy() {
00116
00117 ainfo.setDestinationArray(aid);
00118 setType(ARRAY_STRATEGY);
00119 }
00120
00121
00122 RectMulticastStrategy::~RectMulticastStrategy() {
00123
00124 ComlibPrintf("Calling Destructor\n");
00125
00126 if(getLearner() != NULL)
00127 delete getLearner();
00128
00129 CkHashtableIterator *ht_iterator = sec_ht.iterator();
00130 ht_iterator->seekStart();
00131 while(ht_iterator->hasNext()){
00132 void **data;
00133 data = (void **)ht_iterator->next();
00134 ComlibRectSectionHashObject *obj = (ComlibRectSectionHashObject *) (* data);
00135 if(obj != NULL)
00136 delete obj;
00137 }
00138 }
00139
00140 void RectMulticastStrategy::insertMessage(CharmMessageHolder *cmsg){
00141 cmsg->checkme();
00142
00143
00144
00145
00146
00147 if(cmsg->dest_proc == IS_SECTION_MULTICAST && cmsg->sec_id != NULL) {
00148 CkSectionID *sid = cmsg->sec_id;
00149 int cur_sec_id = sid->getSectionID();
00150 ComlibPrintf("[%d] Comlib Rect Section Multicast: insertMessage section id %d\n", CkMyPe(), cur_sec_id);
00151 if(cur_sec_id > 0) {
00152 sinfo.processOldSectionMessage(cmsg);
00153
00154
00155 ComlibPrintf("[%d] insertMessage old sectionid %d \n",CkMyPe(),cur_sec_id);
00156 ComlibSectionHashKey
00157 key(CkMyPe(), sid->_cookie.sInfo.cInfo.id);
00158 ComlibRectSectionHashObject *obj = sec_ht.get(key);
00159
00160 if(obj == NULL)
00161 CkAbort("Cannot Find Section\n");
00162
00163 envelope *env = UsrToEnv(cmsg->getCharmMessage());
00164 #ifndef LOCAL_MULTI_OFF
00165 localMulticast(env, obj);
00166 #endif
00167 if(obj->sourceInRectangle)
00168 {
00169 remoteMulticast(env, obj);
00170 }
00171 else
00172 {
00173 forwardMulticast(env, obj);
00174 }
00175 }
00176 else {
00177 ComlibPrintf("[%d] insertMessage new section id %d\n", CkMyPe(), cur_sec_id);
00178
00179 void *newmsg = sinfo.getNewMulticastMessage(cmsg, needSorting());
00180 insertSectionID(sid);
00181
00182 ComlibSectionHashKey
00183 key(CkMyPe(), sid->_cookie.sInfo.cInfo.id);
00184 ComlibPrintf("[%d] insertMessage new sectionid %d \n",CkMyPe(),sid->_cookie.sInfo.cInfo.id);
00185 ComlibRectSectionHashObject *obj = sec_ht.get(key);
00186
00187 if(obj == NULL)
00188 CkAbort("Cannot Find Section\n");
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211 sinfo.getRemotePelist(sid->_nElems, sid->_elems, obj->npes, obj->pelist);
00212 sinfo.getLocalIndices(sid->_nElems, sid->_elems, obj->indices);
00213 char *msg = cmsg->getCharmMessage();
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235 envelope *ppp = UsrToEnv(newmsg);
00236 CkPackMessage(&ppp);
00237 #ifndef LOCAL_MULTI_OFF
00238 localMulticast(UsrToEnv(msg), obj);
00239 #endif
00240
00241 sendRectDest(obj ,CkMyPe(), UsrToEnv(newmsg));
00242
00243
00244 }
00245 }
00246 else
00247 CkAbort("Section multicast cannot be used without a section proxy");
00248
00249 delete cmsg;
00250 }
00251
00252 void RectMulticastStrategy::insertSectionID(CkSectionID *sid) {
00253
00254
00255 ComlibPrintf("[%d] insertSectionId \n", CkMyPe());
00256
00257
00258 ComlibSectionHashKey
00259 key(CkMyPe(), sid->_cookie.sInfo.cInfo.id);
00260
00261 ComlibRectSectionHashObject *obj = NULL;
00262 obj = sec_ht.get(key);
00263
00264 if(obj != NULL)
00265 delete obj;
00266
00267 obj = createObjectOnSrcPe(sid->_nElems, sid->_elems, sid->_cookie.sInfo.cInfo.id);
00268 sec_ht.put(key) = obj;
00269
00270 }
00271
00272
00273 ComlibRectSectionHashObject *
00274 RectMulticastStrategy::createObjectOnSrcPe(int nindices, CkArrayIndex *idxlist, unsigned int thisSectionID) {
00275
00276 ComlibPrintf("[%d] createObjectOnSrcPe \n", CkMyPe());
00277 ComlibPrintf("[%d] Rect createObjectOnSrcPe \n", CkMyPe());
00278 ComlibRectSectionHashObject *obj = new ComlibRectSectionHashObject();
00279
00280 sinfo.getRemotePelist(nindices, idxlist, obj->npes, obj->pelist);
00281 sinfo.getLocalIndices(nindices, idxlist, obj->indices);
00282
00283
00284 int rootpe=CkMyPe();
00285 BGLTorusManager *bgltm= BGLTorusManager::getObject();
00286 int x,y,z;
00287 bgltm->getCoordinatesByRank(rootpe,x, y, z);
00288 obj->aid=sinfo.getDestArrayID();
00289 unsigned int comm=computeKey( thisSectionID, rootpe, sinfo.getDestArrayID());
00290 CkAssert(obj->npes>0);
00291 BGTsRC_Geometry_t *geometry=getRectGeometry(obj ,rootpe);
00292
00293 if( x >= geometry->x0 && x < geometry->x0+ geometry->xs &&
00294 y >= geometry->y0 && y < geometry->y0+ geometry->ys &&
00295 z >= geometry->z0 && z < geometry->z0+ geometry->zs)
00296 {
00297 ComlibPrintf("[%d] create root %d %d %d %d in rectangle %d %d %d, %d %d %d comm id = %d geom root %d %d %d geom t0 %d tr %d ts %d\n", CkMyPe(), rootpe, x, y, z,
00298 geometry->x0, geometry->y0, geometry->z0,
00299 geometry->xs, geometry->ys, geometry->zs, comm,
00300 geometry->xr, geometry->yr, geometry->zr,
00301 geometry->t0, geometry->tr, geometry->ts
00302 );
00303 obj->sourceInRectangle=true;
00304 obj->cornerRoot=rootpe;
00305 void *request = CkpvAccess(com_rect_ptr)->get(comm);
00306 if(request==NULL)
00307 {
00308 request=bgl_machine_RectBcastInit(comm, geometry);
00309 ComlibPrintf("[%d] csrc init comm %d section %d srcpe %d request %p\n",CkMyPe(), comm, thisSectionID, rootpe, request);
00310 CkpvAccess(com_rect_ptr)->put(comm)= request;
00311 #ifdef COMLIB_RECT_DEBUG
00312 isSane(request,comm);
00313 #endif
00314 }
00315 else{
00316 ComlibPrintf("[%d] csrc already init comm %d section %d srcpe %d\n",CkMyPe(), comm, thisSectionID, rootpe);
00317 }
00318 #ifdef COMLIB_RECT_DEBUG
00319 void *getrequest = CkpvAccess(com_rect_ptr)->get(comm);
00320 CkAssert(*((char *) request)==*((char *)getrequest));
00321 isSane(getrequest,comm);
00322 #endif
00323 }
00324 else
00325 {
00326 ComlibPrintf("[%d] root %d %d %d %d NOT in rectangle %d %d %d, %d %d %d \n", CkMyPe(), rootpe, x, y, z,
00327 geometry->x0, geometry->y0, geometry->z0,
00328 geometry->xs, geometry->ys, geometry->zs
00329 );
00330
00331 obj->sourceInRectangle=false;
00332 obj->cornerRoot=assignCornerRoot(geometry, rootpe);
00333
00334
00335
00336
00337
00338
00339
00340 }
00341
00342 return obj;
00343 }
00344
00345
00346 void RectMulticastStrategy::sendRectDest(ComlibRectSectionHashObject *obj, int srcpe, envelope *env) {
00347 ComlibPrintf("[%d] sendRectDest \n", CkMyPe());
00348
00349 BGTsRC_Geometry_t *geometry=getRectGeometry(obj,srcpe);
00350
00351 BGLTorusManager *bgltm= BGLTorusManager::getObject();
00352 int npes=geometry->xs* geometry->ys *geometry->zs;
00353 ComlibPrintf("[%d] sendRectDest has %d * %d * %d = %d pes\n", CkMyPe(), geometry->xs, geometry->ys, geometry->zs, npes);
00354 int *pelist= new int[npes];
00355 int destpe=0;
00356 for(int x=geometry->x0;x<geometry->xs+geometry->x0;x++)
00357 for(int y=geometry->y0;y<geometry->ys+geometry->y0;y++)
00358 for(int z=geometry->z0;z<geometry->zs+geometry->z0;z++)
00359 {
00360 int pe=bgltm->coords2rank(x,y,z);
00361 if(pe!=srcpe)
00362 pelist[destpe++]=pe;
00363 }
00364
00365
00366 delete geometry;
00367
00368 if(destpe == 0) {
00369 CmiFree(env);
00370 return;
00371 }
00372
00373
00374 CmiSetHandler(env, CkpvAccess(strategy_handlerid));
00375
00376 ((CmiMsgHeaderExt *) env)->stratid = getInstance();
00377
00378
00379 RECORD_SENDM_STATS(getInstance(), env->getTotalsize(), pelist, destpe);
00380
00381 CkPackMessage(&env);
00382
00383 CmiSyncListSendAndFree(destpe, pelist, env->getTotalsize(), (char*)env);
00384
00385
00386 }
00387
00388
00389
00390 int RectMulticastStrategy::assignCornerRoot(BGTsRC_Geometry_t *geometry, int srcpe)
00391 {
00392 fprintf(stderr,"[%d] in assign corner for not in rect root %d\n",CkMyPe(), srcpe);
00393 ComlibPrintf("[%d] in assign corner for not in rect root %d\n",CkMyPe(), srcpe);
00394
00395 BGLTorusManager *bgltm= BGLTorusManager::getObject();
00396
00397 int pelist[8];
00398
00399 int destpe=0;
00400 pelist[destpe++]=bgltm->coords2rank(geometry->x0,geometry->y0,geometry->z0);
00401 pelist[destpe++]=bgltm->coords2rank(geometry->x0+ geometry->xs-1,
00402 geometry->y0,geometry->z0);
00403 pelist[destpe++]=bgltm->coords2rank(geometry->x0,geometry->y0+geometry->ys-1,
00404 geometry->z0);
00405 pelist[destpe++]=bgltm->coords2rank(geometry->x0,geometry->y0,
00406 geometry->z0 + geometry->zs-1);
00407 pelist[destpe++]=bgltm->coords2rank(geometry->x0+ geometry->xs-1,
00408 geometry->y0 +geometry->ys-1,
00409 geometry->z0);
00410 pelist[destpe++]=bgltm->coords2rank(geometry->x0+ geometry->xs-1,
00411 geometry->y0,
00412 geometry->z0+geometry->zs-1);
00413 pelist[destpe++]=bgltm->coords2rank(geometry->x0,
00414 geometry->y0+ geometry->ys-1,
00415 geometry->z0+ geometry->zs-1);
00416 pelist[destpe++]=bgltm->coords2rank(geometry->x0+ geometry->xs-1,
00417 geometry->y0+ geometry->ys-1,
00418 geometry->z0+ geometry->zs-1);
00419
00420 int newrootidx=bgltm->pickClosestRank(srcpe, pelist, destpe);
00421 int newroot=pelist[newrootidx];
00422 int x, y,z;
00423 bgltm->getCoordinatesByRank(newroot, x,y ,z);
00424 geometry->xr=x;
00425 geometry->yr=y;
00426 geometry->zr=z;
00427 ComlibPrintf("[%d] choosing proc %d at %d,%d,%d as corner root\n",CkMyPe(), newroot, x,y ,z);
00428 return(newroot);
00429 }
00430
00431 BGTsRC_Geometry_t *RectMulticastStrategy::getRectGeometry(ComlibRectSectionHashObject *obj, int srcpe)
00432 {
00433
00434 ComlibPrintf("[%d] getRectGeometry \n", CkMyPe());
00435 BGTsRC_Geometry_t *geometry = new BGTsRC_Geometry_t;
00436
00437
00438 BGLTorusManager *bgltm= BGLTorusManager::getObject();
00439
00440 geometry->x0=bgltm->getXNodeSize()*2+1;
00441 geometry->y0=bgltm->getYNodeSize()*2+1;
00442 geometry->z0=bgltm->getZNodeSize()*2+1;
00443 int xmax=0;
00444 int ymax=0;
00445 int zmax=0;
00446 for(int i=0;i<obj->npes;i++)
00447 {
00448 int x=0; int y=0; int z=0;
00449 bgltm->getCoordinatesByRank(obj->pelist[i], x,y,z);
00450 geometry->x0 = (x < geometry->x0) ? x : geometry->x0;
00451 geometry->y0 = (y < geometry->y0) ? y : geometry->y0;
00452 geometry->z0 = (z < geometry->z0) ? z : geometry->z0;
00453 xmax = (x > xmax) ? x : xmax;
00454 ymax = (y > ymax) ? y : ymax;
00455 zmax = (z > zmax) ? z : zmax;
00456 }
00457 geometry->xs = xmax + 1 - geometry->x0;
00458 geometry->ys = ymax + 1 - geometry->y0;
00459 geometry->zs = zmax + 1 - geometry->z0;
00460 geometry->t0=0;
00461 geometry->ts=1;
00462 geometry->tr=0;
00463
00464 int x,y,z;
00465 bgltm->getCoordinatesByRank(srcpe,x, y, z);
00466 geometry->xr=x;
00467 geometry->yr=y;
00468 geometry->zr=z;
00469 if(bgltm->isVnodeMode())
00470 {
00471 ComlibPrintf("VN mode Untested for rectbcast!\n");
00472
00473
00474
00475
00476
00477
00478 geometry->ts=2;
00479 geometry->t0 = geometry->x0 % 2;
00480 geometry->ts = geometry->xs % 2;
00481 geometry->tr = geometry->xr % 2;
00482 geometry->x0 /= 2;
00483 geometry->xs /= 2;
00484 geometry->xr /= 2;
00485 }
00486 return geometry;
00487 }
00488
00489 ComlibRectSectionHashObject *
00490 RectMulticastStrategy::createObjectOnIntermediatePe(int nindices,
00491 CkArrayIndex *idxlist,
00492 int npes,
00493 ComlibMulticastIndexCount *counts,
00494 int srcpe, int thisSectionID) {
00495
00496 ComlibPrintf("[%d] createObjectOnIntermediatePe \n", CkMyPe());
00497 ComlibRectSectionHashObject *obj = new ComlibRectSectionHashObject();
00498 CkAssert(npes>0);
00499 sinfo.getRemotePelist(nindices, idxlist, obj->npes, obj->pelist);
00500 sinfo.getLocalIndices(nindices, idxlist, obj->indices);
00501 obj->aid=sinfo.getDestArrayID();
00502
00503
00504
00505 BGLTorusManager *bgltm= BGLTorusManager::getObject();
00506 int x,y,z;
00507 bgltm->getCoordinatesByRank(srcpe,x, y, z);
00508
00509 unsigned int comm = computeKey( thisSectionID, srcpe, sinfo.getDestArrayID());
00510
00511 if(obj->npes<=0)
00512 {
00513 ComlibPrintf("[%d] nindices %d, npes %d, obj->npes %d\n", CkMyPe(), nindices, npes, obj->npes);
00514 }
00515 CkAssert(obj->npes>0);
00516 BGTsRC_Geometry_t *geometry=getRectGeometry(obj,srcpe);
00517
00518 if( x >= geometry->x0 && x < geometry->x0+ geometry->xs &&
00519 y >= geometry->y0 && y < geometry->y0+ geometry->ys &&
00520 z >= geometry->z0 && z < geometry->z0+ geometry->zs)
00521 {
00522 ComlibPrintf("[%d] create intermediate %d %d %d %d in rectangle %d %d %d, %d %d %d comm = %d \n", CkMyPe(), srcpe, x, y, z,
00523 geometry->x0, geometry->y0, geometry->z0,
00524 geometry->xs, geometry->ys, geometry->zs, comm
00525 );
00526
00527 obj->sourceInRectangle=true;
00528 obj->cornerRoot=srcpe;
00529 }
00530 else
00531 {
00532 ComlibPrintf("[%d] root %d %d %d %d NOT in rectangle %d %d %d, %d %d %d \n", CkMyPe(), srcpe, x, y, z,
00533 geometry->x0, geometry->y0, geometry->z0,
00534 geometry->xs, geometry->ys, geometry->zs
00535 );
00536
00537
00538 obj->sourceInRectangle=false;
00539
00540 obj->cornerRoot=assignCornerRoot(geometry,srcpe);
00541 }
00542
00543 void *request = CkpvAccess(com_rect_ptr)->get(comm);
00544 if(request==NULL)
00545 {
00546 request=bgl_machine_RectBcastInit(comm, geometry);
00547 ComlibPrintf("[%d] cinter init comm %d section %d srcpe %d\n",CkMyPe(), comm, thisSectionID, srcpe);
00548 }
00549 else{
00550 ComlibPrintf("[%d] cinter already init comm %d section %d srcpe %d\n",CkMyPe(), comm, thisSectionID, srcpe);
00551 }
00552
00553
00554 CkpvAccess(com_rect_ptr)->put(comm)= request;
00555 #ifdef COMLIB_RECT_DEBUG
00556 void *getrequest = CkpvAccess(com_rect_ptr)->get(comm);
00557 CkAssert(*((char *) request)==*((char *)getrequest));
00558 isSane(getrequest,comm);
00559 #endif
00560
00561 return obj;
00562 }
00563
00564
00565 void RectMulticastStrategy::doneInserting(){
00566
00567 }
00568
00569 extern void CmiReference(void *);
00570
00571
00572
00573 void RectMulticastStrategy::localMulticast(envelope *env,
00574 ComlibRectSectionHashObject *obj) {
00575 int nIndices = obj->indices.size();
00576
00577 if(obj->msg != NULL) {
00578 CmiFree(obj->msg);
00579 obj->msg = NULL;
00580 }
00581
00582 if(nIndices > 0) {
00583 void *msg = EnvToUsr(env);
00584 void *msg1 = msg;
00585
00586 msg1 = CkCopyMsg(&msg);
00587
00588 ComlibArrayInfo::localMulticast(&(obj->indices), UsrToEnv(msg1));
00589 }
00590 }
00591
00592
00593
00594
00595
00596 void RectMulticastStrategy::remoteMulticast(envelope *env,
00597 ComlibRectSectionHashObject *obj) {
00598
00599 ComlibPrintf("[%d] remoteMulticast \n", CkMyPe());
00600 int npes = obj->npes;
00601 int *pelist = obj->pelist;
00602
00603
00604
00605
00606
00607
00608
00609 CmiSetHandler(env, CkpvAccess(strategy_handlerid));
00610
00611 ((CmiMsgHeaderExt *) env)->stratid = getInstance();
00612
00613
00614 RECORD_SENDM_STATS(getInstance(), env->getTotalsize(), pelist, npes);
00615 int srcpe=env->getSrcPe();
00616 CkPackMessage(&env);
00617
00618
00619
00620
00621
00622 ComlibMulticastMsg *cbmsg = (ComlibMulticastMsg *)EnvToUsr(env);
00623 int sectionID=cbmsg->_cookie.sInfo.cInfo.id;
00624 CkArrayID destid=obj->aid;
00625
00626
00627 int comm=computeKey(sectionID, srcpe, destid);
00628 ComlibPrintf("[%d] rectbcast using comm %d section %d srcpe %d request %p\n",CkMyPe(), comm, sectionID, srcpe, CkpvAccess(com_rect_ptr)->get(comm));
00629 #ifdef COMLIB_RECT_DEBUG
00630 isSane(CkpvAccess(com_rect_ptr)->get(comm),comm);
00631 #endif
00632 bgl_machine_RectBcast(comm , (char*)env, env->getTotalsize());
00633
00634
00635 }
00636
00637
00638
00639 void RectMulticastStrategy::forwardMulticast(envelope *env,
00640 ComlibRectSectionHashObject *obj) {
00641
00642 ComlibPrintf("[%d] forwardMulticast \n", CkMyPe());
00643 int *pelist = obj->pelist;
00644 int npes = obj->npes;
00645 if(npes == 0) {
00646 CmiFree(env);
00647 return;
00648 }
00649
00650 CmiSetHandler(env, handlerId);
00651
00652 ((CmiMsgHeaderExt *) env)->stratid = getInstance();
00653
00654
00655 RECORD_SENDM_STATS(getInstance(), env->getTotalsize(), pelist, npes);
00656
00657 CkPackMessage(&env);
00658
00659 ComlibMulticastMsg *cbmsg = (ComlibMulticastMsg *)EnvToUsr(env);
00660 int sectionID=cbmsg->_cookie.sInfo.cInfo.id;
00661
00662
00663 CmiSyncSendAndFree(obj->cornerRoot, env->getTotalsize(), (char*)env);
00664
00665 }
00666
00667
00668 void RectMulticastStrategy::pup(PUP::er &p){
00669
00670 CharmStrategy::pup(p);
00671 }
00672
00673 void RectMulticastStrategy::beginProcessing(int numElements){
00674
00675
00676 handlerId = CkRegisterHandler((CmiHandler)sourceOffRectstrategyHandler);
00677 bgl_machine_RectBcastConfigure (rectRequest);
00678 CkArrayID dest;
00679 int nidx;
00680 CkArrayIndex *idx_list;
00681
00682 ainfo.getDestinationArray(dest, idx_list, nidx);
00683 sinfo = ComlibSectionInfo(dest, myInstanceID);
00684
00685 ComlibLearner *learner = new ComlibLearner();
00686
00687 }
00688
00689 void RectMulticastStrategy::handleMessage(void *msg){
00690 envelope *env = (envelope *)msg;
00691 RECORD_RECV_STATS(getInstance(), env->getTotalsize(), env->getSrcPe());
00692
00693
00694 CkMcastBaseMsg *cbmsg = (CkMcastBaseMsg *)EnvToUsr(env);
00695
00696 int status = cbmsg->_cookie.sInfo.cInfo.status;
00697 ComlibPrintf("[%d] In handleMessage %d\n", CkMyPe(), status);
00698
00699 if(status == COMLIB_MULTICAST_NEW_SECTION)
00700 handleNewMulticastMessage(env);
00701 else {
00702
00703 ComlibSectionHashKey key(cbmsg->_cookie.pe,
00704 cbmsg->_cookie.sInfo.cInfo.id);
00705
00706 ComlibRectSectionHashObject *obj;
00707 obj = sec_ht.get(key);
00708
00709 if(obj == NULL)
00710 CkAbort("Destination indices is NULL\n");
00711 #ifndef LOCAL_MULTI_OFF
00712 localMulticast(env, obj);
00713 #endif
00714
00715
00716 }
00717 }
00718
00719 void RectMulticastStrategy::handleMessageForward(void *msg){
00720
00721 envelope *env = (envelope *)msg;
00722 RECORD_RECV_STATS(getInstance(), env->getTotalsize(), env->getSrcPe());
00723
00724
00725 CkMcastBaseMsg *cbmsg = (CkMcastBaseMsg *)EnvToUsr(env);
00726
00727 int status = cbmsg->_cookie.sInfo.cInfo.status;
00728 ComlibPrintf("[%d] In handleMessageForward %d\n", CkMyPe(), status);
00729
00730 if(status == COMLIB_MULTICAST_NEW_SECTION)
00731 handleNewMulticastMessage(env);
00732 else {
00733
00734 ComlibSectionHashKey key(cbmsg->_cookie.pe,
00735 cbmsg->_cookie.sInfo.cInfo.id);
00736
00737 ComlibRectSectionHashObject *obj;
00738 obj = sec_ht.get(key);
00739
00740 if(obj == NULL)
00741 CkAbort("Destination indices is NULL\n");
00742 #ifndef LOCAL_MULTI_OFF
00743 localMulticast(env, obj);
00744 #endif
00745 remoteMulticast(env, obj);
00746 }
00747 }
00748
00749 #include <string>
00750
00751 void RectMulticastStrategy::handleNewMulticastMessage(envelope *env) {
00752
00753 ComlibPrintf("[%d] : In handleNewMulticastMessage\n", CkMyPe());
00754
00755 CkUnpackMessage(&env);
00756 int sender=env->getSrcPe();
00757 int localElems;
00758 envelope *newenv;
00759 CkArrayIndex *local_idx_list;
00760
00761 sinfo.unpack(env, localElems, local_idx_list, newenv);
00762
00763 ComlibMulticastMsg *cbmsg = (ComlibMulticastMsg *)EnvToUsr(env);
00764 ComlibSectionHashKey key(cbmsg->_cookie.pe,
00765 cbmsg->_cookie.sInfo.cInfo.id);
00766
00767 ComlibRectSectionHashObject *old_obj = NULL;
00768
00769 old_obj = sec_ht.get(key);
00770
00771 if(old_obj != NULL) {
00772 delete old_obj;
00773 }
00774
00775
00776
00777
00778
00779
00780
00781 int cur_sec_id=cbmsg->_cookie.sInfo.cInfo.id;
00782
00783
00784
00785 ComlibMulticastMsg *lll = cbmsg;
00786 envelope *ppp = UsrToEnv(cbmsg);
00787 CkUnpackMessage(&ppp);
00788 int ttt=0;
00789 int uuu=0;
00790 for (int i=0; i<lll->nPes; ++i) {
00791
00792 uuu++;
00793 for (int j=0; j<lll->indicesCount[i].count; ++j) {
00794
00795 ttt++;
00796 }
00797
00798 }
00799 ComlibPrintf("[%d] cbmsg for intermediate has %d indices %d pes\n",CkMyPe(),ttt, uuu);
00800 CkAssert(uuu>0);
00801 CkAssert(ttt>0);
00802
00803 ComlibRectSectionHashObject *new_obj = createObjectOnIntermediatePe(ttt, cbmsg->indices, cbmsg->nPes, cbmsg->indicesCount, sender, cur_sec_id );
00804
00805 sinfo.getRemotePelist(localElems, local_idx_list, new_obj->npes, new_obj->pelist);
00806 sinfo.getLocalIndices(localElems, local_idx_list, new_obj->indices);
00807
00808 sec_ht.put(key) = new_obj;
00809 CkPackMessage(&newenv);
00810 #ifndef LOCAL_MULTI_OFF
00811
00812 localMulticast(newenv, new_obj);
00813 #endif
00814 CmiFree(newenv);
00815 }
00816 #endif
00817
00818