New version which reduces the number of virtual function calls
authorSameer Kumar <skumar2@uiuc.edu>
Wed, 6 Oct 2004 20:51:37 +0000 (20:51 +0000)
committerSameer Kumar <skumar2@uiuc.edu>
Wed, 6 Oct 2004 20:51:37 +0000 (20:51 +0000)
12 files changed:
src/conv-com/3dgridrouter.C
src/conv-com/3dgridrouter.h
src/conv-com/comlib.h
src/conv-com/convcomlibmanager.C
src/conv-com/convcomlibmanager.h
src/conv-com/convcomlibstrategy.C
src/conv-com/convcomlibstrategy.h
src/conv-com/de.C
src/conv-com/gridrouter.C
src/conv-com/petable.C
src/conv-com/routerstrategy.C
src/conv-com/routerstrategy.h

index 6ea79bdadcfde700fd3290780f4f26234be5925e..71f3cb709e7fec568a256e91346321c71d258b3f 100644 (file)
@@ -27,7 +27,6 @@
 }
 
 #define ROWLEN COLLEN
-#define NPLANES (int)ceil(((double)NumPes) / (ROWLEN * COLLEN))
 
 #define RowLen(pe) ColLen3D(pe)
 #define PELISTSIZE ((ROWLEN-1)/sizeof(int)+1)
@@ -149,8 +148,27 @@ D3GridRouter::D3GridRouter(int n, int me)
     
     PeGrid = new PeTable(/*CkNumPes()*/NumPes);
     
-    oneplane = new int[NPLANES * ROWLEN];
-    zline = new int[NPLANES];
+    nplanes = (int)ceil(((double)NumPes) / (ROWLEN * COLLEN));
+
+    oneplane = new int*[COLLEN];
+    psize = new int[COLLEN];
+    for(int count = 0; count < COLLEN; count ++) {
+        oneplane[count] = new int[nplanes * ROWLEN];
+
+        int idx = 0;
+        
+        for (int j=0;j< ROWLEN;j++) 
+            for(int k = 0; k < nplanes; k++) {
+                int dest = count * ROWLEN + j + ROWLEN * COLLEN * k;
+                if(dest < NumPes) {
+                    oneplane[count][idx++] = dest;
+                }
+                else break;
+            }
+        psize[count] = idx;
+    }
+
+    zline = new int[nplanes];
     
     InitVars();
     ComlibPrintf("%d:%d:COLLEN=%d, ROWLEN=%d, recvexpected=%d,%d\n", CkMyPe(), MyPe, COLLEN, ROWLEN, recvExpected[0], recvExpected[1]);
@@ -160,6 +178,9 @@ D3GridRouter::~D3GridRouter()
 {
     delete PeGrid;
     delete[] zline;
+    for(int count = 0; count < COLLEN; count ++)
+        delete[] oneplane[count];
+    
     delete[] oneplane;
 }
 
@@ -220,21 +241,6 @@ void D3GridRouter::EachToManyMulticast(comID id, int size, void *msg, int numpes
             nextpe=nextrowrep+mm;
         }
         
-        int nplanes = (int)ceil(((double)NumPes) / (ROWLEN * COLLEN));
-        int idx = 0;
-        
-        //ComlibPrintf("%d->%d:(", MyPe, nextpe);
-        for (int j=0;j< ROWLEN;j++) 
-            for(int k = 0; k < nplanes; k++) {
-                int dest = i * ROWLEN + j + ROWLEN * COLLEN * k;
-                if(dest < NumPes) {
-                    oneplane[idx++] = dest;
-                    //ComlibPrintf("%d,", oneplane[idx-1]);
-                }
-                else break;
-            }
-        //ComlibPrintf(")\n");
-        
         if (nextpe == MyPe) {
             ComlibPrintf("%d calling recv directly\n", MyPe);
             recvCount[0]++;
@@ -246,7 +252,7 @@ void D3GridRouter::EachToManyMulticast(comID id, int size, void *msg, int numpes
         
         gmap(nextpe);
         ComlibPrintf("sending to column %d and dest %d in %d\n", i, nextpe, CkMyPe());
-        GRIDSENDFN(id, 0, 0, idx, oneplane, CkpvAccess(RecvHandle), nextpe); 
+        GRIDSENDFN(id, 0, 0, psize[i], oneplane[i],CkpvAccess(RecvHandle), nextpe); 
     }
 }
 
@@ -281,7 +287,6 @@ void D3GridRouter::RecvManyMsg(comID id, char *msg)
             }
 
             int *pelist = zline;
-            int nplanes = (int)ceil(((double)NumPes) / (ROWLEN * COLLEN));
             int k = 0;
             
             //ComlibPrintf("recv:myrow = %d, nplanes = %d\n", myrow, nplanes);
@@ -307,7 +312,6 @@ void D3GridRouter::RecvManyMsg(comID id, char *msg)
     
     if((recvCount[1] == recvExpected[1]) && (routerStage == 1)){
         routerStage = 2;
-        int nplanes = (int)ceil(((double)NumPes) / (ROWLEN * COLLEN));
         for (int k=0; k < nplanes; k++) {
             int nextpe = (MyPe % (ROWLEN * COLLEN)) + k * ROWLEN * COLLEN;
 
index f4d6ad560f2ff09a3c5a886d0ba0c93063a7789f..1ad2324602e9e2b7186fea4e5bd60b09b4846bb9 100644 (file)
@@ -18,13 +18,15 @@ class D3GridRouter : public Router
 {
   private:
        PeTable *PeGrid;
-       int *oneplane, *zline, *gpes;
+       int **oneplane, *psize, *zline, *gpes;
        int MyPe, NumPes, COLLEN, nPlanes;
        int LPMsgCount, LPMsgExpected;
        int recvExpected[2], recvCount[2];
         int routerStage;
        void InitVars();
        void LocalProcMsg(comID id);
+        int nplanes;
+
   public:
        D3GridRouter(int, int);
        ~D3GridRouter();
index 05cac64279c2e0b291c5e7c3d8f116710d422913..eb0b72acd130c4b9046bd95cec2ffccaa86d87d2 100644 (file)
@@ -29,12 +29,11 @@ enum{BCAST=0,TREE, GRID, HCUBE};
 #define USE_GRID 5            //Virtual topology is a 3d grid
 #define USE_LINEAR 6          //Virtual topology is a linear array
 
-#define IS_MULTICAST -1
+#define IS_BROADCAST -1
+#define IS_SECTION_MULTICAST -2
 
 #define MAXNUMMSGS 1000
-#define MSGSIZETHRESHOLD 5000000
-#define MAXBUFSIZE 65536
-#define PERSISTENT_BUFSIZE 131072
+
 
 typedef struct {
     int refno;
index 1b6b86e94e3888b8d3fbbbfb05ac843a51ec0ccf..ddf080093b406e4e8baca8735e49ac4b01740cfc 100644 (file)
 
 int comm_debug;
 
-CkpvDeclare(ConvComlibManager *, conv_comm_ptr);
+CkpvDeclare(ConvComlibManager *, conv_com_ptr);
 CkpvDeclare(int, RecvdummyHandle);
 
 
-ConvComlibManager::ConvComlibManager(): strategyTable(10){
+ConvComlibManager::ConvComlibManager(): strategyTable(MAX_NUM_STRATS){
     nstrats = 0;
 }
 
 void ConvComlibManager::insertStrategy(Strategy *s) {
+
+    if(nstrats >= MAX_NUM_STRATS)
+        CkAbort("Too Many strategies\n");
+    
     StrategyTableEntry &st = strategyTable[nstrats];
+    
+    if(st.strategy != NULL)
+        delete st.strategy;
+
     st.strategy = s;
 
     s->setInstance(nstrats);
+    
     // if the strategy is pure converse or pure charm the following line is a
     // duplication, but if a charm strategy embed a converse strategy it is
     // necessary to set the instanceID in both
@@ -36,9 +45,16 @@ void ConvComlibManager::insertStrategy(Strategy *s) {
 
 void ConvComlibManager::insertStrategy(Strategy *s, int loc) {
 
+    if(loc >= MAX_NUM_STRATS)
+        CkAbort("Too Many strategies\n");
+
     //For now allow insertion of any location    
     StrategyTableEntry &st = strategyTable[loc];
 
+    //Check to check for the case where the old strategy is not re inserted 
+    if(st.strategy != NULL && st.strategy != s)
+        delete st.strategy;
+    
     st.strategy = s;
 }
 
@@ -51,12 +67,17 @@ void recv_dummy(void *msg){
 extern void propagate_handler(void *);
 extern void propagate_handler_frag(void *);
 
-//An initialization routine which does preliminary initialization of the 
-//Converse commlib manager. Currently also initialized krishnans code
+//An initialization routine which does prelimnary initialization of the 
+//Converse commlib manager. 
 void initComlibManager(){ 
-    CkpvInitialize(ConvComlibManager *, conv_comm_ptr);
+    if(!CpvInitialized(conv_com_ptr))
+        CkpvInitialize(ConvComlibManager *, conv_com_ptr);
+
+    if(CkpvAccess(conv_com_ptr) != 0)
+       return;   
     ConvComlibManager *conv_com = new ConvComlibManager();
-    CkpvAccess(conv_comm_ptr) = conv_com;
+    CkpvAccess(conv_com_ptr) = conv_com;
     
     //comm_debug = 1;
     ComlibPrintf("Init Call\n");
@@ -74,18 +95,18 @@ void initComlibManager(){
     PUPable_reg(RouterStrategy);
     PUPable_reg(MessageHolder);
 }
+
 Strategy *ConvComlibGetStrategy(int loc) {
     //Calling converse strategy lets Charm++ strategies one strategy
     //table entry but multiple layers of strategies (Charm on top of Converse).
-    return (CkpvAccess(conv_comm_ptr))->getStrategy(loc)->getConverseStrategy();
+    return (CkpvAccess(conv_com_ptr))->getStrategy(loc)->getConverseStrategy();
 }
 
 void ConvComlibRegisterStrategy(Strategy *s) {
-    (CkpvAccess(conv_comm_ptr))->insertStrategy(s);    
+    (CkpvAccess(conv_com_ptr))->insertStrategy(s);    
 }
 
 void ConvComlibScheduleDoneInserting(int loc) {
-    (* (CkpvAccess(conv_comm_ptr))->getStrategyTable())[loc].
+    (* (CkpvAccess(conv_com_ptr))->getStrategyTable())[loc].
         call_doneInserting++;
 }
index 7436ec39ff1cb7901edfa85a1c05a38edcd199a1..ffd517761fb60af88d66a149dde2d3084cd4afed 100644 (file)
 #include "comlib.h"
 #include <convcomlibstrategy.h>
 
-class ConvComlibManager {
+#define MAX_NUM_STRATS 128
 
+class ConvComlibManager {
+    
     StrategyTable strategyTable;
-    int nstrats;
 
  public:
+    int nstrats;
 
     ConvComlibManager();
     void insertStrategy(Strategy *s);
index 33ec4f16f33ed181e53beb77e329b6605ccef15f..f07b0a9f6f99984d033cefe68bb8558e6851a8f2 100644 (file)
@@ -26,6 +26,7 @@ void Strategy::pup(PUP::er &p){
     p | isStrategyBracketed;
     p | type;
     p | destinationHandler;
+    p | myInstanceID;
 
     if (p.isUnpacking()) {
       converseStrategy = this;
@@ -64,6 +65,8 @@ void StrategyWrapper::pup (PUP::er &p) {
     //CkPrintf("In PUP of StrategyWrapper\n");
 
     p | nstrats;
+    p | total_nstrats;
+
     if(p.isUnpacking())
        s_table = new Strategy * [nstrats];
     
@@ -83,6 +86,17 @@ StrategyTableEntry::StrategyTableEntry() {
     call_doneInserting = 0;
 }
 
+//called during learning, when all fields except
+//strategy need to be zeroed out
+void StrategyTableEntry::reset() {
+    numElements = 0;   //used by the array listener, 
+                       //could also be used for other objects
+    elementCount = 0;  //Count of how many elements have deposited
+                       //their data
+    nEndItr = 0;       //#elements that called end iteration
+    call_doneInserting = 0;
+}
+
 
 PUPable_def(Strategy);
 PUPable_def(MessageHolder);
index e901aa60ea8154bded9a9f1a21b28b488a62ff33..6bf78f63e92420f3c8d9e2443cc08fa3df5c2fe8 100644 (file)
@@ -148,6 +148,7 @@ class StrategyWrapper  {
  public:
     Strategy **s_table;
     int nstrats;
+    int total_nstrats;
 
     void pup(PUP::er &p);
 };
@@ -174,8 +175,11 @@ struct StrategyTableEntry {
     //programs.
     int nEndItr;       //#elements that called end iteration
     int call_doneInserting; //All elements deposited their data
-
+    int flag;          //status of the strategy, 
+                       //whether it is new, learned,or returned unchanged 
     StrategyTableEntry();
+
+    void reset();
 };
 
 typedef CkVec<StrategyTableEntry> StrategyTable;
index efa8a0a4d0172a612d980cb9c965076c346ca722..70b16fca066ff9c3a04b0e48fb9a4d0fe427468e 100644 (file)
@@ -107,7 +107,7 @@ DimexRouter::DimexRouter(int n, int me, int ndirect)
 
   //Create the message array, buffer and the next stage table
   buffer=new int[Dim+1];
-  next=(int **)CmiAlloc(sizeof(int *)*Dim);
+  next= new int* [Dim];
   for (i=0;i<Dim;i++) {
        next[i]=new int[NumPes];
        buffer[i]=0;
@@ -142,6 +142,7 @@ DimexRouter :: ~DimexRouter()
        delete next[i];
   }
   delete next;
+  delete penum;
 }
 
 void DimexRouter :: SetMap(int *pes)
index 3b7c13894f07c58a43f305125373b30d64422952..96939887d8abe1f68943fa5e6ce78d9fd74ec0e9 100644 (file)
@@ -133,7 +133,12 @@ GridRouter::~GridRouter()
   delete PeMesh1;
   delete PeMesh2;
     
+  delete [] growVector;
+  delete [] gcolVector;
+
   CmiFree(onerow);
+  CmiFree(rowVector);
+  CmiFree(colVector);
 }
 
 void GridRouter :: InitVars()
index f20296e2cbb54ac152e2b52afca99bf2937c9bd7..3bdd3069d7235c7422a383029356d9f5c1db8663 100644 (file)
@@ -232,10 +232,11 @@ char * PeTable ::ExtractAndPack(comID id, int ufield, int npe,
 {
     char *junk;
     int nummsgs, offset, num_distinctmsgs;
-    
-    ComlibPrintf("In ExtractAndPack %d\n", npe); 
-    
+        
     int tot_msgsize=TotalMsgSize(npe, pelist, &nummsgs, &num_distinctmsgs);
+
+    ComlibPrintf("%d In ExtractAndPack %d, %d\n", CmiMyPe(), npe, nummsgs); 
+
     if (tot_msgsize ==0) {
        *length=0;
         
@@ -263,7 +264,7 @@ char * PeTable ::ExtractAndPack(comID id, int ufield, int npe,
     PACK(int, refno);
     PACK(comID, id);
     PACK(int, ufield);
-    PACK(int , npe);
+    PACK(int, npe);
     
     int lesspe=0;
     int npacked = 0;
@@ -273,13 +274,14 @@ char * PeTable ::ExtractAndPack(comID id, int ufield, int npe,
         if (msgnum[index]<=0) {
             lesspe++;
             
-            ComlibPrintf("msgnum[index]<=0 !!!!!\n");
+            ComlibPrintf("[%d] msgnum[index]<=0 !!!!!\n", CkMyPe());
             continue;
         }
         
         ComlibPrintf("%d Packing pelist[%d]\n", CkMyPe(), index);
         register int newval=-1*pelist[i];
-        PACK(int,newval); 
+        PACK(int, newval); 
+
         for (j=0;j<msgnum[index];j++) {
             if (PeList[index][j]->magic == magic) {
                 offset=(PeList[index][j]->offset);
@@ -302,7 +304,7 @@ char * PeTable ::ExtractAndPack(comID id, int ufield, int npe,
             }
             
             //ComlibPrintf("%d Packing msg_offset=%d\n", CkMyPe(), offset);
-            PACK(int,offset); 
+            PACK(int, offset); 
 
             if (--(PeList[index][j]->refCount) <=0) {
                 CmiFree(PeList[index][j]->msg);
index 429d286b1ed3e20f953000a63a322be78bbb5299..88d08b99ea78e3396526875041d195d9c324ada9 100644 (file)
@@ -100,14 +100,32 @@ RouterStrategy::RouterStrategy(int stratid, int handle, int _npes,
     routerID = stratid;
 
     npes = _npes;
-    pelist = new int[npes];
-    procMap = new int[CkNumPes()];
-    
-    memcpy(pelist, _pelist, sizeof(int) * npes);    
+    //pelist = new int[npes];
+    pelist = _pelist;
+    //memcpy(pelist, _pelist, sizeof(int) * npes);    
+
+    procMap = new int[CkNumPes()];    
     setReverseMap();
 
+    bcast_pemap = NULL;
+
     ComlibPrintf("Router Strategy : %d, MYPE = %d, NUMPES = %d \n", stratid, 
-           myPe, npes);
+                 myPe, npes);
+
+    if(myPe < 0) {
+        //I am not part of this strategy
+
+        doneFlag = 0;
+        router = NULL;
+        bufferedDoneInserting = 0;
+        return;        
+    }
+
+    //Start with all iterations done
+    doneFlag = 1;
+    
+    //No Buffered doneInserting at the begining
+    bufferedDoneInserting = 0;
 
     switch(stratid) {
     case USE_TREE: 
@@ -138,19 +156,29 @@ RouterStrategy::RouterStrategy(int stratid, int handle, int _npes,
         router->setDoneHandle(myDoneHandle);
         //router->SetID(id);
     }
+}
 
-    //Start with all iterations done
-    doneFlag = 1;
 
-    //No Buffered doneInserting at the begining
-    bufferedDoneInserting = 0;
+RouterStrategy::~RouterStrategy() {
+    //delete [] pelist;
+
+    if(bcast_pemap)
+        delete [] bcast_pemap;
+    
+    delete [] procMap;
+    if(router)
+        delete router;
 }
 
+
 void RouterStrategy::insertMessage(MessageHolder *cmsg){
 
+    if(myPe < 0)
+        CmiAbort("insertMessage: mype < 0\n");
+
     int count = 0;
     if(routerID == USE_DIRECT) {
-        if(cmsg->dest_proc == IS_MULTICAST) {
+        if(cmsg->dest_proc == IS_BROADCAST) {
             for(count = 0; count < cmsg->npes-1; count ++)
                 CmiSyncSend(cmsg->pelist[count], cmsg->size, 
                             cmsg->getMessage());
@@ -164,14 +192,21 @@ void RouterStrategy::insertMessage(MessageHolder *cmsg){
         delete cmsg;
     }
     else {
-        if(cmsg->dest_proc != IS_MULTICAST) {
+        if(cmsg->dest_proc >= 0) {
             cmsg->pelist = &procMap[cmsg->dest_proc];
             cmsg->npes = 1;
         }
-        else {
-            for(count = 0; count < cmsg->npes; count ++) {
-                cmsg->pelist[count] = procMap[cmsg->pelist[count]];
+        else if (cmsg->dest_proc == IS_BROADCAST){
+
+            if(bcast_pemap == NULL) {
+                bcast_pemap = new int[npes];
+                for(count = 0; count < npes; count ++) {
+                    bcast_pemap[count] = count;
+                }
             }
+
+            cmsg->pelist = bcast_pemap;
+            cmsg->npes = npes;
         }
         
         msgQ.push(cmsg);
@@ -180,14 +215,13 @@ void RouterStrategy::insertMessage(MessageHolder *cmsg){
 
 void RouterStrategy::doneInserting(){
     
-    id.instanceID = getInstance();
+    if(myPe < 0)
+        CmiAbort("insertMessage: mype < 0\n");
 
-    ComlibPrintf("Instance ID = %d\n", getInstance());
-
-    if(routerID == USE_DIRECT)
-        return;
+    id.instanceID = getInstance();
 
-    ComlibPrintf("%d: DoneInserting \n", CkMyPe());
+    //ComlibPrintf("Instance ID = %d\n", getInstance());
+    ComlibPrintf("%d: DoneInserting %d \n", CkMyPe(), msgQ.length());
     
     if(doneFlag == 0) {
         ComlibPrintf("%d:Waiting for previous iteration to Finish\n", 
@@ -196,6 +230,15 @@ void RouterStrategy::doneInserting(){
         return;
     }
     
+    if(routerID == USE_DIRECT) {
+        DummyMsg *m = (DummyMsg *)CmiAlloc(sizeof(DummyMsg));
+        memset((char *)m, 0, sizeof(DummyMsg)); 
+        m->id.instanceID = getInstance();
+        
+        Done(m);
+        return;
+    }
+
     doneFlag = 0;
     bufferedDoneInserting = 0;
 
@@ -218,7 +261,8 @@ void RouterStrategy::doneInserting(){
         msgQ.push(cmsg);
     }
 
-    /*
+    /*  // OLDER version which called an extra virtual method for each
+        //message 
       int numToDeposit = msgQ.length();
       
       while(!msgQ.isEmpty()) {
@@ -230,7 +274,7 @@ void RouterStrategy::doneInserting(){
       //order of relative processors numbering and NOT absolute
       //processor numbering
       
-      if(cmsg->dest_proc == IS_MULTICAST) {  
+      if(cmsg->dest_proc == IS_BROADCAST) {  
       router->EachToManyMulticast(id, cmsg->size, msg, cmsg->npes, 
       cmsg->pelist, 
       numToDeposit > 1);
index 8bf4896e79c15fcc787e31b75f726bd7adc7ebc2..c477046d11df9604bc1c4e6c8d152acf55ffbb06 100644 (file)
@@ -27,6 +27,7 @@ class RouterStrategy : public Strategy {
     int *pelist;
     int npes;
     int *procMap;
+    int *bcast_pemap;
     int myPe;
     int routerID;
 
@@ -45,6 +46,8 @@ class RouterStrategy : public Strategy {
     //pelist = list of processors
     RouterStrategy(int stratid, int handle, int npes, int *pelist);
     RouterStrategy(CkMigrateMessage *m): Strategy(m){}
+    
+    ~RouterStrategy();
 
     //Insert messages
     void insertMessage(MessageHolder *msg);