a better implementation of ringexit, it tries to span the token group as far as possi...
authorGengbin Zheng <gzheng@illinois.edu>
Wed, 4 Oct 2006 08:09:21 +0000 (08:09 +0000)
committerGengbin Zheng <gzheng@illinois.edu>
Wed, 4 Oct 2006 08:09:21 +0000 (08:09 +0000)
src/ck-core/init.C

index adbdc1b3d2777adbd9460e7c7af1298fc44d89ff..bd2a40845c995df6d84a5357a2902d065e5f1b74 100644 (file)
@@ -189,6 +189,7 @@ static inline void _parseCommandLineOpts(char **argv)
     _ringexit = 1;
     if (CkMyPe()==0)
       CkPrintf("Charm++> Program shutdown in token ring (%d).\n", _ringtoken);
+    if (_ringtoken > CkNumPes())  _ringtoken = CkNumPes();
   }
        /*
                FAULT_EVAC
@@ -292,9 +293,12 @@ static void _exitHandler(envelope *env)
       // if exit in ring, instead of broadcasting, send in ring
       if (_ringexit){
        DEBUGF(("[%d] Ring Exit \n",CkMyPe()));
-        for (int i=0; i<_ringtoken; i++)
-          if (i<CkNumPes())
-            CmiSyncSend(i, env->getTotalsize(), (char *)env);
+        const int stride = CkNumPes()/_ringtoken;
+        int pe = 0;
+        while (pe<CkNumPes()) {
+          CmiSyncSend(pe, env->getTotalsize(), (char *)env);
+          pe += stride;
+        }
         CmiFree(env);
       }else{
        CmiSyncBroadcastAllAndFree(env->getTotalsize(), (char *)env);
@@ -318,8 +322,14 @@ static void _exitHandler(envelope *env)
 #ifndef CMK_OPTIMIZE
       if (_ringexit) traceClose();
 #endif
-      if (_ringexit && CkMyPe()+_ringtoken < CkNumPes())
-        CmiSyncSendAndFree(CkMyPe()+_ringtoken, env->getTotalsize(), (char *)env);
+      if (_ringexit) {
+        int stride = CkNumPes()/_ringtoken;
+        int pe = CkMyPe()+1;
+        if (pe < CkNumPes() && pe % stride != 0)
+          CmiSyncSendAndFree(pe, env->getTotalsize(), (char *)env);
+        else
+          CmiFree(env);
+      }
       else
         CmiFree(env);
       if(CkMyPe()){