CkMulticast: Support multicasts to cross-array sections
authorRamprasad Venkataraman <ramv@illinois.edu>
Fri, 27 Aug 2010 16:36:07 +0000 (11:36 -0500)
committerRamprasad Venkataraman <ramv@illinois.edu>
Tue, 31 Aug 2010 19:30:37 +0000 (14:30 -0500)
Quick implementation to add desired functionality with no efforts
on performance optimization. Treat a cross-array section simply as
a collection of individual array sections, and process each of these
(quote/unquote)sub-sections as usual.

Reduction support for x-array sections will follow in other commits,
but there are no checks/aborts in place now; so beware.

src/ck-core/ckarray.C
src/libs/ck-libs/multicast/ckmulticast.C
src/libs/ck-libs/multicast/ckmulticast.h

index 931de344f6fad9ea89127ab54a33178ea435aafb..3fe12740f39b16f4559cd1e26172ad3b27090030 100644 (file)
@@ -797,7 +797,7 @@ 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,1,_sid, opts);
+         ckDelegatedTo()->ArraySectionSend(ckDelegatedPtr(), ep, msg, _nsid, _sid, opts);
        else {
          // send through all
          for (int k=0; k<_nsid; ++k) {
index e2350f18667559297345ffa0166533bfee2b6ec8..20466d091b45022fcf4e9c2a46ee7dd1b6e307ae 100644 (file)
@@ -341,14 +341,16 @@ void CkMulticastMgr::prepareCookie(mCastEntry *entry, CkSectionID &sid, const Ck
 void CkMulticastMgr::initDelegateMgr(CProxy *cproxy)
 {
   CProxySection_ArrayBase *proxy = (CProxySection_ArrayBase *)cproxy;
-  CkArrayID aid = proxy->ckGetArrayID();
-  CkSectionID *sid = proxy->ckGetSectionIDs();
-
-  mCastEntry *entry = new mCastEntry(aid);
-
-  const CkArrayIndexMax *al = proxy->ckGetArrayElements();
-  prepareCookie(entry, *sid, al, proxy->ckGetNumElements(), aid);
-  initCookie(sid->_cookie);
+  int numSubSections = proxy->ckGetNumSubSections();
+  for (int i=0; i<numSubSections; i++)
+  {
+      CkArrayID aid = proxy->ckGetArrayIDn(i);
+      mCastEntry *entry = new mCastEntry(aid);
+      CkSectionID *sid = &( proxy->ckGetSectionID(i) );
+      const CkArrayIndexMax *al = proxy->ckGetArrayElements(i);
+      prepareCookie(entry, *sid, al, proxy->ckGetNumElements(i), aid);
+      initCookie(sid->_cookie);
+  }
 }
 
 
@@ -683,14 +685,25 @@ void CkMulticastMgr::SimpleSend(int ep,void *m, CkArrayID a, CkSectionID &sid, i
 
 void CkMulticastMgr::ArraySectionSend(CkDelegateData *pd,int ep,void *m, int nsid, CkSectionID *sid, int opts)
 {
-  DEBUGF(("ArraySectionSend\n"));
+    for (int snum = 0; snum < nsid; snum++) {
+        void *msgCopy = m;
+        if (nsid - snum > 1)
+            msgCopy = CkCopyMsg(&m);
+        sendToSection(pd, ep, msgCopy, &(sid[snum]), opts);
+    }
+}
+
+
+
+void CkMulticastMgr::sendToSection(CkDelegateData *pd,int ep,void *m, CkSectionID *sid, int opts)
+{
+            DEBUGF(("ArraySectionSend\n"));
 
   multicastGrpMsg *msg = (multicastGrpMsg *)m;
 //  msg->aid = a;
   msg->ep = ep;
 
   CkSectionInfo &s = sid->_cookie;
-  CmiAssert(nsid == 1);
 
   mCastEntry *entry;
   if (s.get_pe() == CkMyPe()) {
index 8c5d4a5b808c6a3acf43dd896e60e3142cfbff8b..5b5dbe3f3a5f2768ee4efea4815069ebe0d0aee7 100644 (file)
@@ -141,6 +141,8 @@ class CkMulticastMgr: public CkDelegateMgr
         void prepareCookie(mCastEntry *entry, CkSectionID &sid, const CkArrayIndexMax *al, int count, CkArrayID aid);
         /// Get info from the CkSectionInfo and call setup() to start the spanning tree build
         void initCookie(CkSectionInfo sid);
+        /// Actually trigger the multicast to a section of a chare array
+        void sendToSection(CkDelegateData *pd,int ep,void *m, CkSectionID *sid, int opts);
         /// Mark old cookie spanning tree as old and build a new one
         void resetCookie(CkSectionInfo sid);
         enum {MAXREDUCERS=256};