fixed a bug in MultiRing where the sorting of the data was causing problems.
authorFilippo Gioachin <gioachin@illinois.edu>
Thu, 21 Jul 2005 01:43:00 +0000 (01:43 +0000)
committerFilippo Gioachin <gioachin@illinois.edu>
Thu, 21 Jul 2005 01:43:00 +0000 (01:43 +0000)
Now getNewMessage has a parameter for requesting the sorting of the processors.

src/ck-com/ComlibSectionInfo.C
src/ck-com/ComlibSectionInfo.h
src/ck-com/DirectMulticastStrategy.C
src/ck-com/DirectMulticastStrategy.h
src/ck-com/MultiRingMulticast.C
src/ck-com/MultiRingMulticast.h

index e79c697cc33b97f3441a9e031d90fca5d5c6fe7e..31830cadb7793b8a1da6596b5a86a872248d848f 100644 (file)
@@ -3,8 +3,7 @@
 #include "ComlibManager.h"
 #include "ComlibSectionInfo.h"
 
-ComlibMulticastMsg * ComlibSectionInfo::getNewMulticastMessage
-(CharmMessageHolder *cmsg){
+ComlibMulticastMsg * ComlibSectionInfo::getNewMulticastMessage(CharmMessageHolder *cmsg, int needSort){
     
     if(cmsg->sec_id == NULL || cmsg->sec_id->_nElems == 0)
         return NULL;
@@ -21,7 +20,7 @@ ComlibMulticastMsg * ComlibSectionInfo::getNewMulticastMessage
     int nRemotePes, nRemoteIndices;
     ComlibMulticastIndexCount *indicesCount;
     int *belongingList;
-    getRemotePeCount(cmsg->sec_id->_nElems, cmsg->sec_id->_elems, nRemotePes, nRemoteIndices, indicesCount, belongingList);
+    getPeCount(cmsg->sec_id->_nElems, cmsg->sec_id->_elems, nRemotePes, nRemoteIndices, indicesCount, belongingList);
     if (nRemotePes == 0) return NULL;
 
     int sizes[3];
@@ -38,13 +37,33 @@ ComlibMulticastMsg * ComlibSectionInfo::getNewMulticastMessage
     msg->_cookie.sInfo.cInfo.status = COMLIB_MULTICAST_NEW_SECTION;
     msg->_cookie.type = COMLIB_MULTICAST_MESSAGE;
     msg->_cookie.pe = CkMyPe();
-    
+
     // fill in the three pointers of the ComlibMulticastMsg
     memcpy(msg->indicesCount, indicesCount, sizes[0] * sizeof(ComlibMulticastIndexCount));
     //memcpy(msg->indices, cmsg->sec_id->_elems, sizes[1] * sizeof(CkArrayIndexMax));
+
     CkArrayIndexMax **indicesPe = (CkArrayIndexMax**)alloca(nRemotePes * sizeof(CkArrayIndexMax*));
-    indicesPe[0] = msg->indices;
-    for (int i=1; i<nRemotePes; ++i) indicesPe[i] = indicesPe[i-1] + indicesCount[i-1].count;
+
+    if (needSort) {
+      // if we are sorting the array, then we need to fix the problem that belongingList
+      // refers to the original ordering! This is done by mapping indicesPe in a way coherent
+      // with the original ordering.
+      int previous, i, j;
+      qsort(msg->indicesCount, sizes[0], sizeof(ComlibMulticastIndexCount), indexCountCompare);
+
+      for (j=0; j<nRemotePes; ++j) if (indicesCount[j].pe == msg->indicesCount[0].pe) break;
+      indicesPe[j] = msg->indices;
+      previous = j;
+      for (i=1; i<nRemotePes; ++i) {
+       for (j=0; j<nRemotePes; ++j) if (indicesCount[j].pe == msg->indicesCount[i].pe) break;
+       indicesPe[j] = indicesPe[previous] + indicesCount[previous].count;
+        previous = j;
+      }
+    } else {
+      indicesPe[0] = msg->indices;
+      for (int i=1; i<nRemotePes; ++i) indicesPe[i] = indicesPe[i-1] + indicesCount[i-1].count;
+    }
+
     for (int i=0; i<cmsg->sec_id->_nElems; ++i) {
       if (belongingList[i] >= 0) {
        *indicesPe[belongingList[i]] = cmsg->sec_id->_elems[i];
@@ -87,6 +106,11 @@ void ComlibSectionInfo::unpack(envelope *cb_env,
     CkAssert(i < ccmsg->nPes);
     nLocalElems = ccmsg->indicesCount[i].count;
 
+    /*
+    CkPrintf("Unpacking: %d local elements:",nLocalElems);
+    for (int j=0; j<nLocalElems; ++j) CkPrintf(" %d",((int*)&dest_indices[j])[1]);
+    CkPrintf("\n");
+    */
     /*
     for(int count = 0; count < ccmsg->nIndices; count++){
         CkArrayIndexMax idx = ccmsg->indices[count];
@@ -156,7 +180,7 @@ void ComlibSectionInfo::getPeList(int _nElems,
 }
 
 
-void ComlibSectionInfo::getRemotePeCount(int nindices, CkArrayIndexMax *idxlist, 
+void ComlibSectionInfo::getPeCount(int nindices, CkArrayIndexMax *idxlist, 
                      int &npes, int &nidx,
                      ComlibMulticastIndexCount *&counts, int *&belongs) {
   int count = 0;
@@ -173,15 +197,10 @@ void ComlibSectionInfo::getRemotePeCount(int nindices, CkArrayIndexMax *idxlist,
 
   for(i=0; i<nindices; ++i){
     int p = ComlibGetLastKnown(destArrayID, idxlist[i]);
-    if(p == CkMyPe()) {
-      belongs[i] = -1;
-      continue;
-    }
     
     if(p == -1) CkAbort("Invalid Section\n");        
 
-    ++nidx;
-    //Collect remote processors
+    //Collect processors
     for(count = 0; count < npes; count ++)
       if(counts[count].pe == p)
        break;
@@ -192,10 +211,17 @@ void ComlibSectionInfo::getRemotePeCount(int nindices, CkArrayIndexMax *idxlist,
       ++npes;
     }
 
+    if(p == CkMyPe()) {
+      belongs[i] = -1;
+      continue;
+    }
+
+    ++nidx;
     counts[count].count++;
     belongs[i] = count;
   }
-  
+  //CkPrintf("section has %d procs\n",npes);
+
   if(npes == 0) {
     delete [] counts;
     delete [] belongs;
index 27029a8f66281542ce7e3c50d55b7ee966b4f234..7d0a643f322f47bdbee579150b54366ac6ce223f 100644 (file)
@@ -136,8 +136,9 @@ class ComlibSectionInfo {
      * Starting from a message to be sent, it generates a new message containing
      * the information about the multicast, together with the message itself.
      * The info about the multicast is contained in the field sec_id of cmsg.
+     * The processors will be order by MyPe() if requested.
      */
-    ComlibMulticastMsg *getNewMulticastMessage(CharmMessageHolder *cmsg);
+    ComlibMulticastMsg *getNewMulticastMessage(CharmMessageHolder *cmsg, int needSort);
 
     /**
      * Given a ComlibMulticastMsg arrived through the network as input (cb_env),
@@ -165,9 +166,9 @@ class ComlibSectionInfo {
      * @param counts array of associations pe-count: number of elements in proc pe (output, new'ed(CkNumPes()))
      * @param belongs array of integers expressing association of elements with pes: belongs[i] = index in counts of the processor having index i (output, new'ed(nidx))
     */
-    void getRemotePeCount(int nindices, CkArrayIndexMax *idxlist, 
-                         int &npes, int &nidx,
-                         ComlibMulticastIndexCount *&counts, int *&belongs);
+    void getPeCount(int nindices, CkArrayIndexMax *idxlist, 
+                   int &npes, int &nidx,
+                   ComlibMulticastIndexCount *&counts, int *&belongs);
 
     void getRemotePelist(int nindices, CkArrayIndexMax *idxlist, 
                          int &npes, int *&pelist);
index ccbad98dc1e22f959ac422aaa4b58aef1bde768a..80a98fe320ae01082ee1710a52e909b8d9b71d4d 100644 (file)
@@ -88,9 +88,9 @@ void DirectMulticastStrategy::insertMessage(CharmMessageHolder *cmsg){
             localMulticast(env, obj);
             remoteMulticast(env, obj);
         }
-        else {            
+        else {
             //New sec id, so send it along with the message
-            void *newmsg = sinfo.getNewMulticastMessage(cmsg);
+            void *newmsg = sinfo.getNewMulticastMessage(cmsg, needSorting());
             insertSectionID(sid);
 
             ComlibSectionHashKey 
@@ -98,9 +98,30 @@ void DirectMulticastStrategy::insertMessage(CharmMessageHolder *cmsg){
             
             ComlibSectionHashObject *obj = sec_ht.get(key);
 
-            if(obj == NULL)
+           if(obj == NULL)
                 CkAbort("Cannot Find Section\n");
-            
+
+            /*
+           CkPrintf("%u: Src = %d dest:", key.hash(), CkMyPe());
+           for (int i=0; i<obj->npes; ++i)
+             CkPrintf(" %d",obj->pelist[i]);
+           CkPrintf(", map:");
+           ComlibMulticastMsg *lll = (ComlibMulticastMsg*)newmsg;
+           envelope *ppp = UsrToEnv(newmsg);
+           CkUnpackMessage(&ppp);
+           int ttt=0;
+           for (int i=0; i<lll->nPes; ++i) {
+             CkPrintf(" %d (",lll->indicesCount[i].pe);
+             for (int j=0; j<lll->indicesCount[i].count; ++j) {
+               CkPrintf(" %d",((int*)&(lll->indices[ttt]))[1]);
+               ttt++;
+             }
+             CkPrintf(" )");
+           }
+           CkPackMessage(&ppp);
+           CkPrintf("\n");
+           */
+
             char *msg = cmsg->getCharmMessage();
             localMulticast(UsrToEnv(msg), obj);
             CkFreeMsg(msg);
@@ -127,6 +148,7 @@ void DirectMulticastStrategy::insertSectionID(CkSectionID *sid) {
     
     obj = createObjectOnSrcPe(sid->_nElems, sid->_elems);
     sec_ht.put(key) = obj;
+
 }
 
 
@@ -329,6 +351,14 @@ void DirectMulticastStrategy::handleNewMulticastMessage(envelope *env) {
     
     sec_ht.put(key) = new_obj;
 
+    /*
+    CkPrintf("%u: Proc = %d (%d) forward:", key.hash(), CkMyPe(),cbmsg->nPes);
+    for (int i=0; i<new_obj->npes; ++i) CkPrintf(" %d",new_obj->pelist[i]);
+    CkPrintf(", deliver:");
+    for (int i=0; i<new_obj->indices.size(); ++i) CkPrintf(" %d",((int*)&new_obj->indices[i])[1]);
+    CkPrintf("\n");
+    */
+
     remoteMulticast(env, new_obj);
     localMulticast(newenv, new_obj); //local multicast always copies
     CmiFree(newenv);                
index 52554d377144085aaf9481827a6e1290b41e617f..6d4d5c797a24b5803060b154cee36e0768a41f75 100644 (file)
@@ -46,6 +46,9 @@ class DirectMulticastStrategy: public CharmStrategy {
      */
     virtual ComlibSectionHashObject *createObjectOnIntermediatePe(int nindices, CkArrayIndexMax *idxlist, int npes, ComlibMulticastIndexCount *counts, int srcpe);
         
+    ///Needed for getNewMulticastMessage, to specify if the list of processors need to be ordered
+    virtual int needSorting() { return 0; }
+
     ///Called to multicast the message to local array elements.
     void localMulticast(envelope *env, ComlibSectionHashObject *obj);
     
index 15ee22111adde9be41f0cd4268c3a778ad70b92f..4d4f2dbacef4d4310c89af423f5c1d3fadb01de9 100644 (file)
@@ -84,7 +84,7 @@ ComlibSectionHashObject *MultiRingMulticast::createObjectOnSrcPe
 
     int *pelist;
     int npes;
-    sinfo.getRemotePelist(nelements, elements, npes, pelist);
+    sinfo.getPeList(nelements, elements, npes, pelist);
     
     sinfo.getLocalIndices(nelements, elements, obj->indices);
 
@@ -92,6 +92,13 @@ ComlibSectionHashObject *MultiRingMulticast::createObjectOnSrcPe
         return obj;
 
     if(npes < 4) {
+        // direct sending, take out ourself from the list!
+       for (int i=0; i<npes; ++i) {
+         if (pelist[i] == CkMyPe()) {
+           pelist[i] = pelist[--npes];
+           break;
+         }
+       }
         obj->npes = npes;
         obj->pelist = pelist;
        //CkPrintf("MultiRingMulticast::createObjectOnSrcPe, less than 4 procs\n");
@@ -127,29 +134,30 @@ ComlibSectionHashObject *MultiRingMulticast::createObjectOnSrcPe
                              breaking : npes-1 is the second ring
                           */
 
-    int nextpe = myid + 1;
+    int next_id = myid + 1;
     // wrap nextpe around the ring
     if(myid < breaking) {
-      if (nextpe >= breaking) nextpe = 0;
+      if (next_id >= breaking) next_id = 0;
     } else {
-      if (nextpe >= npes) nextpe = breaking;
+      if (next_id >= npes) next_id = breaking;
     }
     
-    int midpe;
+    int mid_id;
     if (myid < breaking) {
-      midpe = myid + breaking;
-      if (midpe >= npes || midpe < breaking) midpe = breaking;
+      mid_id = myid + breaking;
+      if (mid_id < breaking) mid_id = breaking;
     } else {
-      midpe = myid - breaking;
+      mid_id = myid - breaking;
+      if (mid_id >= breaking) mid_id = 0;
     }
     //mid_pe = getMidPe(pelist, npes, CkMyPe());
     
-    if(nextpe != CkMyPe()) {
+    if(pelist[next_id] != CkMyPe()) {
         obj->pelist = new int[2];
         obj->npes = 2;
         
-        obj->pelist[0] = pelist[nextpe];
-        obj->pelist[1] = pelist[midpe];
+        obj->pelist[0] = pelist[next_id];
+        obj->pelist[1] = pelist[mid_id];
     }
     else {
         CkAbort("Warning Should not be here !!!!!!!!!\n");
@@ -161,7 +169,7 @@ ComlibSectionHashObject *MultiRingMulticast::createObjectOnSrcPe
     
     delete [] pelist;
 
-    //CkPrintf("%d Src = %d Next = %d Mid Pe =%d\n", CkMyPe(), CkMyPe(), nextpe, mid_pe);    
+    //CkPrintf("%d Src = %d Next = %d Mid Pe =%d\n", CkMyPe(), CkMyPe(), pelist[next_id], pelist[mid_id]);
     
     return obj;
 }
@@ -183,10 +191,10 @@ ComlibSectionHashObject *MultiRingMulticast::createObjectOnIntermediatePe(int ni
 
     //pelist[npes ++] = CkMyPe();
 
-    if(npes <= 4)
+    if(npes < 4)
         return obj;
     
-    qsort(counts, npes, sizeof(ComlibMulticastIndexCount), indexCountCompare);
+    //qsort(counts, npes, sizeof(ComlibMulticastIndexCount), indexCountCompare);
     
     int myid = -1;
     for (int i=0; i<npes; ++i) {
@@ -212,9 +220,10 @@ ComlibSectionHashObject *MultiRingMulticast::createObjectOnIntermediatePe(int ni
       // if we are in the two different halves, correct srcid
       if (srcid < breaking) {
        srcid += breaking;
-       if (srcid >= npes || srcid < breaking) srcid = breaking;
+       if (srcid < breaking) srcid = breaking;
       } else {
        srcid -= breaking;
+       if (srcid >= breaking) srcid = 0;
       }
     }
     // now srcid is the starting point of this half ring, which could be the
index 9670279e6cf1c1dff50075bbd33ce274fb47806a..781ce68b76ac4d57c2e402adcdb687f44af1b799 100644 (file)
@@ -28,6 +28,9 @@ class MultiRingMulticast: public DirectMulticastStrategy {
 
     ///Creates the propagation across the half ring
     virtual ComlibSectionHashObject *createObjectOnIntermediatePe(int nindices, CkArrayIndexMax *idxlist, int npes, ComlibMulticastIndexCount *counts, int srcpe);
+
+    ///Specifies that the multicast messages need the processor list to be ordered
+    virtual int needSorting() { return 1; }
     
  public: