Adding sections to groups.
authorFilippo Gioachin <gioachin@illinois.edu>
Fri, 16 Oct 2009 20:12:57 +0000 (20:12 +0000)
committerFilippo Gioachin <gioachin@illinois.edu>
Fri, 16 Oct 2009 20:12:57 +0000 (20:12 +0000)
Deleted duplicated constructors for most CProxy* classes. Using default parameters instead.
Changed CProxySection* definitions to support multiple sections, i.e sections spanning more than one single array/group. Changed also the delegation framework interface to handle this. CkMulticast and Comlib have still to be updated if they want to handle multisection proxies.

src/ck-com/ComlibManager.C
src/ck-com/ComlibManager.h
src/ck-core/charm++.h
src/ck-core/charm.h
src/ck-core/ck.C
src/ck-core/ckarray.C
src/ck-core/ckarray.h
src/ck-core/cksection.h
src/libs/ck-libs/multicast/ckmulticast.C
src/libs/ck-libs/multicast/ckmulticast.h
src/xlat-i/xi-symbol.C

index c8c8bc250118cf755d29488d26dec948b520568d..135eb2921b3af300074dbe7d5f92cf3482c0ab8a 100644 (file)
@@ -1017,8 +1017,9 @@ void ComlibManager::ArrayBroadcast(CkDelegateData *pd,int ep,void *m,CkArrayID a
 }
 
 void ComlibManager::ArraySectionSend(CkDelegateData *pd,int ep, void *m, 
-               CkArrayID a, CkSectionID &s, int opts) {
+               int nsid, CkSectionID *s, int opts) {
 
+    CkAssert(nsid == 1);
        CkAssert(pd != NULL);
        ComlibDelegateData *ci = static_cast<ComlibDelegateData *>(pd);
        int instid = ci->getID();
@@ -1029,11 +1030,11 @@ void ComlibManager::ArraySectionSend(CkDelegateData *pd,int ep, void *m,
        //Provide a dummy dest proc as it does not matter for mulitcast 
        CharmMessageHolder *cmsg = new CharmMessageHolder((char *)m, IS_SECTION_MULTICAST, CMH_ARRAYSECTIONSEND);
        cmsg->npes = 0;
-       cmsg->sec_id = &s;
-       cmsg->array_id = a;
+       cmsg->sec_id = s;
+       cmsg->array_id = s->_cookie.aid;
        
 
-       msg_prepareSend_noinline((CkArrayMessage*)m, ep, a);
+       msg_prepareSend_noinline((CkArrayMessage*)m, ep, s->_cookie.aid);
        
        register envelope * env = UsrToEnv(m);
        env->getsetArrayIndex()= dummyArrayIndex;
index a4604697cd4657134fd551c9687d7f9d8b37ea0c..d68a4edc9bcbf6c9e7ef5a90c7806b35d17fd1c4 100644 (file)
@@ -316,7 +316,7 @@ class ComlibManager: public CkDelegateMgr {
     void ArrayBroadcast(CkDelegateData *pd,int ep,void *m,CkArrayID a);
     void GroupBroadcast(CkDelegateData *pd,int ep,void *m,CkGroupID g);
     void ArraySectionSend(CkDelegateData *pd, int ep ,void *m, 
-                                  CkArrayID a, CkSectionID &s, int opts);
+                                  int nsid, CkSectionID *s, int opts);
     CkDelegateData* ckCopyDelegateData(CkDelegateData *data); 
     CkDelegateData *DelegatePointerPup(PUP::er &p,CkDelegateData *pd);
 
index 5046d0760ff0f01008455c433ca402efd23d29c0..9759412e1be578dff6b83911dc04282b2b999956 100644 (file)
@@ -568,14 +568,16 @@ class CkDelegateMgr : public IrrGroup {
 
     virtual void GroupSend(CkDelegateData *pd,int ep,void *m,int onPE,CkGroupID g);
     virtual void GroupBroadcast(CkDelegateData *pd,int ep,void *m,CkGroupID g);
+    virtual void GroupSectionSend(CkDelegateData *pd,int ep,void *m,int nsid,CkSectionID *s);
 
     virtual void NodeGroupSend(CkDelegateData *pd,int ep,void *m,int onNode,CkNodeGroupID g);
     virtual void NodeGroupBroadcast(CkDelegateData *pd,int ep,void *m,CkNodeGroupID g);
+    virtual void NodeGroupSectionSend(CkDelegateData *pd,int ep,void *m,int nsid,CkSectionID *s);
 
     virtual void ArrayCreate(CkDelegateData *pd,int ep,void *m,const CkArrayIndexMax &idx,int onPE,CkArrayID a);
     virtual void ArraySend(CkDelegateData *pd,int ep,void *m,const CkArrayIndexMax &idx,CkArrayID a);
     virtual void ArrayBroadcast(CkDelegateData *pd,int ep,void *m,CkArrayID a);
-    virtual void ArraySectionSend(CkDelegateData *pd,int ep,void *m,CkArrayID a,CkSectionID &s,int opts);
+    virtual void ArraySectionSend(CkDelegateData *pd,int ep,void *m,int nsid,CkSectionID *s,int opts);
     virtual void initDelegateMgr(CProxy *proxy)  {}
     virtual CkDelegateData* ckCopyDelegateData(CkDelegateData *data) {
         data->ref();
@@ -622,9 +624,8 @@ class CProxy {
     CkDelegateMgr *delegatedMgr; // can be either a group or a nodegroup
     CkDelegateData *delegatedPtr; // private data for use by delegatedMgr.
   protected: //Never allocate CProxy's-- only subclass them.
-    CProxy() :delegatedMgr(0), delegatedPtr(0) { }
 
-#define CK_DELCTOR_PARAM CkDelegateMgr *dTo,CkDelegateData *dPtr
+#define CK_DELCTOR_PARAM CkDelegateMgr *dTo=NULL,CkDelegateData *dPtr=NULL
 #define CK_DELCTOR_ARGS dTo,dPtr
 #define CK_DELCTOR_CALL ckDelegatedTo(),ckDelegatedPtr()
 /// Delegation constructor: used when building 
@@ -798,10 +799,6 @@ class CProxy_Group : public CProxy {
 #endif
        //CkPrintf(" In CProxy_Group Constructor\n");
     }
-    CProxy_Group(CkGroupID g)
-       :CProxy(),_ck_gid(g) {
-       //CkPrintf(" In CProxy_Group Constructor\n");
-       }
     CProxy_Group(CkGroupID g,CK_DELCTOR_PARAM)
        :CProxy(CK_DELCTOR_ARGS),_ck_gid(g) {
        //CkPrintf(" In CProxy_Group Constructor\n");
@@ -854,8 +851,6 @@ class CProxyElement_Group : public CProxy_Group {
     int _onPE;
   public:
     CProxyElement_Group() { }
-    CProxyElement_Group(CkGroupID g,int onPE)
-       : CProxy_Group(g),_onPE(onPE) {}
     CProxyElement_Group(CkGroupID g,int onPE,CK_DELCTOR_PARAM)
        : CProxy_Group(g,CK_DELCTOR_ARGS),_onPE(onPE) {}
     CProxyElement_Group(const IrrGroup *g)
@@ -876,6 +871,87 @@ PUPmarshall(CProxyElement_Group)
           {return super::ckGetGroupPe();} \
 
 
+class CProxySection_Group : public CProxy_Group {
+private:
+  int _nsid;
+  CkSectionID *_sid;
+public:
+  CProxySection_Group() { }
+  CProxySection_Group(const CkGroupID &gid, const int *elems, const int nElems,CK_DELCTOR_PARAM)
+      :CProxy_Group(gid,CK_DELCTOR_ARGS), _nsid(1) { _sid = new CkSectionID(gid, elems, nElems); }
+  CProxySection_Group(const CProxySection_Group &cs,CK_DELCTOR_PARAM)
+      :CProxy_Group(cs.ckGetGroupID(),CK_DELCTOR_ARGS), _nsid(cs._nsid) {
+    if (_nsid == 1) _sid = new CkSectionID(cs.ckGetGroupID(), cs.ckGetElements(), cs.ckGetNumElements());
+    else if (_nsid > 1) {
+      _sid = new CkSectionID[_nsid];
+      for (int i=0; i<_nsid; ++i) _sid[i] = cs._sid[i];
+    } else _sid = NULL;
+  }
+  CProxySection_Group(const IrrGroup *g)
+      :CProxy_Group(g), _nsid(0) {}
+  CProxySection_Group(const int n, const CkGroupID *gid, const int **elems, const int *nElems,CK_DELCTOR_PARAM)
+      :CProxy_Group(gid[0],CK_DELCTOR_ARGS), _nsid(n) {
+    _sid = new CkSectionID[n];
+    for (int i=0; i<n; ++i) _sid[i] = CkSectionID(gid[i], elems[i], nElems[i]);
+  }
+  
+  ~CProxySection_Group() {
+    if (_nsid == 1) delete _sid;
+    else if (_nsid > 1) delete[] _sid;
+  }
+  
+  CProxySection_Group &operator=(const CProxySection_Group &cs) {
+    CProxy_Group::operator=(cs);
+    _nsid = cs._nsid;
+    if (_nsid == 1) _sid = new CkSectionID(*cs._sid);
+    else if (_nsid > 1) {
+      _sid = new CkSectionID[_nsid];
+      for (int i=0; i<_nsid; ++i) _sid[i] = cs._sid[i];
+    } else _sid = NULL;
+  }
+  
+  //void ckSend(CkArrayMessage *m, int ep, int opts = 0) ;
+
+  inline int ckGetNumSections() const {return _nsid;}
+  inline CkSectionInfo &ckGetSectionInfo() {return _sid[0]._cookie;}
+  inline CkSectionID *ckGetSectionID() {return _sid; }
+  inline CkGroupID ckGetGroupIDn(int i) const {return (CkGroupID)_sid[i]._cookie.aid;}
+  inline int *ckGetElements() const {return _sid[0].pelist;}
+  inline int *ckGetElements(int i) const {return _sid[i].pelist;}
+  inline int ckGetNumElements() const { return _sid[0].npes; }
+  inline int ckGetNumElements(int i) const { return _sid[i].npes; }
+  void pup(PUP::er &p) {
+    CProxy_Group::pup(p);
+    p | _nsid;
+    if (p.isUnpacking()) {
+      if (_nsid == 1) _sid = new CkSectionID;
+      else if (_nsid > 1) _sid = new CkSectionID[_nsid];
+      else _sid = NULL;
+    }
+    for (int i=0; i<_nsid; ++i) p | _sid[i];
+  }
+};
+PUPmarshall(CProxySection_Group);
+#define CK_DISAMBIG_GROUP_SECTION(super) \
+    CK_DISAMBIG_GROUP(super) \
+        inline int ckGetNumSections() const \
+      { return super::ckGetNumSections(); } \
+        inline CkSectionInfo &ckGetSectionInfo() \
+      { return super::ckGetSectionInfo(); } \
+        inline CkSectionID *ckGetSectionID() \
+      { return super::ckGetSectionID(); } \
+        inline CkGroupID ckGetGroupIDn(int i) const \
+      { return super::ckGetGroupIDn(i); } \
+        inline int *ckGetElements() const \
+      { return super::ckGetElements(); } \
+        inline int *ckGetElements(int i) const \
+      { return super::ckGetElements(i); } \
+        inline int ckGetNumElements() const \
+      { return super::ckGetNumElements(); }  \
+        inline int ckGetNumElements(int i) const \
+      { return super::ckGetNumElements(i); }  \
+
+
 /* These classes exist to provide chare indices for the basic
  chare types.*/
 class CkIndex_Chare { public:
@@ -904,8 +980,6 @@ class CProxy_NodeGroup : public CProxy{
 #endif
        //CkPrintf("In CProxy_NodeGroup0 Constructor %d\n",CkLocalNodeBranch(_ck_gid));
     }
-    CProxy_NodeGroup(CkGroupID g)
-       :CProxy(),_ck_gid(g) {/*CkPrintf("In CProxy_NodeGroup1 Constructor %d\n",CkLocalNodeBranch(_ck_gid));*/}
     CProxy_NodeGroup(CkGroupID g,CK_DELCTOR_PARAM)
        :CProxy(CK_DELCTOR_ARGS),_ck_gid(g) {/*CkPrintf("In CProxy_NodeGroup2 Constructor %d\n",CkLocalNodeBranch(_ck_gid));*/}
     CProxy_NodeGroup(const IrrGroup *g)
@@ -942,6 +1016,8 @@ class CProxy_NodeGroup : public CProxy{
 typedef CProxy_Group CProxy_IrrGroup;
 typedef CProxyElement_Group CProxyElement_NodeGroup;
 typedef CProxyElement_Group CProxyElement_IrrGroup;
+typedef CProxySection_Group CProxySection_NodeGroup;
+typedef CProxySection_Group CProxySection_IrrGroup;
 
 
 //(CProxy_ArrayBase is defined in ckarray.h)
index dcb1ab5a71c085730a6d3c68b34538ebf5752874..4ae5a220617f26e855cfd628f2504fa8abfb0a30 100644 (file)
@@ -262,9 +262,10 @@ extern void CkSendMsg(int entryIndex, void *msg, const CkChareID *chare, int opt
 extern void CkSendMsgBranch(int eIdx, void *msg, int destPE, CkGroupID gID, int opts CK_MSGOPTIONAL);
 extern void CkSendMsgInline(int entryIndex, void *msg, const CkChareID *chare, int opts CK_MSGOPTIONAL);
 extern void CkSendMsgBranchInline(int eIdx, void *msg, int destPE, CkGroupID gID, int opts CK_MSGOPTIONAL);
-extern void CkSendMsgBranchMulti(int eIdx, void *msg, int npes, int *pes, CkGroupID gID, int opts CK_MSGOPTIONAL);
+extern void CkSendMsgBranchMulti(int eIdx, void *msg, CkGroupID gID, int npes, int *pes, int opts CK_MSGOPTIONAL);
 extern void CkSendMsgNodeBranch(int eIdx, void *msg, int destNode, CkGroupID gID, int opts CK_MSGOPTIONAL);
 extern void CkSendMsgNodeBranchInline(int eIdx, void *msg, int destNode, CkGroupID gID, int opts CK_MSGOPTIONAL);
+extern void CkSendMsgNodeBranchMulti(int eIdx, void *msg, CkGroupID gID, int npes, int *nodes, int opts CK_MSGOPTIONAL);
 extern void CkBroadcastMsgBranch(int eIdx, void *msg, CkGroupID gID, int opts CK_MSGOPTIONAL);
 extern void CkBroadcastMsgNodeBranch(int eIdx, void *msg, CkGroupID gID, int opts CK_MSGOPTIONAL);
 
index af831f17aafb1a69783593eb883f27c3671e97e8..58bedd02882af0f345e02ebab402dc375a24b341 100644 (file)
@@ -179,10 +179,14 @@ void CkDelegateMgr::GroupSend(CkDelegateData *pd,int ep,void *m,int onPE,CkGroup
   { CkSendMsgBranch(ep,m,onPE,g); }
 void CkDelegateMgr::GroupBroadcast(CkDelegateData *pd,int ep,void *m,CkGroupID g)
   { CkBroadcastMsgBranch(ep,m,g); }
+void CkDelegateMgr::GroupSectionSend(CkDelegateData *pd,int ep,void *m,int nsid,CkSectionID *s)
+  { CkSendMsgBranchMulti(ep,m,s->_cookie.aid,s->npes,s->pelist); }
 void CkDelegateMgr::NodeGroupSend(CkDelegateData *pd,int ep,void *m,int onNode,CkNodeGroupID g)
   { CkSendMsgNodeBranch(ep,m,onNode,g); }
 void CkDelegateMgr::NodeGroupBroadcast(CkDelegateData *pd,int ep,void *m,CkNodeGroupID g)
   { CkBroadcastMsgNodeBranch(ep,m,g); }
+void CkDelegateMgr::NodeGroupSectionSend(CkDelegateData *pd,int ep,void *m,int nsid,CkSectionID *s)
+  { CkSendMsgNodeBranchMulti(ep,m,s->_cookie.aid,s->npes,s->pelist); }
 void CkDelegateMgr::ArrayCreate(CkDelegateData *pd,int ep,void *m,const CkArrayIndexMax &idx,int onPE,CkArrayID a)
 {
        CProxyElement_ArrayBase ap(a,idx);
@@ -199,7 +203,7 @@ void CkDelegateMgr::ArrayBroadcast(CkDelegateData *pd,int ep,void *m,CkArrayID a
        ap.ckBroadcast((CkArrayMessage *)m,ep);
 }
 
-void CkDelegateMgr::ArraySectionSend(CkDelegateData *pd,int ep,void *m, CkArrayID a,CkSectionID &s, int opts)
+void CkDelegateMgr::ArraySectionSend(CkDelegateData *pd,int ep,void *m, int nsid,CkSectionID *s, int opts)
 {
        CmiAbort("ArraySectionSend is not implemented!\n");
 /*
@@ -300,33 +304,58 @@ CKSECTIONID_CONSTRUCTOR_DEF(5D)
 CKSECTIONID_CONSTRUCTOR_DEF(6D)
 CKSECTIONID_CONSTRUCTOR_DEF(Max)
 
+CkSectionID::CkSectionID(const CkGroupID &gid, const int *_pelist, const int _npes): _nElems(0), _elems(NULL), npes(_npes) {
+  pelist = new int[npes];
+  for (int i=0; i<npes; i++) pelist[i] = _pelist[i];
+  _cookie.aid = gid;
+}
+
 CkSectionID::CkSectionID(const CkSectionID &sid) {
+  int i;
   _cookie = sid._cookie;
   _nElems = sid._nElems;
-  _elems = new CkArrayIndexMax[_nElems];
-  for (int i=0; i<_nElems; i++) _elems[i] = sid._elems[i];
-  pelist = NULL;
-  npes = 0;
+  if (_nElems > 0) {
+    _elems = new CkArrayIndexMax[_nElems];
+    for (i=0; i<_nElems; i++) _elems[i] = sid._elems[i];
+  } else _elems = NULL;
+  npes = sid.npes;
+  if (npes > 0) {
+    pelist = new int[npes];
+    for (i=0; i<npes; ++i) pelist[i] = sid.pelist[i];
+  } else pelist = NULL;
 }
 
 void CkSectionID::operator=(const CkSectionID &sid) {
+  int i;
   _cookie = sid._cookie;
   _nElems = sid._nElems;
-  _elems = new CkArrayIndexMax[_nElems];
-  for (int i=0; i<_nElems; i++) _elems[i] = sid._elems[i];
+  if (_nElems > 0) {
+    _elems = new CkArrayIndexMax[_nElems];
+    for (i=0; i<_nElems; i++) _elems[i] = sid._elems[i];
+  } else _elems = NULL;
+  npes = sid.npes;
+  if (npes > 0) {
+    pelist = new int[npes];
+    for (i=0; i<npes; ++i) pelist[i] = sid.pelist[i];
+  } else pelist = NULL;
 }
 
 CkSectionID::~CkSectionID() {
-    delete [] _elems;
-    if(pelist != NULL)
-        delete [] pelist;
+    if (_elems != NULL) delete [] _elems;
+    if (pelist != NULL) delete [] pelist;
 }
 
 void CkSectionID::pup(PUP::er &p) {
     p | _cookie;
     p(_nElems);
-    if (p.isUnpacking()) _elems = new CkArrayIndexMax[_nElems];
-    for (int i=0; i< _nElems; i++) p | _elems[i];
+    if (_nElems > 0) {
+      if (p.isUnpacking()) _elems = new CkArrayIndexMax[_nElems];
+      for (int i=0; i< _nElems; i++) p | _elems[i];
+    } else {
+      // If _nElems is zero, than this section describes processors instead of array elements
+      p(npes);
+      p(pelist, npes);
+    }
 }
 
 /**** Tiny random API routines */
@@ -1457,7 +1486,7 @@ void CkSendMsgBranch(int eIdx, void *msg, int pe, CkGroupID gID, int opts)
 }
 
 extern "C"
-void CkSendMsgBranchMultiImmediate(int eIdx,void *msg,int npes,int *pes,CkGroupID gID)
+void CkSendMsgBranchMultiImmediate(int eIdx,void *msg,CkGroupID gID,int npes,int *pes)
 {
 #if CMK_IMMEDIATE_MSG && ! CMK_SMP
   register envelope *env = _prepareImmediateMsgBranch(eIdx,msg,gID,ForBocMsg);
@@ -1473,10 +1502,10 @@ void CkSendMsgBranchMultiImmediate(int eIdx,void *msg,int npes,int *pes,CkGroupI
 }
 
 extern "C"
-void CkSendMsgBranchMulti(int eIdx,void *msg,int npes,int *pes,CkGroupID gID, int opts)
+void CkSendMsgBranchMulti(int eIdx,void *msg,CkGroupID gID,int npes,int *pes, int opts)
 {
   if (opts & CK_MSG_IMMEDIATE) {
-    CkSendMsgBranchMultiImmediate(eIdx,msg,npes,pes,gID);
+    CkSendMsgBranchMultiImmediate(eIdx,msg,gID,npes,pes);
     return;
   }
     // normal mesg
@@ -1515,6 +1544,17 @@ static inline void _sendMsgNodeBranch(int eIdx, void *msg, CkGroupID gID,
 #endif
 }
 
+static inline void _sendMsgNodeBranchMulti(int eIdx, void *msg, CkGroupID gID,
+                           int npes, int *nodes)
+{
+  register envelope *env = _prepareMsgBranch(eIdx,msg,gID,ForNodeBocMsg);
+  _TRACE_CREATION_N(env, npes);
+  for (int i=0; i<npes; i++) {
+    CldNodeEnqueue(nodes[i], env, _infoIdx);
+  }
+  _TRACE_CREATION_DONE(1);  // since it only creates one creation event.
+}
+
 extern "C"
 void CkSendMsgNodeBranchImmediate(int eIdx, void *msg, int node, CkGroupID gID)
 {
@@ -1580,6 +1620,33 @@ void CkSendMsgNodeBranch(int eIdx, void *msg, int node, CkGroupID gID, int opts)
   CkpvAccess(_coreState)->create();
 }
 
+extern "C"
+void CkSendMsgNodeBranchMultiImmediate(int eIdx,void *msg,CkGroupID gID,int npes,int *nodes)
+{
+#if CMK_IMMEDIATE_MSG && ! CMK_SMP
+  register envelope *env = _prepareImmediateMsgBranch(eIdx,msg,gID,ForNodeBocMsg);
+  _noCldEnqueueMulti(npes, nodes, env);
+#else
+  _sendMsgNodeBranchMulti(eIdx, msg, gID, npes, pes);
+  CpvAccess(_qd)->create(-npes);
+#endif
+  _STATS_RECORD_SEND_NODE_BRANCH_N(npes);
+  CpvAccess(_qd)->create(npes);
+}
+
+extern "C"
+void CkSendMsgNodeBranchMulti(int eIdx,void *msg,CkGroupID gID,int npes,int *nodes, int opts)
+{
+  if (opts & CK_MSG_IMMEDIATE) {
+    CkSendMsgNodeBranchMultiImmediate(eIdx,msg,gID,npes,nodes);
+    return;
+  }
+    // normal mesg
+  _sendMsgNodeBranchMulti(eIdx, msg, gID, npes, nodes);
+  _STATS_RECORD_SEND_NODE_BRANCH_N(npes);
+  CpvAccess(_qd)->create(npes);
+}
+
 extern "C"
 void CkBroadcastMsgNodeBranch(int eIdx, void *msg, CkGroupID gID, int opts)
 {
index b0325e5aa61b2d5abd06cc507879bb02afe6e51a..b602bee0e6d7332883e38c5496c8015e6e481c9c 100644 (file)
@@ -488,7 +488,13 @@ void CProxyElement_ArrayBase::pup(PUP::er &p)
 void CProxySection_ArrayBase::pup(PUP::er &p)
 {
   CProxy_ArrayBase::pup(p);
-  _sid.pup(p);
+  p | _nsid;
+  if (p.isUnpacking()) {
+    if (_nsid == 1) _sid = new CkSectionID;
+    else if (_nsid > 1) _sid = new CkSectionID[_nsid];
+    else _sid = NULL;
+  }
+  for (int i=0; i<_nsid; ++i) _sid[i].pup(p);
 }
 
 /*********************** CkArray Creation *************************/
@@ -779,19 +785,21 @@ void *CProxyElement_ArrayBase::ckSendSync(CkArrayMessage *msg, int ep) const
 void CProxySection_ArrayBase::ckSend(CkArrayMessage *msg, int ep, int opts)
 {
        if (ckIsDelegated()) //Just call our delegateMgr
-         ckDelegatedTo()->ArraySectionSend(ckDelegatedPtr(),ep,msg,ckGetArrayID(),ckGetSectionID(), opts);
+         ckDelegatedTo()->ArraySectionSend(ckDelegatedPtr(),ep,msg,1,_sid, opts);
        else {
          // send through all
-         for (int i=0; i< _sid._nElems-1; i++) {
-           CProxyElement_ArrayBase ap(ckGetArrayID(), _sid._elems[i]);
-           void *newMsg=CkCopyMsg((void **)&msg);
-           ap.ckSend((CkArrayMessage *)newMsg,ep,opts);
-         }
-         if (_sid._nElems > 0) {
-           CProxyElement_ArrayBase ap(ckGetArrayID(), _sid._elems[_sid._nElems-1]);
-           ap.ckSend((CkArrayMessage *)msg,ep,opts);
+         for (int k=0; k<_nsid; ++k) {
+           for (int i=0; i< _sid[k]._nElems-1; i++) {
+             CProxyElement_ArrayBase ap(ckGetArrayID(), _sid[k]._elems[i]);
+             void *newMsg=CkCopyMsg((void **)&msg);
+             ap.ckSend((CkArrayMessage *)newMsg,ep,opts);
+           }
+           if (_sid[k]._nElems > 0) {
+             CProxyElement_ArrayBase ap(ckGetArrayID(), _sid[k]._elems[_sid[k]._nElems-1]);
+             ap.ckSend((CkArrayMessage *)msg,ep,opts);
+           }
          }
-        }
+       }
 }
 
 void CkSendMsgArray(int entryIndex, void *msg, CkArrayID aID, const CkArrayIndex &idx, int opts)
index 5b528870cc900c1cf638f3beafa20677f0c7fa31..63e33d4fb16678ba0021f7c9b980036380a5e7aa 100644 (file)
@@ -329,8 +329,6 @@ public:
        }
        CProxy_ArrayBase(const CkArrayID &aid,CK_DELCTOR_PARAM)
                :CProxy(CK_DELCTOR_ARGS), _aid(aid) { }
-       CProxy_ArrayBase(const CkArrayID &aid)
-               :CProxy(), _aid(aid) { }
        CProxy_ArrayBase(const ArrayElement *e);
 
 #ifndef CMK_OPTIMIZE
@@ -390,8 +388,6 @@ public:
        CProxyElement_ArrayBase(const CkArrayID &aid,
                const CkArrayIndex &idx,CK_DELCTOR_PARAM)
                :CProxy_ArrayBase(aid,CK_DELCTOR_ARGS), _idx(idx) { }
-       CProxyElement_ArrayBase(const CkArrayID &aid, const CkArrayIndex &idx)
-               :CProxy_ArrayBase(aid), _idx(idx) { }
        CProxyElement_ArrayBase(const ArrayElement *e);
 
        void ckInsert(CkArrayMessage *m,int ctor,int onPe);
@@ -419,33 +415,57 @@ PUPmarshall(CProxyElement_ArrayBase);
 
 class CProxySection_ArrayBase:public CProxy_ArrayBase {
 private:
-       CkSectionID _sid;
+    int _nsid;
+       CkSectionID *_sid;
 public:
        CProxySection_ArrayBase() { }
        CProxySection_ArrayBase(const CkArrayID &aid,
                const CkArrayIndexMax *elems, const int nElems, CK_DELCTOR_PARAM)
-               :CProxy_ArrayBase(aid,CK_DELCTOR_ARGS), _sid(aid, elems, nElems) { }
-       CProxySection_ArrayBase(const CkArrayID &aid,
-               const CkArrayIndexMax *elems, const int nElems)
-               :CProxy_ArrayBase(aid), _sid(aid, elems, nElems) { }
-       CProxySection_ArrayBase(const CkSectionID &sid)
-               :CProxy_ArrayBase(sid._cookie.aid), _sid(sid){}
+               :CProxy_ArrayBase(aid,CK_DELCTOR_ARGS), _nsid(1) { _sid = new CkSectionID(aid, elems, nElems); }
        CProxySection_ArrayBase(const CkSectionID &sid, CK_DELCTOR_PARAM)
-               :CProxy_ArrayBase(sid._cookie.aid, CK_DELCTOR_ARGS), _sid(sid){}
-        CProxySection_ArrayBase(const CProxySection_ArrayBase &cs)
-               :CProxy_ArrayBase(cs.ckGetArrayID()),
-                _sid(cs.ckGetArrayID(), cs.ckGetArrayElements(), cs.ckGetNumElements()) {}
-
+               :CProxy_ArrayBase(sid._cookie.aid, CK_DELCTOR_ARGS), _nsid(1) { _sid = new CkSectionID(sid); }
+    CProxySection_ArrayBase(const CProxySection_ArrayBase &cs, CK_DELCTOR_PARAM)
+               :CProxy_ArrayBase(cs.ckGetArrayID(),CK_DELCTOR_ARGS), _nsid(cs._nsid) {
+      if (_nsid == 1) _sid = new CkSectionID(cs.ckGetArrayID(), cs.ckGetArrayElements(), cs.ckGetNumElements());
+      else if (_nsid > 1) {
+        _sid = new CkSectionID[_nsid];
+        for (int i=0; i<_nsid; ++i) _sid[i] = cs._sid[i];
+      } else _sid = NULL;
+    }
+    CProxySection_ArrayBase(const int n, const CkArrayID *aid, const CkArrayIndexMax **elems, const int *nElems,CK_DELCTOR_PARAM)
+        :CProxy_ArrayBase(aid[0],CK_DELCTOR_ARGS), _nsid(n) {
+      _sid = new CkSectionID[n];
+      for (int i=0; i<n; ++i) _sid[i] = CkSectionID(aid[i], elems[i], nElems[i]);
+    }
+
+    ~CProxySection_ArrayBase() {
+      if (_nsid == 1) delete _sid;
+      else if (_nsid > 1) delete[] _sid;
+    }
+
+    CProxySection_ArrayBase &operator=(const CProxySection_ArrayBase &cs) {
+      CProxy_ArrayBase::operator=(cs);
+      _nsid = cs._nsid;
+      if (_nsid == 1) _sid = new CkSectionID(*cs._sid);
+      else if (_nsid > 1) {
+        _sid = new CkSectionID[_nsid];
+        for (int i=0; i<_nsid; ++i) _sid[i] = cs._sid[i];
+      } else _sid = NULL;
+    }
+    
        void ckSectionDelegate(CkDelegateMgr *d) 
                { ckDelegate(d); d->initDelegateMgr(this); }
 //     void ckInsert(CkArrayMessage *m,int ctor,int onPe);
        void ckSend(CkArrayMessage *m, int ep, int opts = 0) ;
 
 //     ArrayElement *ckLocal(void) const;
-       inline CkSectionInfo &ckGetSectionInfo() {return _sid._cookie;}
-       inline CkSectionID &ckGetSectionID() {return _sid;}
-        inline CkArrayIndexMax *ckGetArrayElements() const {return _sid._elems;}
-       inline int ckGetNumElements() const { return _sid._nElems; }
+       inline CkSectionInfo &ckGetSectionInfo() {return _sid->_cookie;}
+       inline CkSectionID *ckGetSectionID() {return _sid;}
+       inline CkArrayID ckGetArrayIDn(int i) const {return _sid[i]._cookie.aid;}
+    inline CkArrayIndexMax *ckGetArrayElements() const {return _sid[0]._elems;}
+    inline CkArrayIndexMax *ckGetArrayElements(int i) const {return _sid[i]._elems;}
+    inline int ckGetNumElements() const { return _sid[0]._nElems; }
+       inline int ckGetNumElements(int i) const { return _sid[i]._nElems; }
        void pup(PUP::er &p);
 };
 PUPmarshall(CProxySection_ArrayBase);
@@ -455,12 +475,18 @@ PUPmarshall(CProxySection_ArrayBase);
          { super::ckSend(m,ep,opts); } \
         inline CkSectionInfo &ckGetSectionInfo() \
          { return super::ckGetSectionInfo(); } \
-        inline CkSectionID &ckGetSectionID() \
+        inline CkSectionID *ckGetSectionID() \
          { return super::ckGetSectionID(); } \
+        inline CkArrayID ckGetArrayIDn(int i) const \
+      { return super::ckGetArrayIDn(i); }  \
         inline CkArrayIndexMax *ckGetArrayElements() const \
          { return super::ckGetArrayElements(); } \
+        inline CkArrayIndexMax *ckGetArrayElements(int i) const \
+      { return super::ckGetArrayElements(i); } \
         inline int ckGetNumElements() const \
          { return super::ckGetNumElements(); }  \
+        inline int ckGetNumElements(int i) const \
+      { return super::ckGetNumElements(i); }  \
 
 //Simple C-like API:
 void CkSendMsgArray(int entryIndex, void *msg, CkArrayID aID, const CkArrayIndex &idx, int opts=0);
index 5940f006eeddd1582afb4ccdce7c4a0711cebe8e..a7a4613916088ad383c5d3705cea41d815a5f10b 100644 (file)
@@ -32,6 +32,7 @@
 
 class CkSectionInfo {
  public:
+    // NOTICE: aid is used to store also a CkGroupID for group multicasts
     CkArrayID aid;
     int pe;
     union section_type {
@@ -158,7 +159,7 @@ class CkMcastBaseMsg {
 
 class CkSectionID {
 public:
-  CkSectionInfo   _cookie;             // used by array section multicast
+  CkSectionInfo   _cookie;             // used by array and group section multicast
   CkArrayIndexMax *_elems;
   int _nElems;
   
@@ -171,6 +172,7 @@ public:
 public:
   CkSectionID(): _elems(NULL), _nElems(0), pelist(0), npes(0) {}
   CkSectionID(const CkSectionID &sid);
+  CkSectionID(const CkGroupID &gid, const int *_pelist, const int _npes);
   CKSECTIONID_CONSTRUCTOR(1D)
   CKSECTIONID_CONSTRUCTOR(2D)
   CKSECTIONID_CONSTRUCTOR(3D)
index 922ee5ddbef8f877570b0a18c6ff7b83c3aaad3a..4823035e5140efbc0eada74dbe2e5a5f937c8874 100644 (file)
@@ -295,15 +295,15 @@ void CkMulticastMgr::resetSection(CProxySection_ArrayElement &proxy)
   if (oldpe == CkMyPe()) return;       // we don't have to recreate one
 
   CkArrayID aid = proxy.ckGetArrayID();
-  CkSectionID &sid = proxy.ckGetSectionID();
+  CkSectionID *sid = proxy.ckGetSectionID();
   mCastEntry *entry = new mCastEntry(aid);
 
   mCastEntry *oldentry = (mCastEntry *)info.get_val();
   DEBUGF(("[%d] resetSection: old entry:%p new entry:%p\n", CkMyPe(), oldentry, entry));
 
-  const CkArrayIndexMax *al = sid._elems;
+  const CkArrayIndexMax *al = sid->_elems;
   CmiAssert(info.aid == aid);
-  prepareCookie(entry, sid, al, sid._nElems, aid);
+  prepareCookie(entry, *sid, al, sid->_nElems, aid);
 
   CProxy_CkMulticastMgr  mCastGrp(thisgroup);
 
@@ -344,13 +344,13 @@ void CkMulticastMgr::initDelegateMgr(CProxy *cproxy)
 {
   CProxySection_ArrayBase *proxy = (CProxySection_ArrayBase *)cproxy;
   CkArrayID aid = proxy->ckGetArrayID();
-  CkSectionID &sid = proxy->ckGetSectionID();
+  CkSectionID *sid = proxy->ckGetSectionID();
 
   mCastEntry *entry = new mCastEntry(aid);
 
   const CkArrayIndexMax *al = proxy->ckGetArrayElements();
-  prepareCookie(entry, sid, al, proxy->ckGetNumElements(), aid);
-  initCookie(sid._cookie);
+  prepareCookie(entry, *sid, al, proxy->ckGetNumElements(), aid);
+  initCookie(sid->_cookie);
 }
 
 
@@ -695,7 +695,7 @@ void CkMulticastMgr::SimpleSend(int ep,void *m, CkArrayID a, CkSectionID &sid, i
   }
 }
 
-void CkMulticastMgr::ArraySectionSend(CkDelegateData *pd,int ep,void *m, CkArrayID a, CkSectionID &sid, int opts)
+void CkMulticastMgr::ArraySectionSend(CkDelegateData *pd,int ep,void *m, int nsid, CkSectionID *sid, int opts)
 {
   DEBUGF(("ArraySectionSend\n"));
 
@@ -703,8 +703,8 @@ void CkMulticastMgr::ArraySectionSend(CkDelegateData *pd,int ep,void *m, CkArray
 //  msg->aid = a;
   msg->ep = ep;
 
-  CkSectionInfo &s = sid._cookie;
-  CmiAssert(a == s.aid);
+  CkSectionInfo &s = sid->_cookie;
+  CmiAssert(nsid == 1);
 
   mCastEntry *entry;
   if (s.get_pe() == CkMyPe()) {
@@ -722,14 +722,14 @@ void CkMulticastMgr::ArraySectionSend(CkDelegateData *pd,int ep,void *m, CkArray
 #if CMK_LBDB_ON
     // fixme: running obj?
     envelope *env = UsrToEnv(msg);
-    const LDOMHandle &om = CProxy_ArrayBase(a).ckLocMgr()->getOMHandle();
+    const LDOMHandle &om = CProxy_ArrayBase(s.aid).ckLocMgr()->getOMHandle();
     LBDatabaseObj()->MulticastSend(om,entry->allObjKeys.getVec(),entry->allObjKeys.size(),env->getTotalsize());
 #endif
 
     // first time need to rebuild, we do simple send to refresh lastKnown
     if (entry->needRebuild == 1) {
       msg->_cookie = s;
-      SimpleSend(ep, msg, a, sid, opts);
+      SimpleSend(ep, msg, s.aid, *sid, opts);
       entry->needRebuild = 2;
       return;
     }
index 497e3c9b8d0af0acc9546185b20f160f6da49670..516e2efa34ad9ef01694714db0b44470fe4daefb 100644 (file)
@@ -123,7 +123,7 @@ class CkMulticastMgr: public CkDelegateMgr
         void resetSection(CProxySection_ArrayElement &proxy);  // called by root
         virtual void initDelegateMgr(CProxy *proxy);
         /// override from base class. 
-        void ArraySectionSend(CkDelegateData *pd,int ep,void *m, CkArrayID a, CkSectionID &s, int opts);
+        void ArraySectionSend(CkDelegateData *pd,int ep,void *m, int nsid, CkSectionID *s, int opts);
         void SimpleSend(int ep,void *m, CkArrayID a, CkSectionID &sid, int opts);
         // user should be careful while passing non-default value of fragSize
         // fragSize%sizeof(data_type) should be zero
index cf4ab870427f99fcce2b582b41f246946a317749..ccd7a7f10eac4f6dc026a086a226368d2d47f32c 100644 (file)
@@ -1010,7 +1010,7 @@ Group::Group(int ln, attrib_t Nattr,
 {
         hasElement=1;
        forElement=forIndividual;
-       hasSection=0;
+       hasSection=1;
        bases_CBase=NULL;
        if (b==NULL) {//Add Group as a base class
                if (isNodeGroup())
@@ -1061,20 +1061,31 @@ Group::genSubDecls(XStr& str)
     str << "    "<<ptype<<"(CkGroupID _gid,int _onPE,CK_DELCTOR_PARAM) : ";
     genProxyNames(str, "", NULL,"(_gid,_onPE,CK_DELCTOR_ARGS)", ", ");
     str << "{  }\n";
-    str << "    "<<ptype<<"(CkGroupID _gid,int _onPE) : ";
-    genProxyNames(str, "", NULL,"(_gid,_onPE)", ", ");
-    str << "{  }\n";
+    //str << "    "<<ptype<<"(CkGroupID _gid,int _onPE) : ";
+    //genProxyNames(str, "", NULL,"(_gid,_onPE)", ", ");
+    //str << "{  }\n";
 
     str<<"   CK_DISAMBIG_GROUP_ELEMENT("<<super<<")\n";
   }
+  else if (forElement==forSection)
+  {//For a section of the group
+    str << "    "<<ptype<<"(CkGroupID _gid,int *_pelist,int _npes,CK_DELCTOR_PARAM) : ";
+    genProxyNames(str, "", NULL,"(_gid,_pelist,_npes,CK_DELCTOR_ARGS)", ", ");
+    str << "{  }\n";
+    //str << "    "<<ptype<<"(CkGroupID _gid,int *_pelist,int _npes) : ";
+    //genProxyNames(str, "", NULL,"(_gid,_pelist,_npes)", ", ");
+    //str << "{  }\n";
+    
+    str << "   CK_DISAMBIG_GROUP_SECTION("<<super<<")\n";
+  }
   else if (forElement==forAll)
   {//For whole group
     str << "    "<<ptype<<"(CkGroupID _gid,CK_DELCTOR_PARAM) : ";
     genProxyNames(str, "", NULL,"(_gid,CK_DELCTOR_ARGS)", ", ");
     str << "{  }\n";
-    str << "    "<<ptype<<"(CkGroupID _gid) : ";
-    genProxyNames(str, "", NULL,"(_gid)", ", ");
-    str << "{  }\n";
+    //str << "    "<<ptype<<"(CkGroupID _gid) : ";
+    //genProxyNames(str, "", NULL,"(_gid)", ", ");
+    //str << "{  }\n";
 
     //Group proxy can be indexed into an element proxy:
     forElement=forIndividual;//<- for the proxyName below
@@ -1187,9 +1198,9 @@ Array::genSubDecls(XStr& str)
     str <<
          "    "<<ptype<<"(const CkArrayID &aid,const "<<indexType<<" &idx,CK_DELCTOR_PARAM)\n"
          "        :";genProxyNames(str, "",NULL, "(aid,idx,CK_DELCTOR_ARGS)", ", ");str<<" {}\n";
-    str <<
-         "    "<<ptype<<"(const CkArrayID &aid,const "<<indexType<<" &idx)\n"
-         "        :";genProxyNames(str, "",NULL, "(aid,idx)", ", ");str<<" {}\n";
+    //str <<
+    //     "    "<<ptype<<"(const CkArrayID &aid,const "<<indexType<<" &idx)\n"
+    //     "        :";genProxyNames(str, "",NULL, "(aid,idx)", ", ");str<<" {}\n";
   }
   else if (forElement==forAll)
   {/*Collective, indexible version*/
@@ -1240,8 +1251,8 @@ Array::genSubDecls(XStr& str)
     }
     str <<"    "<<ptype<<"(const CkArrayID &aid,CK_DELCTOR_PARAM) \n"
          "        :";genProxyNames(str, "",NULL, "(aid,CK_DELCTOR_ARGS)", ", ");str<<" {}\n";
-    str <<"    "<<ptype<<"(const CkArrayID &aid) \n"
-         "        :";genProxyNames(str, "",NULL, "(aid)", ", ");str<<" {}\n";
+    //str <<"    "<<ptype<<"(const CkArrayID &aid) \n"
+    //     "        :";genProxyNames(str, "",NULL, "(aid)", ", ");str<<" {}\n";
   }
   else if (forElement==forSection)
   { /* for Section, indexible version*/
@@ -1358,8 +1369,8 @@ Array::genSubDecls(XStr& str)
 
     str <<"    "<<ptype<<"(const CkArrayID &aid, CkArrayIndexMax *elems, int nElems, CK_DELCTOR_PARAM) \n"
          "        :";genProxyNames(str, "",NULL, "(aid,elems,nElems,CK_DELCTOR_ARGS)", ", ");str << " {}\n";
-    str <<"    "<<ptype<<"(const CkArrayID &aid, CkArrayIndexMax *elems, int nElems) \n"
-         "        :";genProxyNames(str, "",NULL, "(aid,elems,nElems)", ", ");str<<" {}\n";
+    //str <<"    "<<ptype<<"(const CkArrayID &aid, CkArrayIndexMax *elems, int nElems) \n"
+    //     "        :";genProxyNames(str, "",NULL, "(aid,elems,nElems)", ", ");str<<" {}\n";
     str <<"    "<<ptype<<"(const CkSectionID &sid)"
          "       :";genProxyNames(str, "",NULL, "(sid)", ", ");str<< " {}\n";
     str <<
@@ -3111,7 +3122,7 @@ void Entry::genGroupDecl(XStr& str)
     else
       str << "    "<<retType<<" "<<name<<"("<<paramType(1,1)<<");\n";
     // entry method on multiple PEs declaration
-    if(!container->isForElement() && !isSync() && !isLocal() && !container->isNodeGroup()) {
+    if(!container->isForElement() && !container->isForSection() && !isSync() && !isLocal() && !container->isNodeGroup()) {
       str << "    "<<retType<<" "<<name<<"("<<paramComma(1,0)<<"int npes, int *pes"<<eo(1)<<");\n";
     }
   }
@@ -3183,9 +3194,19 @@ void Entry::genGroupDefs(XStr& str)
       {// Send
         str << "  if (ckIsDelegated()) {\n";
         str << "     Ck"<<node<<"GroupMsgPrep("<<paramg<<");\n";
-       str << "     ckDelegatedTo()->"<<node<<"GroupSend(ckDelegatedPtr(),"<<parampg<<");\n";
+        str << "     ckDelegatedTo()->"<<node<<"GroupSend(ckDelegatedPtr(),"<<parampg<<");\n";
         str << "  } else CkSendMsg"<<node<<"Branch"<<"("<<parampg<<opts<<");\n";
       }
+      else if (container->isForSection())
+      {// Multicast
+        str << "  if (ckIsDelegated()) {\n";
+        str << "     Ck"<<node<<"GroupMsgPrep("<<paramg<<");\n";
+        str << "     ckDelegatedTo()->"<<node<<"GroupSectionSend(ckDelegatedPtr(),"<<params<<", ckGetNumSections(), ckGetSectionID());\n";
+        str << "  } else {\n";
+        str << "    for (int i=0; i<ckGetNumSections(); ++i) ";
+        str << "CkSendMsg"<<node<<"BranchMulti("<<params<<", ckGetGroupIDn(i), ckGetNumElements(i), ckGetElements(i)"<<opts<<");\n";
+        str << "  }\n";
+      }
       else
       {// Broadcast
         str << "  if (ckIsDelegated()) {\n";
@@ -3197,11 +3218,11 @@ void Entry::genGroupDefs(XStr& str)
     str << "}\n";
 
     // entry method on multiple PEs declaration
-    if(!forElement && !isSync() && !isLocal() && !container->isNodeGroup()) {
-      str << "    "<<makeDecl(retStr,1)<<"::"<<name<<"("<<paramComma(1,0)<<"int npes, int *pes"<<eo(0)<<")\n";
-      str << "    {\n"<<marshallMsg();
-      str << "      CkSendMsg"<<node<<"BranchMulti("<<params<<", npes, pes, ckGetGroupID()"<<opts<<");\n";
-      str << "    }\n";
+    if(!forElement && !container->isForSection() && !isSync() && !isLocal() && !container->isNodeGroup()) {
+      str << ""<<makeDecl(retStr,1)<<"::"<<name<<"("<<paramComma(1,0)<<"int npes, int *pes"<<eo(0)<<") {\n";
+      str << marshallMsg();
+      str << "  CkSendMsg"<<node<<"BranchMulti("<<paramg<<", npes, pes"<<opts<<");\n";
+      str << "}\n";
     }
   }
 }
@@ -3209,6 +3230,7 @@ void Entry::genGroupDefs(XStr& str)
 void Entry::genGroupStaticConstructorDecl(XStr& str)
 {
   if (container->isForElement()) return;
+  if (container->isForSection()) return;
 
   str << "    static CkGroupID ckNew("<<paramType(1,1)<<");\n";
   if (!param->isVoid()) {
@@ -3219,6 +3241,7 @@ void Entry::genGroupStaticConstructorDecl(XStr& str)
 void Entry::genGroupStaticConstructorDefs(XStr& str)
 {
   if (container->isForElement()) return;
+  if (container->isForSection()) return;
 
   //Selects between NodeGroup and Group
   char *node = (char *)(container->isNodeGroup()?"Node":"");