Preparing to support bigemulator CCS:
authorFilippo Gioachin <gioachin@uiuc.edu>
Fri, 19 Mar 2010 07:07:02 +0000 (02:07 -0500)
committerFilippo Gioachin <gioachin@uiuc.edu>
Fri, 19 Mar 2010 07:07:02 +0000 (02:07 -0500)
Created new file middle-ccs.C that contains CCS code that needs to execute in the virtual processors.
The file cannot be pure C due to CpvAccess in blue.h which uses C++ templates (included from bgconverse.h)

src/conv-ccs/conv-ccs.c
src/conv-ccs/middle-ccs.C [new file with mode: 0644]
src/scripts/Make.depends
src/scripts/Makefile

index 4571f4fec4487bf2f47c44572c4fbb101503d5b3..f5400e051b077d2d4b0a2fd2dc92264ef910051e 100644 (file)
@@ -261,7 +261,7 @@ delivery.
   Deliver the given message data to the given
 CCS handler.
 */
-static void CcsHandleRequest(CcsImplHeader *hdr,const char *reqData)
+void CcsHandleRequest(CcsImplHeader *hdr,const char *reqData)
 {
   char *cmsg;
   int reqLen=ChMessageInt(hdr->len);
@@ -288,40 +288,6 @@ static void CcsHandleRequest(CcsImplHeader *hdr,const char *reqData)
 
 /*Unpacks request message to call above routine*/
 int _ccsHandlerIdx = 0;/*Converse handler index of below routine*/
-static void req_fw_handler(char *msg)
-{
-  int offset = CmiReservedHeaderSize + sizeof(CcsImplHeader);
-  CcsImplHeader *hdr = (CcsImplHeader *)(msg+CmiReservedHeaderSize);
-  int destPE = (int)ChMessageInt(hdr->pe);
-  if (CmiMyPe() == 0 && destPE == -1) {
-    /* Broadcast message to all other processors */
-    int len=CmiReservedHeaderSize+sizeof(CcsImplHeader)+ChMessageInt(hdr->len);
-    CmiSyncBroadcast(len, msg);
-  }
-  else if (destPE < -1) {
-    /* Multicast the message to your children */
-    int len=CmiReservedHeaderSize+sizeof(CcsImplHeader)+ChMessageInt(hdr->len)-destPE*sizeof(ChMessageInt_t);
-    int index, child, i;
-    int *pes = (int*)(msg+CmiReservedHeaderSize+sizeof(CcsImplHeader));
-    ChMessageInt_t *pes_nbo = (ChMessageInt_t *)pes;
-    offset -= destPE * sizeof(ChMessageInt_t);
-    if (ChMessageInt(pes_nbo[0]) == CmiMyPe()) {
-      for (index=0; index<-destPE; ++index) pes[index] = ChMessageInt(pes_nbo[index]);
-    }
-    for (index=0; index<-destPE; ++index) {
-      if (pes[index] == CmiMyPe()) break;
-    }
-    child = (index << 2) + 1;
-    for (i=0; i<4; ++i) {
-      if (child+i < -destPE) {
-        CmiSyncSend(pes[child+i], len, msg);
-      }
-    }
-  }
-  CcsHandleRequest(hdr, msg+offset);
-  CmiFree(msg);
-}
-
 #if ! NODE_0_IS_CONVHOST
 /* The followings are necessary to prevent CCS requests to be processed before
  * CCS has been initialized. Really it matters only when NODE_0_IS_CONVHOST=0, but
@@ -340,6 +306,8 @@ void CcsBufferMessage(char *msg) {
   CcsNumBufferedMsgs ++;
 }
   
+extern void req_fw_handler(char *msg);
+
 void CcsReleaseMessages() {
 #if ! NODE_0_IS_CONVHOST
   if (CcsNumBufferedMsgs > 0) {
diff --git a/src/conv-ccs/middle-ccs.C b/src/conv-ccs/middle-ccs.C
new file mode 100644 (file)
index 0000000..82521da
--- /dev/null
@@ -0,0 +1,42 @@
+#include "converse.h"
+
+#if CMK_BLUEGENE_CHARM
+#include "bgconverse.h"
+#endif
+#include "ccs-server.h"
+
+extern "C" void CcsHandleRequest(CcsImplHeader *hdr,const char *reqData);
+
+extern "C" void req_fw_handler(char *msg)
+{
+  int offset = CmiReservedHeaderSize + sizeof(CcsImplHeader);
+  CcsImplHeader *hdr = (CcsImplHeader *)(msg+CmiReservedHeaderSize);
+  int destPE = (int)ChMessageInt(hdr->pe);
+  if (CmiMyPe() == 0 && destPE == -1) {
+    /* Broadcast message to all other processors */
+    int len=CmiReservedHeaderSize+sizeof(CcsImplHeader)+ChMessageInt(hdr->len);
+    CmiSyncBroadcast(len, msg);
+  }
+  else if (destPE < -1) {
+    /* Multicast the message to your children */
+    int len=CmiReservedHeaderSize+sizeof(CcsImplHeader)+ChMessageInt(hdr->len)-destPE*sizeof(ChMessageInt_t);
+    int index, child, i;
+    int *pes = (int*)(msg+CmiReservedHeaderSize+sizeof(CcsImplHeader));
+    ChMessageInt_t *pes_nbo = (ChMessageInt_t *)pes;
+    offset -= destPE * sizeof(ChMessageInt_t);
+    if (ChMessageInt(pes_nbo[0]) == CmiMyPe()) {
+      for (index=0; index<-destPE; ++index) pes[index] = ChMessageInt(pes_nbo[index]);
+    }
+    for (index=0; index<-destPE; ++index) {
+      if (pes[index] == CmiMyPe()) break;
+    }
+    child = (index << 2) + 1;
+    for (i=0; i<4; ++i) {
+      if (child+i < -destPE) {
+        CmiSyncSend(pes[child+i], len, msg);
+      }
+    }
+  }
+  CcsHandleRequest(hdr, msg+offset);
+  CmiFree(msg);
+}
index f3dc9489e04edff1f1c0112dc3569ac0d6776419..dd86bf58c956dcd5aea14aefedbf3ac952ec200b 100644 (file)
@@ -87,6 +87,9 @@ conv-ccs.o: conv-ccs.c converse.h conv-config.h conv-autoconfig.h \
  ckhashtable.h pup.h ccs-server.c ccs-auth.h ccs-auth.c
        $(CHARMC) -c -I. conv-ccs.c
 
+middle-ccs.o: converse.h bgconverse.h
+       $(CHARMC) -c -I. middle-ccs.C
+
 ccs-builtins.o: ccs-builtins.C converse.h conv-config.h conv-autoconfig.h \
  conv-common.h conv-mach.h conv-mach-opt.h pup_c.h queueing.h conv-cpm.h \
  conv-cpath.h conv-qd.h conv-random.h conv-lists.h conv-trace.h \
index 0cf3d37740b295c5ea3fa53600167ffb46163b53..cd9e913398d6fd8d14f2e6d62a921de8521b5cc0 100644 (file)
@@ -358,7 +358,7 @@ CVLIBS=$(L)/libconv-core.a \
 
 LIBCONV_CORE= convcore.o conv-conds.o queueing.o msgmgr.o \
        cpm.o cpthreads.o futures.o cldb.o topology.o random.o \
-       debug-conv.o generate.o edgelist.o conv-ccs.o ccs-builtins.o \
+       debug-conv.o generate.o edgelist.o conv-ccs.o ccs-builtins.o middle-ccs.o \
        traceCore.o traceCoreCommon.o tracec.o \
        converseProjections.o machineProjections.o \
        quiescence.o isomalloc.o mem-arena.o conv-counter.o \