Added node-level groups.
authorMilind Bhandarkar <milind@cs.uiuc.edu>
Tue, 1 Jun 1999 04:05:24 +0000 (04:05 +0000)
committerMilind Bhandarkar <milind@cs.uiuc.edu>
Tue, 1 Jun 1999 04:05:24 +0000 (04:05 +0000)
src/arch/net-sol-cc/conv-mach.csh
src/ck-core/charm.h
src/ck-core/ck.C
src/ck-core/ck.h
src/ck-core/envelope.h
src/ck-core/init.C
src/ck-core/init.h
src/ck-core/stats.h
src/conv-core/converse.h
src/conv-ldb/cldb.rand.c

index e04e54501d60a40b68a1ccd94aa7bfb8276d3494..3ba6ee57c422b1091b09bed6a06014f62efbd156 100755 (executable)
@@ -10,8 +10,8 @@ set CMK_C_DEBUG='-g'
 set CMK_C_OPTIMIZE='-fast'
 set CMK_CXX_DEBUG='-g'
 set CMK_CXX_OPTIMIZE='-fast'
-set CMK_LD='cc'
-set CMK_LDXX='CC'
+set CMK_LD='cc '
+set CMK_LDXX='CC '
 set CMK_LD77=''
 set CMK_M4='m4'
 set CMK_SUF='o'
index fae6e4097f37cafd96ec548314716432a240586f..8dff2dd4edf5538949e2909b01f3ea3b7ca779df 100644 (file)
@@ -117,6 +117,8 @@ extern void CkCreateChare(int chareIdx, int constructorIdx, void *msg,
                           CkChareID *vid, int destPE);
 extern int CkCreateGroup(int chareIdx, int constructorIdx, void *msg,
                          int returnEpIdx, CkChareID *returnChare);
+extern int CkCreateNodeGroup(int chareIdx, int constructorIdx, void *msg,
+                         int returnEpIdx, CkChareID *returnChare);
 
 /******************************************************************************
  *
@@ -126,11 +128,14 @@ extern int CkCreateGroup(int chareIdx, int constructorIdx, void *msg,
 
 extern void CkSendMsg(int entryIndex, void *msg, CkChareID *chare);
 extern void CkSendMsgBranch(int entryIdx, void *msg, int destPE, int groupID);
+extern void CkSendMsgNodeBranch(int entryIdx, void *msg, int destNode, int groupID);
 extern void CkBroadcastMsgBranch(int entryIdx, void *msg, int groupID);
+extern void CkBroadcastMsgNodeBranch(int entryIdx, void *msg, int groupID);
 
 extern void CkSetRefNum(void *msg, int ref);
 extern int  CkGetRefNum(void *msg);
 extern int  CkGetSrcPe(void *msg);
+extern int  CkGetSrcNode(void *msg);
 
 /******************************************************************************
  *
@@ -140,6 +145,7 @@ extern int  CkGetSrcPe(void *msg);
 
 extern void* CkRemoteCall(int entryIdx, void *msg, CkChareID *chare);
 extern void* CkRemoteBranchCall(int entryIdx, void *msg, int groupID, int pe);
+extern void* CkRemoteNodeBranchCall(int entryIdx, void *msg, int groupID, int node);
 extern void  CkSendToFuture(int futNum, void *msg, int pe);
 
 /******************************************************************************
@@ -157,8 +163,10 @@ extern void CkStartQD(int entryIdx, CkChareID *chare);
  *****************************************************************************/
 
 extern void *CkLocalBranch(int groupID);
+extern void *CkLocalNodeBranch(int groupID);
 extern void  CkGetChareID(CkChareID *pcid);
 extern int   CkGetGroupID(void);
+extern int   CkGetNodeGroupID(void);
 extern void  CkExit(void);
 
 #ifdef __cplusplus
index fce8a0dc1ccf3a132f382cd2a0fd4a2a4c169ca3..eea5ea73b2588aea3c8c0bacca81699d247cf14f 100644 (file)
@@ -19,6 +19,12 @@ int CkGetSrcPe(void *msg)
   return UsrToEnv(msg)->getSrcPe();
 }
 
+extern "C"
+int CkGetSrcNode(void *msg)
+{
+  return CmiNodeOf(CkGetSrcPe(msg));
+}
+
 extern "C"
 void CkGetChareID(CkChareID *pCid) {
   pCid->onPE = CkMyPe();
@@ -30,6 +36,11 @@ int CkGetGroupID(void) {
   return CpvAccess(_currentGroup);
 }
 
+extern "C"
+int CkGetNodeGroupID(void) {
+  return CpvAccess(_currentNodeGroup);
+}
+
 static inline void *_allocNewChare(envelope *env)
 {
   return malloc(_chareTable[_entryTable[env->getEpIdx()]->chareIdx]->size);
@@ -93,6 +104,16 @@ static inline void _processForBocMsg(envelope *env)
   _processForChareMsg(env);
 }
 
+static inline void _processForNodeBocMsg(envelope *env)
+{
+  register int groupID = env->getGroupNum();
+  register void *obj = _nodeGroupTable->find(groupID);
+  env->setMsgtype(ForChareMsg);
+  env->setObjPtr(obj);
+  CpvAccess(_currentNodeGroup) = groupID;
+  _processForChareMsg(env);
+}
+
 static inline void _processFillVidMsg(envelope *env)
 {
   register VidBlock *vptr = (VidBlock *) env->getVidPtr();
@@ -119,6 +140,18 @@ static inline void _processDBocReqMsg(envelope *env)
   CpvAccess(_qd)->create();
 }
 
+static inline void _processDNodeBocReqMsg(envelope *env)
+{
+  assert(CkMyNode()==0);
+  register int groupNum = _numNodeGroups++;
+  env->setMsgtype(DNodeBocNumMsg);
+  register int srcNode = CmiNodeOf(env->getSrcPe());
+  env->setSrcPe(CkMyPe());
+  env->setGroupNum(groupNum);
+  CmiSyncNodeSendAndFree(srcNode, env->getTotalsize(), env);
+  CpvAccess(_qd)->create();
+}
+
 static inline void _processDBocNumMsg(envelope *env)
 {
   register envelope *usrenv = (envelope *) env->getUsrMsg();
@@ -128,6 +161,15 @@ static inline void _processDBocNumMsg(envelope *env)
   _createGroup(groupID, usrenv, retEp, retChare);
 }
 
+static inline void _processDNodeBocNumMsg(envelope *env)
+{
+  register envelope *usrenv = (envelope *) env->getUsrMsg();
+  register int retEp = env->getRetEp();
+  register CkChareID *retChare = (CkChareID *) EnvToUsr(env);
+  register int groupID = env->getGroupNum();
+  _createNodeGroup(groupID, usrenv, retEp, retChare);
+}
+
 void _processBocInitMsg(envelope *env)
 {
   register int groupID = env->getGroupNum();
@@ -135,6 +177,13 @@ void _processBocInitMsg(envelope *env)
   _createGroupMember(groupID, epIdx, EnvToUsr(env));
 }
 
+void _processNodeBocInitMsg(envelope *env)
+{
+  register int groupID = env->getGroupNum();
+  register int epIdx = env->getEpIdx();
+  _createNodeGroupMember(groupID, epIdx, EnvToUsr(env));
+}
+
 void _processHandler(void *msg)
 {
   CmiGrabBuffer(&msg);
@@ -156,15 +205,28 @@ void _processHandler(void *msg)
       CpvAccess(_qd)->process();
       if(env->isPacked()) _unpackFn((void **)&env);
       _processBocInitMsg(env);
+      break;    
+    case NodeBocInitMsg :
+      CpvAccess(_qd)->process();
+      if(env->isPacked()) _unpackFn((void **)&env);
+      _processNodeBocInitMsg(env);
       break;
     case DBocReqMsg:
       CpvAccess(_qd)->process();
       _processDBocReqMsg(env);
       break;
+    case DNodeBocReqMsg:
+      CpvAccess(_qd)->process();
+      _processDNodeBocReqMsg(env);
+      break;
     case DBocNumMsg:
       CpvAccess(_qd)->process();
       _processDBocNumMsg(env);
       break;
+    case DNodeBocNumMsg:
+      CpvAccess(_qd)->process();
+      _processDNodeBocNumMsg(env);
+      break;
     case ForChareMsg :
       CpvAccess(_qd)->process();
       if(env->isPacked()) _unpackFn((void **)&env);
@@ -177,6 +239,12 @@ void _processHandler(void *msg)
       _processForBocMsg(env);
       CpvAccess(_myStats)->recordProcessBranch();
       break;
+    case ForNodeBocMsg :
+      CpvAccess(_qd)->process();
+      if(env->isPacked()) _unpackFn((void **)&env);
+      _processForNodeBocMsg(env);
+      CpvAccess(_myStats)->recordProcessNodeBranch();
+      break;
     case ForVidMsg   :
       CpvAccess(_qd)->process();
       _processForVidMsg(env);
@@ -303,6 +371,21 @@ void _createGroupMember(int groupID, int eIdx, void *msg)
   CpvAccess(_myStats)->recordProcessGroup();
 }
 
+void _createNodeGroupMember(int groupID, int eIdx, void *msg)
+{
+  register int gIdx = _entryTable[eIdx]->chareIdx;
+  register void *obj = malloc(_chareTable[gIdx]->size);
+  _nodeGroupTable->add(groupID, obj);
+  register void *prev = CpvAccess(_currentChare);
+  CpvAccess(_currentChare) = obj;
+  register int prevGrp = CpvAccess(_currentNodeGroup);
+  CpvAccess(_currentNodeGroup) = groupID;
+  _entryTable[eIdx]->call(msg, obj);
+  CpvAccess(_currentChare) = prev;
+  CpvAccess(_currentNodeGroup) = prevGrp;
+  CpvAccess(_myStats)->recordProcessNodeGroup();
+}
+
 void _createGroup(int groupID, envelope *env, int retEp, CkChareID *retChare)
 {
   register int epIdx = env->getEpIdx();
@@ -338,6 +421,41 @@ void _createGroup(int groupID, envelope *env, int retEp, CkChareID *retChare)
   }
 }
 
+void _createNodeGroup(int groupID, envelope *env, int retEp, CkChareID *retChare)
+{
+  register int epIdx = env->getEpIdx();
+  register int msgIdx = env->getMsgIdx();
+  env->setGroupNum(groupID);
+  env->setSrcPe(CkMyPe());
+  register void *msg =  EnvToUsr(env);
+  if(CkNumNodes()>1) {
+    if(!env->isPacked() && _msgTable[msgIdx]->pack) {
+      msg = _msgTable[msgIdx]->pack(msg);
+      UsrToEnv(msg)->setPacked(1);
+    }
+    env = UsrToEnv(msg);
+    CmiSetHandler(env, _bocHandlerIdx);
+    _numInitMsgs++;
+    CmiSyncNodeBroadcast(env->getTotalsize(), env);
+    CpvAccess(_qd)->create(CkNumNodes()-1);
+    if(env->isPacked() && _msgTable[msgIdx]->unpack) {
+      if(CpvAccess(traceOn))
+        CpvAccess(_trace)->beginUnpack();
+      msg = _msgTable[msgIdx]->unpack(msg);
+      if(CpvAccess(traceOn))
+        CpvAccess(_trace)->endUnpack();
+      UsrToEnv(msg)->setPacked(0);
+    }
+  }
+  CpvAccess(_myStats)->recordCreateNodeGroup();
+  _createNodeGroupMember(groupID, epIdx, msg);
+  if(retChare) {
+    msg = CkAllocMsg(0, sizeof(int), 0); // 0 is a system msg of size int
+    *((int *)msg) = groupID;
+    CkSendMsg(retEp, msg, retChare);
+  }
+}
+
 static int _staticGroupCreate(envelope *env, int retEp, CkChareID *retChare)
 {
   register int groupNum = _numGroups++;
@@ -359,6 +477,27 @@ static void _dynamicGroupCreate(envelope *env, int retEp, CkChareID * retChare)
   CpvAccess(_qd)->create();
 }
 
+static int _staticNodeGroupCreate(envelope *env, int retEp, CkChareID *retChare)
+{
+  register int groupNum = _numNodeGroups++;
+  _createNodeGroup(groupNum, env, retEp, retChare);
+  return groupNum;
+}
+
+static void _dynamicNodeGroupCreate(envelope *env, int retEp, CkChareID * retChare)
+{
+  register CkChareID *msg = 
+    (CkChareID*) _allocMsg(DNodeBocReqMsg, sizeof(CkChareID));
+  *msg = *retChare;
+  register envelope *newenv = UsrToEnv((void *)msg);
+  newenv->setUsrMsg(env);
+  newenv->setSrcPe(CkMyPe());
+  newenv->setEpIdx(retEp);
+  CmiSetHandler(newenv, _charmHandlerIdx);
+  CmiSyncNodeSendAndFree(0, newenv->getTotalsize(), newenv); 
+  CpvAccess(_qd)->create();
+}
+
 extern "C"
 int CkCreateGroup(int cIdx, int eIdx, void *msg, int retEp,CkChareID *retChare)
 {
@@ -377,12 +516,36 @@ int CkCreateGroup(int cIdx, int eIdx, void *msg, int retEp,CkChareID *retChare)
   }
 }
 
+extern "C"
+int CkCreateNodeGroup(int cIdx, int eIdx, void *msg, int retEp,CkChareID *retChare)
+{
+  assert(cIdx == _entryTable[eIdx]->chareIdx);
+  register envelope *env = UsrToEnv(msg);
+  env->setMsgtype(NodeBocInitMsg);
+  env->setEpIdx(eIdx);
+  env->setSrcPe(CkMyPe());
+  if(CpvAccess(traceOn))
+    CpvAccess(_trace)->creation(env, CkNumNodes());
+  if(CkMyNode()==0) {
+    return _staticNodeGroupCreate(env, retEp, retChare);
+  } else {
+    _dynamicNodeGroupCreate(env, retEp, retChare);
+    return (-1);
+  }
+}
+
 extern "C"
 void *CkLocalBranch(int groupID)
 {
   return CpvAccess(_groupTable)->find(groupID);
 }
 
+extern "C"
+void *CkLocalNodeBranch(int groupID)
+{
+  return _nodeGroupTable->find(groupID);
+}
+
 static inline void _sendMsgBranch(int eIdx, void *msg, int gID, 
                            int pe=CLD_BROADCAST_ALL)
 {
@@ -414,3 +577,35 @@ void CkBroadcastMsgBranch(int eIdx, void *msg, int gID)
   CpvAccess(_myStats)->recordSendBranch(CkNumPes());
   CpvAccess(_qd)->create(CkNumPes());
 }
+
+static inline void _sendMsgNodeBranch(int eIdx, void *msg, int gID, 
+                           int pe=CLD_NODE_BROADCAST_ALL)
+{
+  register envelope *env = UsrToEnv(msg);
+  env->setMsgtype(ForNodeBocMsg);
+  env->setEpIdx(eIdx);
+  env->setGroupNum(gID);
+  env->setSrcPe(CkMyPe());
+  CmiSetHandler(env, _charmHandlerIdx);
+  CldEnqueue(pe, env, _infoIdx);
+}
+
+extern "C"
+void CkSendMsgNodeBranch(int eIdx, void *msg, int pe, int gID)
+{
+  if(CpvAccess(traceOn))
+    CpvAccess(_trace)->creation(UsrToEnv(msg));
+  _sendMsgNodeBranch(eIdx, msg, gID, pe);
+  CpvAccess(_myStats)->recordSendNodeBranch();
+  CpvAccess(_qd)->create();
+}
+
+extern "C"
+void CkBroadcastMsgNodeBranch(int eIdx, void *msg, int gID)
+{
+  if(CpvAccess(traceOn))
+    CpvAccess(_trace)->creation(UsrToEnv(msg), CkNumNodes());
+  _sendMsgNodeBranch(eIdx, msg, gID);
+  CpvAccess(_myStats)->recordSendNodeBranch(CkNumNodes());
+  CpvAccess(_qd)->create(CkNumNodes());
+}
index e91ea118e1eabf9b3e9e212c3a27aa5e38f65880..50a272a25c0ae9c0614dfa848a2aef56bc1218e9 100644 (file)
@@ -58,9 +58,11 @@ extern void _infoFn(void *msg, CldPackFn *pfn, int *len,
 extern void _packFn(void **msg);
 extern void _unpackFn(void **msg);
 extern void _createGroupMember(int groupID, int eIdx, void *env);
+extern void _createNodeGroupMember(int groupID, int eIdx, void *env);
 extern void _createGroup(int groupID, envelope *env, int retEp, 
                          CkChareID *retChare);
-
+extern void _createNodeGroup(int groupID, envelope *env, int retEp,
+                             CkChareID *retChare);
 /***********************/
 /* generated by charmc */
 /***********************/
index 667965d6e0094722a7ba5aefda89de6bb5978997..a47b5bb82dedc83e4e49d410d8e13bd0d713a315 100644 (file)
@@ -16,20 +16,24 @@ typedef unsigned char  UChar;
 #define QMASK    0x0F
 #define PMASK    0xF0
 
-#define NewChareMsg  1
-#define NewVChareMsg 2
-#define BocInitMsg   3
-#define ForChareMsg  4
-#define ForBocMsg    5
-#define ForVidMsg    6
-#define FillVidMsg   7
-#define DBocReqMsg   8
-#define DBocNumMsg   9
-#define RODataMsg    10
-#define ROMsgMsg     11
-#define ExitMsg      12
-#define ReqStatMsg   13
-#define StatMsg      14
+#define NewChareMsg    1
+#define NewVChareMsg   2
+#define BocInitMsg     3
+#define ForChareMsg    4
+#define ForBocMsg      5
+#define ForVidMsg      6
+#define FillVidMsg     7
+#define DBocReqMsg     8
+#define DBocNumMsg     9
+#define RODataMsg      10
+#define ROMsgMsg       11
+#define ExitMsg        12
+#define ReqStatMsg     13
+#define StatMsg        14
+#define NodeBocInitMsg 15
+#define ForNodeBocMsg  16
+#define DNodeBocReqMsg 17
+#define DNodeBocNumMsg 18
 
 // NewChareMsg : s1=epIdx
 // NewVChareMsg: ptr=vidPtr, s1=epIdx
@@ -42,6 +46,10 @@ typedef unsigned char  UChar;
 // RODataMsg   : i1=count
 // ROMsgMsg    : i1=roIdx
 // ForBocMsg   : i1=groupnum, s1=epidx
+// NodeBocInitMsg: i1=groupnum, s1=epidx
+// DNodeBocReqMsg: ptr=usrmsg, s1=retEp
+// DNodeBocNumMsg: ptr=usrmsg, i1=groupnum, s1=retEp
+// ForNodeBocMsg : i1=groupnum, s1=epIdx
 
 class envelope {
   private:
@@ -99,13 +107,15 @@ class envelope {
     UShort getEpIdx(void) const {
       assert(msgtype==NewChareMsg || msgtype==NewVChareMsg
           || msgtype==ForChareMsg || msgtype==ForVidMsg
-          || msgtype==BocInitMsg || msgtype==ForBocMsg);
+          || msgtype==BocInitMsg || msgtype==NodeBocInitMsg
+          || msgtype==ForBocMsg || msgtype==ForNodeBocMsg);
       return s1;
     }
     void   setEpIdx(const UShort idx) {
       assert(msgtype==NewChareMsg || msgtype==NewVChareMsg
           || msgtype==ForChareMsg || msgtype==ForVidMsg
-          || msgtype==BocInitMsg || msgtype==ForBocMsg);
+          || msgtype==BocInitMsg || msgtype==NodeBocInitMsg
+          || msgtype==ForBocMsg || msgtype==ForNodeBocMsg);
       s1 = idx;
     }
     void*  getVidPtr(void) const {
@@ -122,24 +132,34 @@ class envelope {
     void   setSrcPe(const UInt s) { pe = s; }
     void*  getObjPtr(void) const { assert(msgtype==ForChareMsg); return ptr; }
     void   setObjPtr(void *p) { assert(msgtype==ForChareMsg); ptr = p; }
-    UShort getRetEp(void) const { assert(msgtype==DBocReqMsg); return s1; }
-    void   setRetEp(const UShort e) { assert(msgtype==DBocReqMsg); s1 = e; }
+    UShort getRetEp(void) const {
+      assert(msgtype==DBocReqMsg || msgtype==DNodeBocReqMsg); 
+      return s1; 
+    }
+    void   setRetEp(const UShort e) {
+      assert(msgtype==DBocReqMsg || msgtype==DNodeBocReqMsg); 
+      s1 = e; 
+    }
     void*  getUsrMsg(void) const { 
-      assert(msgtype==DBocReqMsg || msgtype==DBocNumMsg); 
+      assert(msgtype==DBocReqMsg || msgtype==DBocNumMsg
+          || msgtype==DNodeBocReqMsg || msgtype==DNodeBocNumMsg); 
       return ptr; 
     }
     void   setUsrMsg(void *p) { 
-      assert(msgtype==DBocReqMsg || msgtype==DBocNumMsg); 
+      assert(msgtype==DBocReqMsg || msgtype==DBocNumMsg
+          || msgtype==DNodeBocReqMsg || msgtype==DNodeBocNumMsg); 
       ptr = p; 
     }
     UInt   getGroupNum(void) const {
       assert(msgtype==BocInitMsg || msgtype==ForBocMsg
-          || msgtype==DBocNumMsg);
+          || msgtype==DBocNumMsg || msgtype==NodeBocInitMsg
+          || msgtype==ForNodeBocMsg || msgtype==DNodeBocNumMsg);
       return i1;
     }
     void   setGroupNum(const UInt g) {
       assert(msgtype==BocInitMsg || msgtype==ForBocMsg
-          || msgtype==DBocNumMsg);
+          || msgtype==DBocNumMsg || msgtype==NodeBocInitMsg
+          || msgtype==ForNodeBocMsg || msgtype==DNodeBocNumMsg);
       i1 = g;
     }
 };
index 56a1a45c030714db1efc11fb25a7586500e8cbb0..294c19487bdb5910b15861aeb693871e53aa78bc 100644 (file)
@@ -5,11 +5,13 @@ UChar _defaultQueueing = CK_QUEUEING_FIFO;
 UInt  _printCS = 0;
 UInt  _printSS = 0;
 UInt  _numGroups = 0;
+UInt  _numNodeGroups = 0;
 UInt  _numInitMsgs = 0;
 int   _infoIdx;
 int   _charmHandlerIdx;
 int   _initHandlerIdx;
 int   _bocHandlerIdx;
+int   _nodeBocHandlerIdx;
 int   _qdHandlerIdx;
 
 CkOutStream ckout;
@@ -18,7 +20,9 @@ CkInStream  ckin;
 
 CpvDeclare(void*,       _currentChare);
 CpvDeclare(int,         _currentGroup);
+CpvDeclare(int,         _currentNodeGroup);
 CpvDeclare(GroupTable*, _groupTable);
+GroupTable* _nodeGroupTable = 0;
 CpvDeclare(Stats*, _myStats);
 CpvDeclare(MsgPool*, _msgPool);
 
@@ -28,6 +32,7 @@ CpvDeclare(_CkErrStream*, _ckerr);
 CpvStaticDeclare(UInt,  _numInitsRecd);
 CpvStaticDeclare(PtrQ*, _buffQ);
 CpvStaticDeclare(PtrQ*, _bocInitQ);
+CpvStaticDeclare(PtrQ*, _nodeBocInitQ);
 
 static int    _exitHandlerIdx;
 static Stats** _allStats = 0;
@@ -100,17 +105,21 @@ static inline void _printStats(void)
   }
   if(_printCS) {
     CkPrintf("Charm Kernel Detailed Statistics:\n");
-    CkPrintf("PE\tCC\tCP\tFCC\tFCP\tGC\tGP\tFGC\tFGP\n");
+    CkPrintf("PE\tCC\tCP\tFCC\tFCP\tGC\tNGC\tGP\tNGP\tFGC\tFNGC\tFGP\tFNGP\n");
     for(i=0;i<CkNumPes();i++) {
-      CkPrintf("%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",i,
+      CkPrintf("%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",i,
                _allStats[i]->getCharesCreated(),
                _allStats[i]->getCharesProcessed(),
                _allStats[i]->getForCharesCreated(),
                _allStats[i]->getForCharesProcessed(),
                _allStats[i]->getGroupsCreated(),
+               _allStats[i]->getNodeGroupsCreated(),
                _allStats[i]->getGroupsProcessed(),
+               _allStats[i]->getNodeGroupsProcessed(),
                _allStats[i]->getGroupMsgsCreated(),
-               _allStats[i]->getGroupMsgsProcessed());
+               _allStats[i]->getNodeGroupMsgsCreated(),
+               _allStats[i]->getGroupMsgsProcessed(),
+               _allStats[i]->getNodeGroupMsgsProcessed());
     }
   }
 }
@@ -178,6 +187,22 @@ static inline void _processBufferedBocInits(void)
   }
 }
 
+static inline void _processBufferedNodeBocInits(void)
+{
+  register envelope *env;
+  CmiNumberHandler(_nodeBocHandlerIdx, (CmiHandler)_processHandler);
+  while(env=(envelope *)CpvAccess(_nodeBocInitQ)->deq()) {
+    if(env->isPacked() && _msgTable[env->getMsgIdx()]->unpack) {
+      if(CpvAccess(traceOn))
+        CpvAccess(_trace)->beginUnpack();
+      env = UsrToEnv(_msgTable[env->getMsgIdx()]->unpack(EnvToUsr(env)));
+      if(CpvAccess(traceOn))
+        CpvAccess(_trace)->endUnpack();
+    }
+    _processNodeBocInitMsg(env);
+  }
+}
+
 static inline void _processBufferedMsgs(void)
 {
   CmiNumberHandler(_charmHandlerIdx,(CmiHandler)_processHandler);
@@ -197,6 +222,7 @@ static inline void _initDone(void)
 {
   CmiNumberHandler(_exitHandlerIdx, (CmiHandler)_exitHandler);
   _processBufferedBocInits();
+  _processBufferedNodeBocInits();
   _processBufferedMsgs();
 }
 
@@ -227,6 +253,10 @@ static void _initHandler(void *msg)
       CpvAccess(_qd)->process();
       CpvAccess(_bocInitQ)->enq(msg);
       break;
+    case NodeBocInitMsg:
+      CpvAccess(_qd)->process();
+      CpvAccess(_nodeBocInitQ)->enq(msg);
+      break;
     case ROMsgMsg:
       CpvAccess(_qd)->process();
       if(env->isPacked()) _unpackFn((void **)&env);
@@ -249,6 +279,7 @@ void CkExit(void)
 {
   CmiNumberHandler(_charmHandlerIdx,(CmiHandler)_discardHandler);
   CmiNumberHandler(_bocHandlerIdx, (CmiHandler)_discardHandler);
+  CmiNumberHandler(_nodeBocHandlerIdx, (CmiHandler)_discardHandler);
   if(CkMyPe()==0) {
     if(_exitStarted)
       return;
@@ -348,8 +379,10 @@ void _initCharm(int argc, char **argv)
 {
   CpvInitialize(PtrQ*,_buffQ);
   CpvInitialize(PtrQ*,_bocInitQ);
+  CpvInitialize(PtrQ*,_nodeBocInitQ);
   CpvInitialize(void*, _currentChare);
   CpvInitialize(int, _currentGroup);
+  CpvInitialize(int, _currentNodeGroup);
   CpvInitialize(GroupTable*, _groupTable);
   CpvInitialize(UInt, _numInitsRecd);
   CpvInitialize(QdState*, _qd);
@@ -362,7 +395,11 @@ void _initCharm(int argc, char **argv)
 
   CpvAccess(_buffQ) = new PtrQ();
   CpvAccess(_bocInitQ) = new PtrQ();
+  CpvAccess(_nodeBocInitQ) = new PtrQ();
   CpvAccess(_groupTable) = new GroupTable();
+  if(CmiMyRank()==0)
+    _nodeGroupTable = new GroupTable();
+  CmiNodeBarrier();
   CpvAccess(_qd) = new QdState();
   CpvAccess(_numInitsRecd) = 0;
 
@@ -373,6 +410,7 @@ void _initCharm(int argc, char **argv)
   _initHandlerIdx = CmiRegisterHandler((CmiHandler)_initHandler);
   _exitHandlerIdx = CmiRegisterHandler((CmiHandler)_bufferHandler);
   _bocHandlerIdx = CmiRegisterHandler((CmiHandler)_initHandler);
+  _nodeBocHandlerIdx = CmiRegisterHandler((CmiHandler)_initHandler);
   _qdHandlerIdx = CmiRegisterHandler((CmiHandler)_qdHandler);
   _infoIdx = CldRegisterInfoFn(_infoFn);
   CldRegisterEstimator(_charmLoadEstimator);
index f9b979796f859d0535c1cb9ba32e87b060bd5f7e..5e1e567638f3c8188a6a116b1ceab7ffb4062d7e 100644 (file)
@@ -71,18 +71,23 @@ extern UInt    _printCS;
 extern UInt    _printSS;
 
 extern UInt    _numGroups;
+extern UInt    _numNodeGroups;
 extern int     _infoIdx;
 extern UInt    _numInitMsgs;
 extern int     _charmHandlerIdx;
 extern int     _initHandlerIdx;
 extern int     _bocHandlerIdx;
+extern int     _nodeBocHandlerIdx;
 extern int     _qdHandlerIdx;
 
 CpvExtern(void*,       _currentChare);
 CpvExtern(int,         _currentGroup);
+CpvExtern(int,         _currentNodeGroup);
 CpvExtern(GroupTable*, _groupTable);
 
+extern GroupTable*    _nodeGroupTable;
+
 extern void _initCharm(int argc, char **argv);
 extern void _processBocInitMsg(envelope *);
-
+extern void _processNodeBocInitMsg(envelope *);
 #endif
index 2fe0ae70d2ce91614c4c25dd1740eefac8dc74ea..f1929083310effb5228c440ebfe2f5977ea71011 100644 (file)
@@ -11,6 +11,10 @@ class Stats {
     UInt groupInitsProcessed; // # of groupinits processed
     UInt groupMsgsCreated; // # of for group msgs created
     UInt groupMsgsProcessed; // # of for group msgs processed
+    UInt nodeGroupInitsCreated; // # of node group init msgs created
+    UInt nodeGroupInitsProcessed; // # of node group inits processed
+    UInt nodeGroupMsgsCreated; // # of for nodegroup msgs created
+    UInt nodeGroupMsgsProcessed; // # of for nodegroup msgs processed
   public:
     void *operator new(size_t size) { return _allocMsg(StatMsg, size); }
     void operator delete(void *ptr) { CkFreeMsg(ptr); }
@@ -23,6 +27,10 @@ class Stats {
       groupInitsProcessed = 0; 
       groupMsgsCreated = 0; 
       groupMsgsProcessed = 0; 
+      nodeGroupInitsCreated = 0; 
+      nodeGroupInitsProcessed = 0; 
+      nodeGroupMsgsCreated = 0; 
+      nodeGroupMsgsProcessed = 0; 
     }
     void combine(const Stats* const other) {
       charesCreated += other->charesCreated; 
@@ -33,6 +41,10 @@ class Stats {
       groupInitsProcessed += other->groupInitsProcessed; 
       groupMsgsCreated += other->groupMsgsCreated; 
       groupMsgsProcessed += other->groupMsgsProcessed; 
+      nodeGroupInitsCreated += other->nodeGroupInitsCreated; 
+      nodeGroupInitsProcessed += other->nodeGroupInitsProcessed; 
+      nodeGroupMsgsCreated += other->nodeGroupMsgsCreated; 
+      nodeGroupMsgsProcessed += other->nodeGroupMsgsProcessed; 
     }
     void recordCreateChare(int x=1) { charesCreated += x; }
     void recordProcessChare(int x=1) { charesProcessed += x; }
@@ -42,6 +54,10 @@ class Stats {
     void recordProcessGroup(int x=1) { groupInitsProcessed += x; }
     void recordSendBranch(int x=1) { groupMsgsCreated += x; }
     void recordProcessBranch(int x=1) { groupMsgsProcessed += x; }
+    void recordCreateNodeGroup(int x=1) { nodeGroupInitsCreated += x; }
+    void recordProcessNodeGroup(int x=1) { nodeGroupInitsProcessed += x; }
+    void recordSendNodeBranch(int x=1) { nodeGroupMsgsCreated += x; }
+    void recordProcessNodeBranch(int x=1) { nodeGroupMsgsProcessed += x; }
     UInt getCharesCreated(void) const { return charesCreated; }
     UInt getCharesProcessed(void) const { return charesProcessed; }
     UInt getForCharesCreated(void) const { return forCharesCreated; }
@@ -50,6 +66,10 @@ class Stats {
     UInt getGroupsProcessed(void) const { return groupInitsProcessed; }
     UInt getGroupMsgsCreated(void) const { return groupMsgsCreated; }
     UInt getGroupMsgsProcessed(void) const { return groupMsgsProcessed; }
+    UInt getNodeGroupsCreated(void) const { return nodeGroupInitsCreated; }
+    UInt getNodeGroupsProcessed(void) const { return nodeGroupInitsProcessed; }
+    UInt getNodeGroupMsgsCreated(void) const { return nodeGroupMsgsCreated; }
+    UInt getNodeGroupMsgsProcessed(void) const { return nodeGroupMsgsProcessed; }
 };
 
 CpvExtern(Stats*, _myStats);
index 3507109b54b039dfd44b13c4f8878168560ed65b..3ada416fc8cf690d04b9dac7360f90b4e341953d 100644 (file)
@@ -878,6 +878,8 @@ void CfutureInit();
 #define CLD_ANYWHERE (-1)
 #define CLD_BROADCAST (-2)
 #define CLD_BROADCAST_ALL (-3)
+#define CLD_NODE_BROADCAST (-4)
+#define CLD_NODE_BROADCAST_ALL (-5)
 
 typedef void (*CldPackFn)(void *msg);
 
index 958e633e6711c5b0d336ff68ca3a5e08757b1f8a..a44b4fba62f94d832e2ed16c601284625a99790d 100644 (file)
@@ -43,8 +43,10 @@ void CldEnqueue(int pe, void *msg, int infofn)
     }
     CldSwitchHandler(msg, CpvAccess(CldHandlerIndex));
     CmiSetInfo(msg,infofn);
-    if (pe==CLD_BROADCAST) CmiSyncBroadcastAndFree(len, msg);
-    else if (pe==CLD_BROADCAST_ALL) CmiSyncBroadcastAllAndFree(len, msg);
+    if (pe==CLD_BROADCAST) { CmiSyncBroadcastAndFree(len, msg); }
+    else if (pe==CLD_NODE_BROADCAST) { CmiSyncNodeBroadcastAndFree(len, msg); }
+    else if (pe==CLD_BROADCAST_ALL) { CmiSyncBroadcastAllAndFree(len, msg); }
+    else if (pe==CLD_NODE_BROADCAST_ALL) { CmiSyncNodeBroadcastAllAndFree(len, msg); }
     else CmiSyncSendAndFree(pe, len, msg);
   }
 }