00001
00008 #include "routerstrategy.h"
00009
00010 #include "gridrouter.h"
00011 #include "graphrouter.h"
00012 #include "hypercuberouter.h"
00013 #include "treerouter.h"
00014 #include "3dgridrouter.h"
00015 #include "prefixrouter.h"
00016 #include "converse.h"
00017 #include "charm++.h"
00018
00019
00020
00021
00022 CkpvDeclare(int, RouterProcHandle);
00024 void routerProcManyCombinedMsg(char *msg) {
00025
00026 int instance_id;
00027
00028 ComlibPrintf("In Proc combined message at %d\n", CkMyPe());
00029
00030
00031
00032 memcpy(&instance_id, (char*) msg + CmiReservedHeaderSize + 2*sizeof(int)
00033 , sizeof(int));
00034
00035 RouterStrategy *s = (RouterStrategy*)ConvComlibGetStrategy(instance_id);
00036 s->getRouter()->ProcManyMsg(s->getComID(), msg);
00037 }
00038
00039 CkpvDeclare(int, RouterDummyHandle);
00041 void routerDummyMsg(DummyMsg *m) {
00042 RouterStrategy *s = (RouterStrategy*)ConvComlibGetStrategy(m->id.instanceID);
00043 s->getRouter()->DummyEP(m->id, m->magic);
00044 }
00045
00046 CkpvDeclare(int, RouterRecvHandle);
00048 void routerRecvManyCombinedMsg(char *msg) {
00049
00050 int instance_id;
00051 ComlibPrintf("In Recv combined message at %d\n", CkMyPe());
00052
00053
00054
00055 memcpy(&instance_id, (char*) msg + CmiReservedHeaderSize + 2*sizeof(int)
00056 , sizeof(int));
00057
00058 RouterStrategy *s = (RouterStrategy*)ConvComlibGetStrategy(instance_id);
00059 s->getRouter()->RecvManyMsg(s->getComID(), msg);
00060 }
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070 void RouterStrategy::setReverseMap(){
00071 int pcount;
00072 for(pcount = 0; pcount < CkNumPes(); pcount++)
00073 procMap[pcount] = -1;
00074
00075
00076 for(pcount = 0; pcount < npes; pcount++) {
00077 if (pelist[pcount] == CkMyPe())
00078 myPe = pcount;
00079
00080 procMap[pelist[pcount]] = pcount;
00081 }
00082 }
00083
00084 RouterStrategy::RouterStrategy(int stratid) {
00085 ComlibPrintf("[%d] RouterStrategy protected constructor\n",CkMyPe());
00086 setType(CONVERSE_STRATEGY);
00087 id.instanceID = 0;
00088 id.isAllToAll = 0;
00089 id.refno = 0;
00090 doneHandle = 0;
00091 routerIDsaved = stratid;
00092 router = NULL;
00093 pelist = NULL;
00094 bcast_pemap = NULL;
00095 procMap = new int[CkNumPes()];
00096 doneFlag = 1;
00097 bufferedDoneInserting = 0;
00098 }
00099
00100 RouterStrategy::RouterStrategy(int stratid, int handle, int _nsrc, int *_srclist,
00101 int _ndest, int *_destlist) : Strategy() {
00102
00103 ComlibPrintf("[%d] RouterStrategy constructor\n",CkMyPe());
00104
00105 setType(CONVERSE_STRATEGY);
00106
00107
00108
00109
00110
00111 id.instanceID = 0;
00112
00113 id.isAllToAll = 0;
00114 id.refno = 0;
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128 doneHandle = handle;
00129
00130 routerIDsaved = stratid;
00131
00132 router = NULL;
00133 pelist = NULL;
00134 bcast_pemap = NULL;
00135 procMap = new int[CkNumPes()];
00136
00137
00138 doneFlag = 1;
00139
00140
00141 bufferedDoneInserting = 0;
00142
00143 newKnowledgeSrc = _srclist;
00144 newKnowledgeSrcSize = _nsrc;
00145 if (_ndest == 0) {
00146 newKnowledgeDest = new int[_nsrc];
00147 newKnowledge = new int[_nsrc];
00148 newKnowledgeDestSize = _nsrc;
00149 newKnowledgeSize = _nsrc;
00150 memcpy(newKnowledgeDest, _srclist, _nsrc);
00151 memcpy(newKnowledge, _srclist, _nsrc);
00152 } else {
00153 newKnowledgeDest = _destlist;
00154 newKnowledgeDestSize = _ndest;
00155 int *tmplist = new int[CkNumPes()];
00156 for (int i=0; i<CkNumPes(); ++i) tmplist[i]=0;
00157 for (int i=0; i<_nsrc; ++i) tmplist[newKnowledgeSrc[i]]++;
00158 for (int i=0; i<_ndest; ++i) tmplist[newKnowledgeDest[i]]++;
00159 newKnowledgeSize = 0;
00160 for (int i=0; i<CkNumPes(); ++i) if (tmplist[i]!=0) newKnowledgeSize++;
00161 newKnowledge = new int[newKnowledgeSize];
00162 for (int i=0, count=0; i<CkNumPes(); ++i) if (tmplist[i]!=0) newKnowledge[count++]=i;
00163 delete [] tmplist;
00164 }
00165
00166 setupRouter();
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223 }
00224
00225 void RouterStrategy::setupRouter() {
00226 if (bcast_pemap != NULL && ndestPes != newKnowledgeDestSize) {
00227 delete[] bcast_pemap;
00228 bcast_pemap = NULL;
00229 }
00230
00231 npes = newKnowledgeSize;
00232 nsrcPes = newKnowledgeSrcSize;
00233 ndestPes = newKnowledgeDestSize;
00234 if (pelist != NULL) {
00235 delete[] pelist;
00236 delete[] srcPelist;
00237 delete[] destPelist;
00238 }
00239 pelist = newKnowledge;
00240 srcPelist = newKnowledgeSrc;
00241 destPelist = newKnowledgeDest;
00242
00243 newKnowledge = NULL;
00244
00245 if (npes <= 1) routerID = USE_DIRECT;
00246 else routerID = routerIDsaved;
00247
00248 myPe = -1;
00249 setReverseMap();
00250
00251 ComlibPrintf("[%d] Router Strategy : %d, MYPE = %d, NUMPES = %d \n", CkMyPe(), routerID, myPe, npes);
00252
00253 ComlibPrintf("[%d] router=%p\n", CkMyPe(), router);
00254
00255 delete router;
00256 router = NULL;
00257
00258 if (myPe < 0) {
00259
00260 router = NULL;
00261 routerID = USE_DIRECT;
00262 return;
00263 }
00264
00265 switch(routerID) {
00266 case USE_TREE:
00267 router = new TreeRouter(npes, myPe, this);
00268 break;
00269
00270 case USE_MESH:
00271 router = new GridRouter(npes, myPe, this);
00272 break;
00273
00274 case USE_HYPERCUBE:
00275 router = new HypercubeRouter(npes, myPe, this);
00276 break;
00277
00278 case USE_GRID:
00279 router = new D3GridRouter(npes, myPe, this);
00280 break;
00281
00282 case USE_PREFIX:
00283 router = new PrefixRouter(npes, myPe, this);
00284 break;
00285
00286 case USE_DIRECT: router = NULL;
00287 break;
00288
00289 default: CmiAbort("Unknown Strategy\n");
00290 break;
00291 }
00292
00293 if(router) {
00294 router->SetMap(pelist);
00295
00296
00297 }
00298 }
00299
00300 RouterStrategy::~RouterStrategy() {
00301 ComlibPrintf("[%d] RouterStrategy destructor\n",CkMyPe());
00302
00303 delete [] pelist;
00304 delete [] srcPelist;
00305 delete [] destPelist;
00306
00307 delete [] bcast_pemap;
00308
00309 delete [] procMap;
00310
00311 delete router;
00312 router = NULL;
00313 }
00314
00317 void RouterStrategy::insertMessage(MessageHolder *cmsg){
00318 ComlibPrintf("[%d] RouterStrategy::insertMessage\n", CkMyPe());
00319
00320
00321
00322
00323
00324 int count = 0;
00325 if(routerID == USE_DIRECT) {
00326 #if 0
00327
00328 if(cmsg->dest_proc == IS_BROADCAST) {
00329
00330 for(count = 0; count < ndestPes-1; count ++){
00331 CmiSyncSend(destPelist[count], cmsg->size, cmsg->getMessage());
00332 int destPe = destPelist[count];
00333 ComlibPrintf("[%d] RouterStrategy::insertMessage Broadcasting to PE %d\n", CkMyPe(), destPe );
00334 }
00335 if(ndestPes > 0){
00336 CmiSyncSendAndFree(destPelist[ndestPes-1], cmsg->size, cmsg->getMessage());
00337 int destPe = destPelist[ndestPes-1];
00338 ComlibPrintf("[%d] RouterStrategy::insertMessage Broadcasting to PE %d\n", CkMyPe(), destPe);
00339 }
00340 }
00341 else
00342 CmiSyncSendAndFree(cmsg->dest_proc, cmsg->size,
00343 cmsg->getMessage());
00344 delete cmsg;
00345 #else
00346 if(cmsg->dest_proc == IS_BROADCAST) {
00347 ComlibPrintf("[%d] RouterStrategy::insertMessage Broadcasting to all PEs\n", CkMyPe());
00348
00349 #if 0
00350 CmiSyncBroadcastAndFree(cmsg->size, cmsg->getMessage() );
00351 #else
00352 for(int destPe = 0; destPe < CkNumPes()-1; destPe++){
00353 ComlibPrintf("[%d] RouterStrategy::insertMessage Broadcasting to all, PE %d\n", CkMyPe(), destPe );
00354 CmiSyncSend(destPe, cmsg->size, cmsg->getMessage());
00355 }
00356 if(CkNumPes()>0){
00357 CmiSyncSendAndFree(CkNumPes()-1, cmsg->size, cmsg->getMessage());
00358 ComlibPrintf("[%d] RouterStrategy::insertMessage Broadcasting to all, PE %d\n", CkMyPe(), CkNumPes()-1 );
00359 }
00360 #endif
00361
00362 }
00363 else {
00364 CmiSyncSendAndFree(cmsg->dest_proc, cmsg->size, cmsg->getMessage());
00365 }
00366 delete cmsg;
00367
00368 #endif
00369 }
00370 else {
00371 if(cmsg->dest_proc >= 0) {
00372 cmsg->pelist = &procMap[cmsg->dest_proc];
00373 cmsg->npes = 1;
00374 }
00375 else if (cmsg->dest_proc == IS_BROADCAST){
00376
00377
00378 id.isAllToAll = 1;
00379
00380 if(bcast_pemap == NULL) {
00381 bcast_pemap = new int[ndestPes];
00382 for(count = 0; count < ndestPes; count ++) {
00383 bcast_pemap[count] = count;
00384 }
00385 }
00386
00387 cmsg->pelist = bcast_pemap;
00388 cmsg->npes = npes;
00389 }
00390
00391 msgQ.push(cmsg);
00392 }
00393 }
00394
00395 void RouterStrategy::doneInserting(){
00396 ComlibPrintf("[%d] RouterStrategy::doneInserting msgQ.length()=%d \n", CkMyPe(), msgQ.length());
00397
00398
00399 if(myPe < 0) return;
00400
00401
00402 id.instanceID = getInstance();
00403
00404
00405
00406 if(doneFlag == 0) {
00407 ComlibPrintf("[%d] Waiting for previous iteration to Finish\n",
00408 CkMyPe());
00409 bufferedDoneInserting = 1;
00410 ComlibPrintf("[%d] RouterStrategy::doneInserting returning\n", CkMyPe());
00411 return;
00412 }
00413
00414 if(routerID == USE_DIRECT) {
00415 CkAssert(msgQ.length() == 0);
00416
00417
00418
00419 ComlibPrintf("[%d] RouterStrategy::doneInserting calling notifyDone()\n", CkMyPe());
00420 notifyDone();
00421 return;
00422 }
00423
00424 doneFlag = 0;
00425 bufferedDoneInserting = 0;
00426
00427 id.refno ++;
00428
00429 if(msgQ.length() == 0) {
00430 DummyMsg * dummymsg = (DummyMsg *)CmiAlloc(sizeof(DummyMsg));
00431 ComlibPrintf("[%d] Creating a dummy message\n", CkMyPe());
00432 CmiSetHandler(dummymsg, CkpvAccess(RecvdummyHandle));
00433
00434 MessageHolder *cmsg = new MessageHolder((char *)dummymsg,
00435 myPe,
00436 sizeof(DummyMsg));
00437 cmsg->isDummy = 1;
00438 cmsg->pelist = &myPe;
00439 cmsg->npes = 1;
00440 msgQ.push(cmsg);
00441 }
00442
00443 ComlibPrintf("Calling router->EachToManyMulticastQ??????????????????????????\n");
00444 router->EachToManyMulticastQ(id, msgQ);
00445
00446 }
00447
00448 void RouterStrategy::deliver(char *msg, int size) {
00449 CmiSyncSendAndFree(CkMyPe(), size, msg);
00450 }
00451
00455 void RouterStrategy::bracketedUpdatePeKnowledge(int *count) {
00456 ComlibPrintf("[%d] RouterStrategy: Updating knowledge\n", CkMyPe());
00457
00458 newKnowledgeSize = 0;
00459 newKnowledgeSrcSize = 0;
00460 newKnowledgeDestSize = 0;
00461 for (int i=0; i<CkNumPes(); ++i) {
00462 if (count[i] != 0) newKnowledgeSize++;
00463 if ((count[i]&2) == 2) newKnowledgeDestSize++;
00464 if ((count[i]&1) == 1) newKnowledgeSrcSize++;
00465 }
00466 newKnowledge = new int[newKnowledgeSize];
00467 newKnowledgeSrc = new int[newKnowledgeSrcSize];
00468 newKnowledgeDest = new int[newKnowledgeDestSize];
00469
00470 for(int i=0;i<newKnowledgeDestSize;i++){
00471 newKnowledgeDest[i] = -1;
00472 }
00473
00474 for(int i=0;i<newKnowledgeSrcSize;i++){
00475 newKnowledgeSrc[i] = -1;
00476 }
00477
00478 for(int i=0;i<newKnowledgeSize;i++){
00479 newKnowledge[i] = -1;
00480 }
00481
00482 int c=0, cS=0, cD=0;
00483 for (int i=0; i<CkNumPes(); ++i) {
00484 if (count[i] != 0) newKnowledge[c++]=i;
00485 if ((count[i]&2) == 2) newKnowledgeDest[cD++]=i;
00486 if ((count[i]&1) == 1) newKnowledgeSrc[cS++]=i;
00487 }
00488
00489 ComlibPrintf("[%d] RouterStrategy::bracketedUpdatePeKnowledge c=%d cS=%d cD=%d\n", CkMyPe(), c, cS, cD);
00490
00491 for (int i=0; i<newKnowledgeDestSize; ++i) {
00492 ComlibPrintf("[%d] RouterStrategy::bracketedUpdatePeKnowledge newKnowledgeDest[%d]=%d\n", CkMyPe(), i, newKnowledgeDest[i]);
00493 }
00494
00495
00496
00497 if (doneFlag == 0) return;
00498
00499
00500 setupRouter();
00501 }
00502
00503 void RouterStrategy::notifyDone(){
00504
00505 ComlibPrintf("[%d] RouterStrategy: Finished iteration\n", CkMyPe());
00506
00507 if(doneHandle > 0) {
00508 DummyMsg *m = (DummyMsg *)CmiAlloc(sizeof(DummyMsg));
00509 memset((char *)m, 0, sizeof(DummyMsg));
00510 m->id.instanceID = getInstance();
00511 CmiSetHandler(m, doneHandle);
00512 CmiSyncSendAndFree(CkMyPe(), sizeof(DummyMsg), (char*)m);
00513 }
00514
00515 doneFlag = 1;
00516
00517 if (newKnowledge != NULL) {
00518
00519 setupRouter();
00520 }
00521
00522 if(bufferedDoneInserting) doneInserting();
00523 }
00524
00525 void RouterStrategy::pup(PUP::er &p) {
00526 ComlibPrintf("[%d] RouterStrategy::pup called for %s\n",CkMyPe(),
00527 p.isPacking()?"packing":(p.isUnpacking()?"unpacking":"sizing"));
00528 Strategy::pup(p);
00529
00530 p | id;
00531 if (p.isUnpacking()) {
00532 pelist = NULL;
00533 bcast_pemap = NULL;
00534 procMap = new int[CkNumPes()];
00535 doneFlag = 1;
00536 bufferedDoneInserting = 0;
00537 }
00538
00539 p | npes;
00540 p | nsrcPes;
00541 p | ndestPes;
00542 newKnowledgeSize = npes;
00543 newKnowledgeSrcSize = nsrcPes;
00544 newKnowledgeDestSize = ndestPes;
00545
00546 if (p.isUnpacking()) {
00547 newKnowledge = new int[npes];
00548 newKnowledgeSrc = new int[nsrcPes];
00549 newKnowledgeDest = new int[ndestPes];
00550 } else {
00551 newKnowledge = pelist;
00552 newKnowledgeSrc = srcPelist;
00553 newKnowledgeDest = destPelist;
00554 }
00555 p(newKnowledge, npes);
00556 p(newKnowledgeSrc, nsrcPes);
00557 p(newKnowledgeDest, ndestPes);
00558
00559 p | routerIDsaved;
00560 p | doneHandle;
00561
00562 if (p.isUnpacking()) {
00563
00564 router = NULL;
00565 setupRouter();
00566 }
00567 else newKnowledge = NULL;
00568 }
00569
00570 PUPable_def(RouterStrategy)
00571
00572