removing one level of virtual functions. May make code run faster
authorSameer Kumar <skumar2@uiuc.edu>
Thu, 23 Sep 2004 05:14:02 +0000 (05:14 +0000)
committerSameer Kumar <skumar2@uiuc.edu>
Thu, 23 Sep 2004 05:14:02 +0000 (05:14 +0000)
src/conv-com/de.C
src/conv-com/de.h
src/conv-com/gridrouter.C
src/conv-com/gridrouter.h
src/conv-com/router.h
src/conv-com/routerstrategy.C
src/conv-com/routerstrategy.h

index a553b98a92513c6ba0d8182f340eb57c2bb7c729..efa8a0a4d0172a612d980cb9c965076c346ca722 100644 (file)
@@ -181,7 +181,27 @@ void DimexRouter::EachToManyMulticast(comID id, int size, void *msg, int numpes,
     }
     
     if (more) return;
+    start_hcube(id);
+}
+
+void DimexRouter::EachToManyMulticastQ(comID id, CkQ<MessageHolder *> &msgq) {
+    SetID(id);
+
+    int count = 0;
+    int length = msgq.length();
+
+    for(count = 0; count < length; count ++) {
+        MessageHolder *mhdl = msgq.deq();
+        PeHcube->InsertMsgs(mhdl->npes, mhdl->pelist, mhdl->size, 
+                            mhdl->getMessage());
+        delete mhdl;
+    }
     
+    start_hcube(id);
+}
+
+void DimexRouter::start_hcube(comID id) {
+
     if (InitCounter <0) {
         ComlibPrintf("%d Sending to the lower hypercube\n", MyPe);
        int nextpe=neighbor(MyPe, Dim);
index b37c1f1de692245bf9661881ed642f919051be87..8e6646f60a10ab05efd330955356243eea22b752 100644 (file)
 //Dimensional Exchange (Hypercube) based router
 class DimexRouter : public Router
 {
-  private:
-       PeTable *PeHcube, *PeHcube1;
-       int *buffer;
-       int* msgnum, InitCounter;
-       int *penum,*gpes;
-       int **next;
-       int Dim, stage, MyPe, NumPes, numDirectSteps, two_pow_ndirect;
-        int procMsgCount;
-       void InitVars();
-       void CreateStageTable(int, int *);
-       void LocalProcMsg(comID id);
-  public:
-        
-       DimexRouter(int, int, int ndirect = 0);
-       ~DimexRouter();
-       void NumDeposits(comID, int);
-       void EachToAllMulticast(comID , int , void *, int);
-       void EachToManyMulticast(comID , int , void *, int, int *, int);
-       void ProcMsg(int, msgstruct **) {;}
-       void RecvManyMsg(comID, char *);
-       void ProcManyMsg(comID, char *);
-       void DummyEP(comID id, int);
-       void SetMap(int *);
-
-        //FIX this, some initialization done here
-       void SetID(comID id);
+ private:
+    PeTable *PeHcube, *PeHcube1;
+    int *buffer;
+    int* msgnum, InitCounter;
+    int *penum,*gpes;
+    int **next;
+    int Dim, stage, MyPe, NumPes, numDirectSteps, two_pow_ndirect;
+    int procMsgCount;
+    void InitVars();
+    void CreateStageTable(int, int *);
+    void LocalProcMsg(comID id);
+    void start_hcube(comID id);
+    
+ public:
+    
+    DimexRouter(int, int, int ndirect = 0);
+    ~DimexRouter();
+    void NumDeposits(comID, int);
+    void EachToAllMulticast(comID , int , void *, int);
+    void EachToManyMulticast(comID , int , void *, int, int *, int);
+    void EachToManyMulticastQ(comID id, CkQ<MessageHolder *> &msgq);
+    
+    void ProcMsg(int, msgstruct **) {;}
+    void RecvManyMsg(comID, char *);
+    void ProcManyMsg(comID, char *);
+    void DummyEP(comID id, int);
+    void SetMap(int *);
+    
+    //FIX this, some initialization done here
+    void SetID(comID id);
 };
 #endif
index 4a92aa95bf3ab0d97a718f80397cf8bca18d57bf..3b7c13894f07c58a43f305125373b30d64422952 100644 (file)
@@ -158,8 +158,6 @@ extern void CmiReference(void *blk);
 
 void GridRouter::EachToManyMulticast(comID id, int size, void *msg, int numpes, int *destpes, int more)
 {
-  int i=0;
-  
   if(id.isAllToAll)
       PeMesh->InsertMsgs(1, &MyPe, size, msg);
   else
@@ -168,47 +166,78 @@ void GridRouter::EachToManyMulticast(comID id, int size, void *msg, int numpes,
   if (more) return;
 
   ComlibPrintf("All messages received %d %d %d\n", MyPe, COLLEN,id.isAllToAll);
+  sendRow(id);
+}
 
-  char *a2amsg = NULL;
-  int a2a_len;
-  if(id.isAllToAll) {
-      ComlibPrintf("ALL to ALL flag set\n");
-
-      a2amsg = PeMesh->ExtractAndPackAll(id, 0, &a2a_len);
-      CmiSetHandler(a2amsg, CkpvAccess(RecvHandle));
-      CmiReference(a2amsg);
-      CmiSyncListSendAndFree(rvecSize, growVector, a2a_len, a2amsg);      
-      RecvManyMsg(id, a2amsg);
-      return;
-  }
-
-  //Send the messages
-  //int MYROW  =MyPe/COLLEN;
-  //int MYCOL = MyPe%COLLEN;
-  int myrep= myrow*COLLEN; 
-  int maxlength = (NumPes - 1)/COLLEN + 1;
+void GridRouter::EachToManyMulticastQ(comID id, CkQ<MessageHolder *> &msgq) {
+   
+    ComlibPrintf("Grid Router :: EachToManyQ\n");
+    int count = 0;
+    int length = msgq.length();
+    if(id.isAllToAll) {
+        for(count = 0; count < length; count ++) {
+            MessageHolder *mhdl = msgq.deq();
+            PeMesh->InsertMsgs(1, &MyPe, mhdl->size, mhdl->getMessage());
+            delete mhdl;
+        }
+    }
+    else {
+        for(count = 0; count < length; count ++) {
+            MessageHolder *mhdl = msgq.deq();
+            PeMesh->InsertMsgs(mhdl->npes, mhdl->pelist, mhdl->size, 
+                               mhdl->getMessage());
+            delete mhdl;
+        }
+    }
+    
+    sendRow(id);
+}
 
-  for (int colcount = 0; colcount < rvecSize; ++colcount) {
-      int nextpe = rowVector[colcount];
-      i = nextpe % COLLEN;
 
-      int length = maxlength;
-      if((length - 1)* COLLEN + i >= NumPes)
-          length --;
-      
-      for (int j = 0; j < length; j++) {
-          onerow[j]=j * COLLEN + i;
-      }
-      
-      ComlibPrintf("%d: before gmap sending to %d of column %d for %d procs,  %d,%d,%d,%d\n",
-                   MyPe, nextpe, i, length, onerow[0], onerow[1], onerow[2], onerow[3]);
+void GridRouter::sendRow(comID id) {
 
-      gmap(nextpe);
-
-      GRIDSENDFN(id, 0, 0,length, onerow, CkpvAccess(RecvHandle), nextpe); 
-      ComlibPrintf("%d:sending to %d of column %d\n", MyPe, nextpe, i);
-  }
-  RecvManyMsg(id, NULL);
+    int i=0;
+    char *a2amsg = NULL;
+    int a2a_len;
+    if(id.isAllToAll) {
+        ComlibPrintf("ALL to ALL flag set\n");
+        
+        a2amsg = PeMesh->ExtractAndPackAll(id, 0, &a2a_len);
+        CmiSetHandler(a2amsg, CkpvAccess(RecvHandle));
+        CmiReference(a2amsg);
+        CmiSyncListSendAndFree(rvecSize, growVector, a2a_len, a2amsg);      
+        RecvManyMsg(id, a2amsg);
+        return;
+    }
+    
+    //Send the messages
+    //int MYROW  =MyPe/COLLEN;
+    //int MYCOL = MyPe%COLLEN;
+    int myrep= myrow*COLLEN; 
+    int maxlength = (NumPes - 1)/COLLEN + 1;
+    
+    for (int colcount = 0; colcount < rvecSize; ++colcount) {
+        int nextpe = rowVector[colcount];
+        i = nextpe % COLLEN;
+        
+        int length = maxlength;
+        if((length - 1)* COLLEN + i >= NumPes)
+            length --;
+        
+        for (int j = 0; j < length; j++) {
+            onerow[j]=j * COLLEN + i;
+        }
+        
+        ComlibPrintf("%d: before gmap sending to %d of column %d for %d procs,  %d,%d,%d,%d\n",
+                     MyPe, nextpe, i, length, onerow[0], onerow[1], onerow[2], onerow[3]);
+        
+        gmap(nextpe);
+        
+        GRIDSENDFN(id, 0, 0,length, onerow, CkpvAccess(RecvHandle), nextpe); 
+        ComlibPrintf("%d:sending to %d of column %d\n", MyPe, nextpe, i);
+    }
+    RecvManyMsg(id, NULL);
 }
 
 void GridRouter::RecvManyMsg(comID id, char *msg)
index d475bd76f9f46b62861600402651545fe8bbbf67..dc79bc14f458cd13c9726526fda9c4abe63f7a30 100644 (file)
@@ -41,35 +41,35 @@ inline int Expect(int pe, int npes)
 //Grid based router
 class GridRouter : public Router
 {
 private:
-       PeTable *PeMesh, *PeMesh1, *PeMesh2;
-        int *onerow, *gpes, 
-            *rowVector, *colVector, 
-            *growVector, *gcolVector;
+ private:
+    PeTable *PeMesh, *PeMesh1, *PeMesh2;
+    int *onerow, *gpes, 
+        *rowVector, *colVector, 
+        *growVector, *gcolVector;
 
-        int myrow, mycol;
-        int rvecSize, cvecSize;
-       int MyPe, NumPes, COLLEN;
-       int LPMsgCount, LPMsgExpected;
-       int recvExpected, recvCount;
-       void InitVars();
-       void LocalProcMsg(comID id);
-#if CMK_PERSISTENT_COMM
-       PersistentHandle *rowHandleArray, *columnHandleArray;
-        PersistentHandle *rowHandleArrayEven, *columnHandleArrayEven;
-#endif          
-
-  public:
-       GridRouter(int, int);
-       ~GridRouter();
-       void NumDeposits(comID, int);
-       void EachToAllMulticast(comID , int , void *, int);
-       void EachToManyMulticast(comID , int , void *, int, int *, int);
-       void RecvManyMsg(comID, char *);
-       void ProcManyMsg(comID, char *);
-       void DummyEP(comID id, int);
-       void ProcMsg(int, msgstruct **) {;}
-       void SetMap(int *);
+    int myrow, mycol;
+    int rvecSize, cvecSize;
+    int MyPe, NumPes, COLLEN;
+    int LPMsgCount, LPMsgExpected;
+    int recvExpected, recvCount;
+    void InitVars();
+    void LocalProcMsg(comID id); 
+    void sendRow(comID id);
+    
+ public:
+    GridRouter(int, int);
+    ~GridRouter();
+    void NumDeposits(comID, int);
+    
+    void EachToAllMulticast(comID , int , void *, int);
+    void EachToManyMulticast(comID , int , void *, int, int *, int);
+    void EachToManyMulticastQ(comID id, CkQ<MessageHolder *> &msgq);
+       
+    void RecvManyMsg(comID, char *);
+    void ProcManyMsg(comID, char *);
+    void DummyEP(comID id, int);
+    void ProcMsg(int, msgstruct **) {;}
+    void SetMap(int *);
 };
 
 #endif
index 7eda6f07f819d21b305b93a268ce03fbd140430e..944ecb1acf44ae343243b5fe621238d2d4587b74 100644 (file)
@@ -1,6 +1,9 @@
 #ifndef ROUTER_H
 #define ROUTER_H
 
+#include "cklists.h"
+#include "convcomlibstrategy.h"
+
 //Base class for routers
 //Imported from Krishnan's Each To Many Communication Framework
 //Modified to suit the new communication library
@@ -34,6 +37,21 @@ class Router
                                      int more) 
         {CmiPrintf("Not impl\n");}
     
+    virtual void EachToManyMulticastQ(comID id, CkQ<MessageHolder *> &msgq){
+        MessageHolder *mhdl;
+        int len = msgq.length();
+        for(int count = 0; count < len - 1; count++) {
+            mhdl = msgq.deq();
+            EachToManyMulticast(id, mhdl->size, mhdl->getMessage(), 
+                                mhdl->npes, mhdl->pelist, 1);
+            delete mhdl;
+        }
+        mhdl = msgq.deq();
+        EachToManyMulticast(id, mhdl->size, mhdl->getMessage(), 
+                            mhdl->npes, mhdl->pelist, 0);
+        delete mhdl;
+    }
+
     //The first iteration of message combining should call this
     //entry function
     virtual void RecvManyMsg(comID, char *) {CmiPrintf("Not Impl\n");}
index 233ef03608e7cce0b1005716257b8ed17cc81018..429d286b1ed3e20f953000a63a322be78bbb5299 100644 (file)
@@ -148,9 +148,10 @@ RouterStrategy::RouterStrategy(int stratid, int handle, int _npes,
 
 void RouterStrategy::insertMessage(MessageHolder *cmsg){
 
+    int count = 0;
     if(routerID == USE_DIRECT) {
         if(cmsg->dest_proc == IS_MULTICAST) {
-            for(int count = 0; count < cmsg->npes-1; count ++)
+            for(count = 0; count < cmsg->npes-1; count ++)
                 CmiSyncSend(cmsg->pelist[count], cmsg->size, 
                             cmsg->getMessage());
             if(cmsg->npes > 0)
@@ -162,8 +163,19 @@ void RouterStrategy::insertMessage(MessageHolder *cmsg){
                                cmsg->getMessage());
         delete cmsg;
     }
-    else
+    else {
+        if(cmsg->dest_proc != IS_MULTICAST) {
+            cmsg->pelist = &procMap[cmsg->dest_proc];
+            cmsg->npes = 1;
+        }
+        else {
+            for(count = 0; count < cmsg->npes; count ++) {
+                cmsg->pelist[count] = procMap[cmsg->pelist[count]];
+            }
+        }
+        
         msgQ.push(cmsg);
+    }
 }
 
 void RouterStrategy::doneInserting(){
@@ -201,40 +213,46 @@ void RouterStrategy::doneInserting(){
                                                      myPe, 
                                                      sizeof(DummyMsg));
         cmsg->isDummy = 1;
+        cmsg->pelist = &myPe;
+        cmsg->npes = 1;
         msgQ.push(cmsg);
     }
 
-    int numToDeposit = msgQ.length();
+    /*
+      int numToDeposit = msgQ.length();
+      
+      while(!msgQ.isEmpty()) {
+      MessageHolder *cmsg = msgQ.deq();
+      char *msg = cmsg->getMessage();
+      
+      if(!cmsg->isDummy)  {            
+      //Assuming list of processors to multicast to is in the
+      //order of relative processors numbering and NOT absolute
+      //processor numbering
+      
+      if(cmsg->dest_proc == IS_MULTICAST) {  
+      router->EachToManyMulticast(id, cmsg->size, msg, cmsg->npes, 
+      cmsg->pelist, 
+      numToDeposit > 1);
+      }            
+      else {                                
+      
+      ComlibPrintf("%d: Insert Pers. Message to %d\n", CkMyPe(), procMap[cmsg->dest_proc]);
+      router->EachToManyMulticast(id, cmsg->size, msg, 1,
+      &procMap[cmsg->dest_proc],
+      numToDeposit > 1);
+      }            
+      }   
+      else
+      router->EachToManyMulticast(id, cmsg->size, msg, 1, &myPe, 
+      numToDeposit > 1);
+      
+      numToDeposit --;
+      delete cmsg;        
+      }
+    */
     
-    while(!msgQ.isEmpty()) {
-        MessageHolder *cmsg = msgQ.deq();
-        char *msg = cmsg->getMessage();
-        
-        if(!cmsg->isDummy)  {            
-            //Assuming list of processors to multicast to is in the
-            //order of relative processors numbering and NOT absolute
-            //processor numbering
-
-            if(cmsg->dest_proc == IS_MULTICAST) {  
-                router->EachToManyMulticast(id, cmsg->size, msg, cmsg->npes, 
-                                            cmsg->pelist, 
-                                            numToDeposit > 1);
-            }            
-            else {                                
-                
-                ComlibPrintf("%d: Insert Pers. Message to %d\n", CkMyPe(), procMap[cmsg->dest_proc]);
-                             router->EachToManyMulticast(id, cmsg->size, msg, 1,
-                                            &procMap[cmsg->dest_proc],
-                                            numToDeposit > 1);
-            }            
-        }   
-        else
-            router->EachToManyMulticast(id, cmsg->size, msg, 1, &myPe, 
-                                        numToDeposit > 1);
-        
-        numToDeposit --;
-        delete cmsg;        
-    }
+    router->EachToManyMulticastQ(id, msgQ);
 
     while(!recvQ.isEmpty()) {
         char *msg = recvQ.deq();
@@ -274,51 +292,4 @@ void RouterStrategy::Done(DummyMsg *m){
 //Implement it later while implementing checkpointing of Comlib
 void RouterStrategy::pup(PUP::er &p){}
 
-//Call the router functions
-void RouterStrategy::RecvManyMsg(char *msg) {
-
-    //comID new_id;
-    int new_refno =0;
-
-    //FOO BAR when structure of comid changes this will break !!!!!
-    ComlibPrintf("In RecvManyMsg at %d\n", CkMyPe());
-    //memcpy(&new_id,(msg+CmiReservedHeaderSize+sizeof(int)), sizeof(comID));
-    //ComlibPrintf("REFNO = %d, %d\n", new_id.refno, id.refno);
-    
-    //First int in comid is refno
-    memcpy(&new_refno, (char*) msg + CmiReservedHeaderSize + sizeof(int), 
-           sizeof(int)); 
-
-    if(new_refno != id.refno)
-        recvQ.push(msg);
-    else
-        router->RecvManyMsg(id, msg);
-}
-
-void RouterStrategy::ProcManyMsg(char *msg) {    
-
-    //comID new_id;
-    int new_refno =0;
-    ComlibPrintf("In ProcManyMsg at %d\n", CkMyPe());
-    //memcpy(&new_id,(msg+CmiReservedHeaderSize+sizeof(int)), sizeof(comID));
-    //First int in comid is refno
-    memcpy(&new_refno, (char*) msg + CmiReservedHeaderSize + sizeof(int), 
-           sizeof(int)); 
-    
-    if(new_refno != id.refno)
-        procQ.push(msg);
-    else
-        router->ProcManyMsg(id, msg);
-}
-
-void RouterStrategy::DummyEP(DummyMsg *m) {
-
-    if(id.refno != m->id.refno)
-        dummyQ.push(m);
-    else {
-        router->DummyEP(m->id, m->magic);
-        CmiFree(m);
-    }
-}
-
 PUPable_def(RouterStrategy);
index 3026917a3c1e3fcbbf7d819b6b9249d334ae2f21..8bf4896e79c15fcc787e31b75f726bd7adc7ebc2 100644 (file)
@@ -63,4 +63,53 @@ class RouterStrategy : public Strategy {
     virtual void pup(PUP::er &p);
     PUPable_decl(RouterStrategy);
 };
+
+
+//Call the router functions
+inline void RouterStrategy::RecvManyMsg(char *msg) {
+
+    //comID new_id;
+    int new_refno =0;
+
+    //FOO BAR when structure of comid changes this will break !!!!!
+    ComlibPrintf("In RecvManyMsg at %d\n", CkMyPe());
+    //memcpy(&new_id,(msg+CmiReservedHeaderSize+sizeof(int)), sizeof(comID));
+    //ComlibPrintf("REFNO = %d, %d\n", new_id.refno, id.refno);
+    
+    //First int in comid is refno
+    memcpy(&new_refno, (char*) msg + CmiReservedHeaderSize + sizeof(int), 
+           sizeof(int)); 
+
+    if(new_refno != id.refno)
+        recvQ.push(msg);
+    else
+        router->RecvManyMsg(id, msg);
+}
+
+inline void RouterStrategy::ProcManyMsg(char *msg) {    
+
+    //comID new_id;
+    int new_refno =0;
+    ComlibPrintf("In ProcManyMsg at %d\n", CkMyPe());
+    //memcpy(&new_id,(msg+CmiReservedHeaderSize+sizeof(int)), sizeof(comID));
+    //First int in comid is refno
+    memcpy(&new_refno, (char*) msg + CmiReservedHeaderSize + sizeof(int), 
+           sizeof(int)); 
+    
+    if(new_refno != id.refno)
+        procQ.push(msg);
+    else
+        router->ProcManyMsg(id, msg);
+}
+
+inline void RouterStrategy::DummyEP(DummyMsg *m) {
+
+    if(id.refno != m->id.refno)
+        dummyQ.push(m);
+    else {
+        router->DummyEP(m->id, m->magic);
+        CmiFree(m);
+    }
+}
+
 #endif