tweak pxshm to work for SMP build
authorGengbin Zheng <gzheng@illinois.edu>
Fri, 28 Oct 2011 03:54:18 +0000 (20:54 -0700)
committerGengbin Zheng <gzheng@illinois.edu>
Fri, 28 Oct 2011 03:54:18 +0000 (20:54 -0700)
src/arch/util/machine-common-core.c
src/arch/util/machine-pxshm.c
src/ck-core/init.C

index 7179d8dbfb1248121730172e146c03a444a54d8e..dca377b74132975daf03d10406b77e61f9b4ba5f 100644 (file)
@@ -459,25 +459,13 @@ void CmiFreeSendFn(int destPE, int size, char *msg) {
         if (phs) curphs++;
 #endif
     } else {
-#if CMK_USE_PXSHM
-        int ret=CmiValidPxshm(destPE, size);
-        if (ret) {
-          CMI_DEST_RANK(msg) = CmiRankOf(destPE);
-          CmiSendMessagePxshm(msg, size, destPE, &refcount, CmiRankOf(destPE), 0);
-          //for (int i=0; i<refcount; i++) CmiReference(msg);
 #if CMK_PERSISTENT_COMM
-        if (phs) curphs++;
-#endif
-          return;
+        if (phs && size > 8192) {
+            CmiAssert(curphs < phsSize);
+            LrtsSendPersistentMsg(phs[curphs++], destPE, size, msg);
+            return;
         }
 #endif
-#if CMK_PERSISTENT_COMM
-    if (phs && size > 8192) {
-        CmiAssert(curphs < phsSize);
-        LrtsSendPersistentMsg(phs[curphs++], destPE, size, msg);
-        return;
-    }
-#endif
 
         int destNode = CmiNodeOf(destPE);
 #if CMK_SMP
@@ -487,6 +475,17 @@ void CmiFreeSendFn(int destPE, int size, char *msg) {
         }
 #endif
         CMI_DEST_RANK(msg) = CmiRankOf(destPE);
+#if CMK_USE_PXSHM
+        int ret=CmiValidPxshm(destPE, size);
+        if (ret) {
+          CmiSendMessagePxshm(msg, size, destPE, &refcount, CmiRankOf(destPE), 0);
+          //for (int i=0; i<refcount; i++) CmiReference(msg);
+#if CMK_PERSISTENT_COMM
+          if (phs) curphs++;
+#endif
+          return;
+        }
+#endif
 if (  MSG_STATISTIC)
 {
     int ret_log = _cmi_log2(size);
@@ -759,6 +758,9 @@ static void CommunicationServer(int sleepTime) {
 
         ConverseCommonExit();
 
+#if CMK_USE_PXSHM
+        CmiExitPxshm();
+#endif
         LrtsExit();
     }
 #endif
@@ -777,9 +779,6 @@ void ConverseExit(void) {
     LrtsDrainResources();
 #endif
 
-#if CMK_USE_PXSHM
-        CmiExitPxshm();
-#endif
     ConverseCommonExit();
 
 if (MSG_STATISTIC)
@@ -797,6 +796,9 @@ if (MSG_STATISTIC)
 #endif
 
 #if !CMK_SMP
+#if CMK_USE_PXSHM
+    CmiExitPxshm();
+#endif
     LrtsExit();
 #else
     /* In SMP, the communication thread will exit */
index 88d19abcfebfbdb2f9de44c2f6a68e6c659ec5e7..8188e7958d91c105943d8788d948d8fc311644bf 100644 (file)
@@ -55,6 +55,7 @@ There are three options here for synchronization:
 
 
 /*** The following code was copied verbatim from pcqueue.h file ***/
+#if ! CMK_SMP
 #undef CmiMemoryWriteFence
 #if PXSHM_FENCE
 #ifdef POWER_PC
@@ -80,9 +81,13 @@ There are three options here for synchronization:
 #define CmiMemoryReadFence(startPtr,nBytes) 
 #endif
 
+#endif
+
+/*
 #if CMK_SMP
 #error  "PXSHM can only be used in non-smp build of Charm++"
 #endif
+*/
 
 /***************************************************************************************/
 
@@ -191,7 +196,8 @@ void initAllSendQs();
  *     currently just testing start up
  * ****************/
 void CmiInitPxshm(char **argv){
-       MACHSTATE(3,"CminitPxshm start");
+        MACHSTATE(3,"CminitPxshm start");
+
        pxshmContext = (PxshmContext *)calloc(1,sizeof(PxshmContext));
 
 #if CMK_NET_VERSION
@@ -248,9 +254,8 @@ void CmiInitPxshm(char **argv){
 void tearDownSharedBuffers();
 
 void CmiExitPxshm(){
-       int i=0;
-       
        if(pxshmContext->nodesize != 1){
+                int i;
                tearDownSharedBuffers();
        
                for(i=0;i<pxshmContext->nodesize;i++){
@@ -288,7 +293,8 @@ inline int CmiValidPxshm(int dst, int size){
        }*/
        //replace by bitmap later
        //if(ogm->dst >= pxshmContext->nodestart && ogm->dst <= pxshmContext->nodeend && ogm->size < SHMBUFLEN ){
-       if(dst >= pxshmContext->nodestart && dst <= pxshmContext->nodeend && size < SHMMAXSIZE ){
+        int node = CmiNodeOf(dst);
+       if(node >= pxshmContext->nodestart && node <= pxshmContext->nodeend && size < SHMMAXSIZE ){
                return 1;
        }else{
                return 0;
@@ -297,8 +303,9 @@ inline int CmiValidPxshm(int dst, int size){
 
 
 inline int PxshmRank(int dst){
-       return dst - pxshmContext->nodestart;
+       return CmiNodeOf(dst) - pxshmContext->nodestart;
 }
+
 inline void pushSendQ(PxshmSendQ *q, char *msg, int size, int *refcount);
 inline int sendMessage(char *msg, int size, int *refcount, sharedBufData *dstBuf,PxshmSendQ *dstSendQ);
 inline int flushSendQ(int dstRank);
index d3283bed05868a979543c3f6f68b321e9f5f8fc6..27857557a12679d534a0121cb88af0ed1cd25e16 100644 (file)
@@ -868,6 +868,7 @@ extern "C" void initCharmProjections();
 extern "C" void CmiInitCPUTopology(char **argv);
 extern "C" void CmiInitCPUAffinity(char **argv);
 extern "C" void CmiInitMemAffinity(char **argv);
+extern "C" void CmiInitPxshm(char **argv);
 
 //extern "C" void CldCallback();
 
@@ -1226,6 +1227,16 @@ void _initCharm(int unused_argc, char **argv)
         }
         CmiInitCPUTopology(argv);
     }
+
+#if CMK_USE_PXSHM
+      // for SMP on Cray XE6 (hopper) it seems pxshm has to be initialized
+      // again after cpuaffinity is done
+    if (CkMyRank() == 0) {
+      CmiInitPxshm(argv);
+    }
+    CmiNodeAllBarrier();
+#endif
+
     //CldCallback();
 #if CMK_BIGSIM_CHARM && CMK_CHARMDEBUG
       // Register the BG handler for CCS. Notice that this is put into a variable shared by