a new CkSendMsgBranchGroup function, similar to CkSendMsgBranchMulti (which takes...
authorGengbin Zheng <gzheng@gzheng-desktop.(none)>
Fri, 19 Feb 2010 05:43:52 +0000 (23:43 -0600)
committerGengbin Zheng <gzheng@gzheng-desktop.(none)>
Fri, 19 Feb 2010 05:43:52 +0000 (23:43 -0600)
src/ck-core/charm++.h
src/ck-core/charm.h
src/ck-core/ck.C
src/conv-core/converse.h
src/conv-ldb/cldb.bluegene.c
src/conv-ldb/cldb.neighbor.c
src/conv-ldb/cldb.rand.c
src/conv-ldb/cldb.spray.c

index 1e4fe06133af67442f987e2e7dfc73a78eaaaeb1..ba94946c5a32735ac01a590101229e19f27ad23c 100644 (file)
@@ -34,7 +34,7 @@ public: static int __idx;
 
 PUPbytes(CkChareID)
 PUPbytes(CkGroupID)
-
+PUPbytes(CmiGroup)
   
 /**
  * CkMessage is the superclass of all Charm++ messages.
index cc0c30a3d50651836a233838622b27f5034f993d..06fd8e154bb828d747295deac0a41647bf46bbae 100644 (file)
@@ -277,6 +277,7 @@ extern void CkSendMsgBranch(int eIdx, void *msg, int destPE, CkGroupID gID, int
 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, CkGroupID gID, int npes, int *pes, int opts CK_MSGOPTIONAL);
+extern void CkSendMsgBranchGroup(int eIdx,void *msg,CkGroupID gID,CmiGroup grp, 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);
index e5c0da5117c11e5199ffde1492ff2628966035f3..67347ede3c80f357e049d92270060872615f15f9 100644 (file)
@@ -1699,6 +1699,25 @@ void CkSendMsgBranchMulti(int eIdx,void *msg,CkGroupID gID,int npes,int *pes, in
   CpvAccess(_qd)->create(npes);
 }
 
+extern "C"
+void CkSendMsgBranchGroup(int eIdx,void *msg,CkGroupID gID,CmiGroup grp, int opts)
+{
+  int npes;
+  int *pes;
+  if (opts & CK_MSG_IMMEDIATE) {
+    CmiAbort("CkSendMsgBranchGroup: immediate messages not supported!");
+    return;
+  }
+    // normal mesg
+  register envelope *env = _prepareMsgBranch(eIdx,msg,gID,ForBocMsg);
+  CmiLookupGroup(grp, &npes, &pes);
+  _TRACE_CREATION_MULTICAST(env, npes, pes);
+  CldEnqueueGroup(grp, env, _infoIdx);
+  _TRACE_CREATION_DONE(1);     // since it only creates one creation event.
+  _STATS_RECORD_SEND_BRANCH_N(npes);
+  CpvAccess(_qd)->create(npes);
+}
+
 extern "C"
 void CkBroadcastMsgBranch(int eIdx, void *msg, CkGroupID gID, int opts)
 {
index b52cf8181585ccb820d5d75718270b7ee7e6df2c..2b71294fe541385b22ea8efd5a9521883097bb7e 100644 (file)
@@ -1395,6 +1395,7 @@ char *CldGetStrategy(void);
 
 void CldEnqueue(int pe, void *msg, int infofn);
 void CldEnqueueMulti(int npes, int *pes, void *msg, int infofn);
+void CldEnqueueGroup(CmiGroup grp, void *msg, int infofn);
 void CldNodeEnqueue(int node, void *msg, int infofn);
 
 /****** CMM: THE MESSAGE MANAGER ******/
index 2cee805411a72dbf46c1b2440a31bbacf16af30c..710fdd5fbcfac8edf67cbac4492f78caad7533c0 100644 (file)
@@ -94,6 +94,11 @@ static int BgNumPes() { return BgNumNodes()*BgGetNumWorkThread(); }
                                     CmiGetHandler(msg), LARGE_WORK, len, msg);
 #endif
 
+void CldEnqueueGroup(CmiGroup grp, void *msg, int infofn)
+{
+  CmiAbort("CldEnqueueGroup not supported!");
+}
+
 void CldEnqueueMulti(int npes, int *pes, void *msg, int infofn)
 {
   int len, queueing, priobits,i; unsigned int *prioptr;
index 770580fa36364d712b0a8399e182387ef13b2c22..1dc078d2436b444fb0fb6d58b02657c037f81bdb 100644 (file)
@@ -290,6 +290,22 @@ void CldHandler(void *msg)
   CsdEnqueueGeneral(msg, CQS_QUEUEING_LIFO, priobits, prioptr);
 }
 
+void CldEnqueueGroup(CmiGroup grp, void *msg, int infofn)
+{
+  int len, queueing, priobits,i; unsigned int *prioptr;
+  CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
+  CldPackFn pfn;
+  ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
+  if (pfn) {
+    pfn(&msg);
+    ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
+  }
+  CldSwitchHandler(msg, CpvAccess(CldHandlerIndex));
+  CmiSetInfo(msg,infofn);
+
+  CmiSyncMulticastAndFree(grp, len, msg);
+}
+
 void CldEnqueueMulti(int npes, int *pes, void *msg, int infofn)
 {
   int len, queueing, priobits,i; unsigned int *prioptr;
index 669a446e0b56d27da2f33c9436387a0cf1cdad2d..2aad5c6fae131aedbb73fe2350e7e75e7e480372 100644 (file)
@@ -29,6 +29,22 @@ void CldHandler(char *msg)
   CsdEnqueueGeneral(msg, queueing, priobits, prioptr);
 }
 
+void CldEnqueueGroup(CmiGroup grp, void *msg, int infofn)
+{
+  int len, queueing, priobits,i; unsigned int *prioptr;
+  CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
+  CldPackFn pfn;
+  ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
+  if (pfn) {
+    pfn(&msg);
+    ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
+  }
+  CldSwitchHandler(msg, CpvAccess(CldHandlerIndex));
+  CmiSetInfo(msg,infofn);
+
+  CmiSyncMulticastAndFree(grp, len, msg);
+}
+
 void CldEnqueueMulti(int npes, int *pes, void *msg, int infofn)
 {
   int len, queueing, priobits,i; unsigned int *prioptr;
index 97b0c3acd3503dae8917e484dc64effae3a73dd5..3b82dbb48525854c2f5e2cc8b9d72f7c62b3f4f0 100644 (file)
@@ -143,6 +143,29 @@ void CldHopHandler(char *msg)
   }
 }
 
+void CldEnqueueGroup(CmiGroup grp, void *msg, int infofn)
+{
+  int len, queueing, priobits,i; unsigned int *prioptr;
+  CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
+  peinfo *pinf = &(CpvAccess(peinf));
+  CldPackFn pfn;
+  ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
+  if (pfn) {
+    pfn(&msg);
+    ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
+  }
+  CmiSetInfo(msg,infofn);
+  CmiSetXHandler(msg, CmiGetHandler(msg));
+  CmiSetHandler(msg, pinf->EnqueueHandler);
+  int npes;
+  int *pes;
+  CmiLookupGroup(grp, &npes, &pes);
+  for(i=0;i<npes;i++) {
+    CmiSyncSend(pes[i], len, msg);
+  }
+  CmiFree(msg);
+}
+
 void CldEnqueueMulti(int npes, int *pes, void *msg, int infofn)
 {
   int len, queueing, priobits,i; unsigned int *prioptr;