Merge cleanup fixes before static array optimizations
[charm.git] / src / conv-com / treerouter.C
index 8ca73f1990c8657d9eb6640e5d4ac1848a667e8c..02a5a5b2daafc8b2876dd83b452868714877ce19 100644 (file)
@@ -5,20 +5,30 @@
  * $Revision$
  *****************************************************************************/
 
-/**************************************
- * File: treerouter.C
- *
- * Author: Krishnan V
- *
- * Tree based router
- *********************************************/
+/**
+   @addtogroup ConvComlibRouter
+   @{
+   @file 
+   @brief  Tree based converse level routing strategy 
+*/
+
 #include "treerouter.h"
 #define DEGREE 4
 #define gmap(pe) (gpes ? gpes[pe] : pe)
 
 
-/**The only communication op used. Modify this to use
- ** vector send */
+/**The only communication op used. Modify this to use vector send. */
+#if CMK_COMLIB_USE_VECTORIZE
+#define TREESENDFN(kid, u, knewmsg, khndl, knextpe)  \
+       {if (knewmsg) {\
+         CmiSetHandler(knewmsg->msgs[0], khndl);\
+         CmiSyncVectorSendAndFree(knextpe, -knewmsg->count, knewmsg->sizes, knewmsg->msgs);\
+       }\
+       else {\
+         SendDummyMsg(kid, knextpe, u);\
+       }\
+}
+#else
 #define TREESENDFN(kid, u, knewmsg, klen, khndl, knextpe)  \
        {if (knewmsg) {\
          CmiSetHandler(knewmsg, khndl);\
          SendDummyMsg(kid, knextpe, u);\
        }\
 }
+#endif
 
-/************************************************
- ************************************************/
-TreeRouter :: TreeRouter(int n, int me)
+
+
+
+TreeRouter :: TreeRouter(int n, int me, Strategy *parent) : Router(parent)
 {
   int i;
   MyPe=me;
@@ -97,9 +109,13 @@ void TreeRouter :: RecvManyMsg(comID id, char *msg)
                int len;
                int parent=(MyPe-1)/DEGREE;
                parent=gmap(parent);
+#if CMK_COMLIB_USE_VECTORIZE
+               PTvectorlist newmsg=SortBufferUp(id, 0);
+               TREESENDFN(id, 0, newmsg, CkpvAccess(RouterRecvHandle), parent);
+#else
                char *newmsg=SortBufferUp(id, 0, &len);
-               TREESENDFN(id, 0, newmsg, len, CkpvAccess(RecvHandle), parent);
-
+               TREESENDFN(id, 0, newmsg, len, CkpvAccess(RouterRecvHandle), parent);
+#endif
        }
        else {
                DownStreamMsg(id);
@@ -108,7 +124,11 @@ void TreeRouter :: RecvManyMsg(comID id, char *msg)
   if (recvCount > recvExpected) DownStreamMsg(id);
 }
 
+#if CMK_COMLIB_USE_VECTORIZE
+PTvectorlist TreeRouter :: SortBufferUp(comID id, int ufield)
+#else
 char * TreeRouter :: SortBufferUp(comID id, int ufield, int *len)
+#endif
 {
   int np=0, i;
   int * pelst=(int *)CmiAlloc(sizeof(int)*NumPes);
@@ -122,12 +142,20 @@ char * TreeRouter :: SortBufferUp(comID id, int ufield, int *len)
 
        pelst[np++]=i;
   }
+#if CMK_COMLIB_USE_VECTORIZE
+  PTvectorlist newmsg=PeTree->ExtractAndVectorize(id, ufield, np, pelst); 
+#else
   char *newmsg=PeTree->ExtractAndPack(id, ufield, np, pelst, len); 
+#endif
   CmiFree(pelst);
   return(newmsg);
 }
   
+#if CMK_COMLIB_USE_VECTORIZE
+PTvectorlist TreeRouter :: SortBufferDown(comID id, int ufield, int s)
+#else
 char * TreeRouter :: SortBufferDown(comID id, int ufield, int *len, int s)
+#endif
 {
   int np=0, i;
   int * plist=(int *)CmiAlloc(sizeof(int)*NumPes);
@@ -140,7 +168,11 @@ char * TreeRouter :: SortBufferDown(comID id, int ufield, int *len, int s)
        if (pe == rep) plist[np++]=i;
   }
 
+#if CMK_COMLIB_USE_VECTORIZE
+  PTvectorlist newmsg=PeTree->ExtractAndVectorize(id, ufield, np, plist); 
+#else
   char * newmsg=PeTree->ExtractAndPack(id, ufield, np, plist, len); 
+#endif
   CmiFree(plist);
   return(newmsg);
 }
@@ -152,11 +184,19 @@ void TreeRouter :: DownStreamMsg(comID id)
 
   for (int i=0;i<deg;i++) {
     int len;
+#if CMK_COMLIB_USE_VECTORIZE
+    PTvectorlist newmsg=SortBufferDown(id, 0, i+1);
+#else
     char *newmsg=SortBufferDown(id, 0, &len, i+1);
+#endif
     int child=MyPe*DEGREE+i+1;
     if (child >=NumPes || child==MyPe) break;
     child=gmap(child);
-    TREESENDFN(id, 0, newmsg, len, CkpvAccess(RecvHandle), child);
+#if CMK_COMLIB_USE_VECTORIZE
+    TREESENDFN(id, 0, newmsg, CkpvAccess(RouterRecvHandle), child);
+#else
+    TREESENDFN(id, 0, newmsg, len, CkpvAccess(RouterRecvHandle), child);
+#endif
   }
 
   LocalProcMsg(id);
@@ -170,7 +210,7 @@ void TreeRouter :: ProcManyMsg(comID id, char *m)
 
 void TreeRouter:: LocalProcMsg(comID id)
 {
-  PeTree->ExtractAndDeliverLocalMsgs(MyPe);
+  PeTree->ExtractAndDeliverLocalMsgs(MyPe, container);
   PeTree->Purge();
   InitVars();
   Done(id);
@@ -181,9 +221,9 @@ void TreeRouter :: DummyEP(comID id, int)
   RecvManyMsg(id, NULL);
 }
 
-Router * newtreeobject(int n, int me)
+Router * newtreeobject(int n, int me, Strategy *strat)
 {
-  Router * obj=new TreeRouter(n, me);
+  Router * obj=new TreeRouter(n, me, strat);
   return(obj);
 }
 
@@ -191,3 +231,6 @@ void TreeRouter :: SetMap(int *pes)
 {
   gpes=pes;
 }
+
+
+/*@}*/