Merge branch 'charm' of charmgit:charm into charm
authorIsaac Dooley <idooley2@bp-login1.(none)>
Tue, 18 May 2010 22:47:24 +0000 (17:47 -0500)
committerIsaac Dooley <idooley2@bp-login1.(none)>
Tue, 18 May 2010 22:47:24 +0000 (17:47 -0500)
src/arch/net/machine-ibverbs.c
src/ck-core/cklocation.C
src/ck-core/cklocation.ci
src/ck-cp/controlPoints.C
src/libs/ck-libs/tcharm/tcharm.C
tests/charm++/kNeighbor/kNeighbor.C
tests/charm++/kNeighbor/kNeighbor.ci

index 0da9fabc549c6e91669d8309c5725dc8c418c24b..cfd3d8bae974992f3a09fe1dbb3091da80609e8b 100644 (file)
@@ -526,6 +526,7 @@ static void CmiMachineInit(char **argv){
        maxTokens = maxRecvBuffers;
 //     maxTokens = 80;
        context->tokensLeft=maxTokens;
+       context->qp=NULL;
        //tokensPerProcessor=4;
        if(_Cmi_numnodes > 1){
 #if !CMK_IBVERBS_FAST_START
@@ -845,8 +846,10 @@ void       infiPostInitialRecvs(){
        }
 
 
-       free(context->qp);
-       context->qp = NULL;
+       if (context->qp) {
+          free(context->qp);
+         context->qp = NULL;
+       }
        free(context->localAddr);
        context->localAddr= NULL;
 }
index ead8314e301ef02534e348e5cbb07288a8d7227c..afdcfa689bc3bd8661f3006d9d525a6208e15a65 100644 (file)
@@ -12,6 +12,7 @@ Orion Sky Lawlor, olawlor@acm.org 9/29/2001
 #include "register.h"
 #include "ck.h"
 #include "trace.h"
+#include "TopoManager.h"
 
 #include<sstream>
 
@@ -268,7 +269,7 @@ public:
  */
 class DefaultArrayMap : public RRMap
 {
-private:
+public:
   CkPupPtrVec<dimInfo> arrs;
 
 public:
@@ -280,14 +281,14 @@ public:
 
   int registerArray(CkArrayIndexMax& numElements, CkArrayID aid)
   {
-    int numPes=CkNumPes();
+    int numPes = CkNumPes();
     int binSize;
     if (numElements.nInts == 1) {
       binSize = (int)ceil((double)(numElements.data()[0])/(double)numPes);
     } else if (numElements.nInts == 2) {
-      binSize = (int)ceil((double)(numElements.data()[0]*numElements.data()[1])/(double)numPes);
+      binSize = (int)ceil((double)(numElements.data()[0] * numElements.data()[1])/(double)numPes);
     } else if (numElements.nInts == 3) {
-      binSize = (int)ceil((double)(numElements.data()[0]*numElements.data()[1]*numElements.data()[2])/(double)numPes);
+      binSize = (int)ceil((double)(numElements.data()[0] * numElements.data()[1] * numElements.data()[2])/(double)numPes);
     }
 
     int idx = arrs.size();
@@ -321,6 +322,77 @@ public:
   }
 };
 
+/**
+ * This map can be used for topology aware mapping when the mapping is provided
+ * through a file -- ASB
+ */
+class ReadFileMap : public DefaultArrayMap
+{
+private:
+  CkVec<int> mapping;
+
+public:
+  ReadFileMap(void) {
+    DEBC((AA"Creating ReadFileMap\n"AB));
+  }
+
+  ReadFileMap(CkMigrateMessage *m):DefaultArrayMap(m){}
+
+  int registerArray(CkArrayIndexMax& numElements, CkArrayID aid)
+  {
+    int idx;
+    idx = DefaultArrayMap::registerArray(numElements, aid);
+
+    if(mapping.size() == 0) {
+      int numChares;
+
+      if (arrs[idx]->_nelems.nInts == 1) {
+       numChares = arrs[idx]->_nelems.data()[0];
+      } else if (arrs[idx]->_nelems.nInts == 2) {
+       numChares = arrs[idx]->_nelems.data()[0] * arrs[idx]->_nelems.data()[1];
+      } else if (arrs[idx]->_nelems.nInts == 3) {
+       numChares = arrs[idx]->_nelems.data()[0] * arrs[idx]->_nelems.data()[1] * arrs[idx]->_nelems.data()[2];
+      } else {
+       CkAbort("CkArrayIndex has more than 3 integers!");
+      }
+
+      mapping.resize(numChares);
+      FILE *mapf = fopen("mapfile", "r");
+      TopoManager tmgr;
+      int x, y, z, t, rv;
+
+      for(int i=0; i<numChares; i++) {
+       rv = fscanf(mapf, "%d %d %d %d", &x, &y, &z, &t);
+       mapping[i] = tmgr.coordinatesToRank(x, y, z, t);
+      }
+      fclose(mapf);
+    }
+
+    return idx;
+  }
+
+  int procNum(int arrayHdl, const CkArrayIndex &i) {
+    int flati;
+
+    if (i.nInts == 1) {
+      flati = i.data()[0];
+    } else if (i.nInts == 2) {
+      flati = i.data()[0] * arrs[arrayHdl]->_nelems.data()[1] + i.data()[1];
+    } else if (i.nInts == 3) {
+      flati = (i.data()[0] * arrs[arrayHdl]->_nelems.data()[1] + i.data()[1]) * arrs[arrayHdl]->_nelems.data()[2] + i.data()[2];
+    } else {
+      CkAbort("CkArrayIndex has more than 3 integers!");
+    }
+
+    return mapping[flati];
+  }
+
+  void pup(PUP::er& p){
+    DefaultArrayMap::pup(p);
+    p|mapping;
+  }
+};
+
 class BlockMap : public RRMap
 {
 public:
@@ -543,12 +615,6 @@ public:
 };
 
 
-
-
-
-
-
-
 CkpvStaticDeclare(double*, rem);
 
 class arrInfo {
index 681b1c32281920a9900e1d97e9537dec31edb329..019572a22ca08d973d0a280fa6e4b6c7f123300f 100644 (file)
@@ -17,23 +17,28 @@ module CkLocation {
   };
   initnode void _CkLocMgrInit(void);
   
-//Array Map object support:
+  // Array Map object support:
   group [migratable] CkArrayMap {
   };
 
+  group [migratable] RRMap : CkArrayMap {
+    entry RRMap(void);
+  };
+
   readonly CkGroupID _defaultArrayMapID;
 
-  group [migratable] DefaultArrayMap : CkArrayMap {
+  group [migratable] DefaultArrayMap : RRMap {
     entry DefaultArrayMap(void);
   };
 
-  group [migratable] RRMap : CkArrayMap {
-    entry RRMap(void);
+  group [migratable] ReadFileMap : DefaultArrayMap {
+    entry ReadFileMap(void);
   };
 
   group [migratable] BlockMap : RRMap {
     entry BlockMap(void);
   };
+
   group [migratable] CldMap : CkArrayMap {
     entry CldMap(void);
   };
index a641604bcb30d2e3b4ca1bc5937ab7407c75a67d..eafa4e68bfa311003d528c42f735b5eedc716772 100644 (file)
@@ -1483,14 +1483,15 @@ void controlPointManager::generatePlan() {
       for(int i=b1; i<oldNumTimings; i++){
        s2 += times[i];
       }
-    
-    
+      
+      
       // Compute the estimated time for the last phase's data
     
-      const double a1 = s1 / ((newNumTimings-2)/2);
-      const double a2 = s2 / ((newNumTimings-2)/2);
-    
-      const double expectedTotalTime = ((5.0*a2-3.0*a1)/2.0 ) * newNumTimings;
+      const double a1 = s1 / (double)(b1-2);
+      const double a2 = s2 / (double)(oldNumTimings-b1);
+      const double aold = (a1+a2)/2.0;
+
+      const double expectedTotalTime = newNumTimings*(aold+(oldNumTimings+newNumTimings)*(a2-a1)/oldNumTimings);
         
     
       // Measure actual time
@@ -1586,9 +1587,9 @@ void controlPointManager::generatePlan() {
     
       // Compute the estimated time for the last phase's data
     
-      const double a1 = s1 / ((newNumTimings-2)/3);
-      const double a2 = s2 / ((newNumTimings-2)/3);
-      const double a3 = s3 / ((newNumTimings-2)/3);
+      const double a1 = s1 / (double)(b1-2);
+      const double a2 = s2 / (double)(b2-b1);
+      const double a3 = s3 / (double)(oldNumTimings-b2);
     
       const double a = (a1-2.0*a2+a3)/2.0;
       const double b = (a1-4.0*a2+3.0*a3)/2.0;
index 8975487f1b220e8f1da7f03b428735d4eebd3df2..66a4e9637ac3ab949b31798e5308a5310d65c402 100644 (file)
@@ -746,14 +746,17 @@ static CProxy_TCharm TCHARM_Build_threads(TCharmInitMsg *msg)
     mapID=CkCreatePropMap();
 #endif
 #endif
-  }else if(0==strcmp(mapping,"BLOCK_MAP")){
+  } else if(0 == strcmp(mapping,"BLOCK_MAP")) {
     CkPrintf("USING BLOCK_MAP\n");
-    mapID=CProxy_BlockMap::ckNew();
-  }else if(0==strcmp(mapping,"RR_MAP")){
+    mapID = CProxy_BlockMap::ckNew();
+  } else if(0 == strcmp(mapping,"RR_MAP")) {
     CkPrintf("USING RR_MAP\n");
-    mapID=CProxy_RRMap::ckNew();
-  }else{  // "PROP_MAP" or anything else
-    mapID=CkCreatePropMap();
+    mapID = CProxy_RRMap::ckNew();
+  } else if(0 == strcmp(mapping,"MAPFILE")) {
+    CkPrintf("Reading map from file\n");
+    mapID = CProxy_ReadFileMap::ckNew();
+  } else {  // "PROP_MAP" or anything else
+    mapID = CkCreatePropMap();
   }
   opts.setMap(mapID);
   int nElem=msg->numElements; //<- save it because msg will be deleted.
index 0da81bdb9b9f1057ce944c7356f3324f3f43092a..fc0d0bba128a8a9a490530a5541d415c2fb2997e 100644 (file)
@@ -17,16 +17,28 @@ int gMsgSize;
 
 class toNeighborMsg: public CMessage_toNeighborMsg {
 public:
-    char *data;
+    int *data;
+    int size;
     int fromX;
     int nID;
 
 public:
+    toNeighborMsg() {};
+    toNeighborMsg(int s): size(s) {  init(); }
     void setMsgSrc(int X, int id) {
         fromX = X;
         nID = id;
     }
-
+    void init() {
+        for (int i=0; i<size; i++)
+          data[i] = i;
+    }
+    int sum() {
+        int s;
+        for (int i=0; i<size; i++)
+          s += data[i];
+        return s;
+    }
 };
 
 //#define MSGSIZECNT 1
@@ -221,6 +233,8 @@ public:
     int curIterWorkSize;
     int internalStepCnt;
 
+    int sum;
+
 #if REUSE_ITER_MSG
     toNeighborMsg **iterMsg;
 #endif
@@ -336,7 +350,7 @@ public:
 #if REUSE_ITER_MSG
            toNeighborMsg *msg = iterMsg[i];
 #else
-            toNeighborMsg *msg = new(msgSize, 0) toNeighborMsg;
+            toNeighborMsg *msg = new(msgSize/4, 0) toNeighborMsg(msgSize/4);
 #endif
 
 #if DEBUG
@@ -375,7 +389,7 @@ public:
 #if REUSE_ITER_MSG
        if(iterMsg[0]==NULL){ //indicating the messages have not been created
            for(int i=0; i<numNeighbors; i++)
-               iterMsg[i] = new(curIterMsgSize, 0) toNeighborMsg;
+               iterMsg[i] = new(curIterMsgSize/4, 0) toNeighborMsg(curIterMsgSize/4);
        }
 #endif
        
@@ -423,6 +437,7 @@ public:
 #if DEBUG
        CkPrintf("[%d]: recv msg from %d as its %dth neighbor\n", thisIndex, m->fromX, m->nID);
 #endif
+        sum = m->sum();
         thisProxy(m->fromX).recvReplies(m);
     }
 
index 15717ac7572b40b1724d01ef98b90a73284e6141..8561e615484dd5a5d3732832a83a32e8b225a49d 100644 (file)
@@ -3,7 +3,7 @@ mainmodule kNeighbor {
     readonly int gMsgSize;
 
     message toNeighborMsg {
-       char data[];
+       int data[];
     };
     
     mainchare Main {