Merge branch 'charm' of charmgit:charm into charm
authorAaron Becker <akbecker@gmail.com>
Thu, 20 May 2010 20:46:17 +0000 (15:46 -0500)
committerAaron Becker <akbecker@gmail.com>
Thu, 20 May 2010 20:46:17 +0000 (15:46 -0500)
src/ck-core/cklocation.C
src/ck-core/debug-charm.h
src/ck-cp/controlPoints.C
src/conv-ccs/ccs-builtins.C
src/conv-core/converse.h
src/conv-core/cpuaffinity.c
src/scripts/Make.depends
src/scripts/Makefile
tests/charm++/chkpt/Makefile

index 2ca25710f403f2fc89a800ce600d8b01a22f1766..b72bbaaeec6eed11042f5df9c5ef9e130086cd78 100644 (file)
@@ -249,12 +249,25 @@ public:
 
   dimInfo(void) { }
 
-  dimInfo(CkArrayIndexMax& n, int bs) {
+  dimInfo(CkArrayIndexMax& n) {
     _nelems = n;
-    _binSize = bs;
+    compute_binsize();
   }
 
-  ~dimInfo() { }
+  ~dimInfo() {}
+  
+  int compute_binsize()
+  {
+    int numPes = CkNumPes();
+    if (_nelems.nInts == 1) {
+      _binSize = (int)ceil((double)(_nelems.data()[0])/(double)numPes);
+    } else if (_nelems.nInts == 2) {
+      _binSize = (int)ceil((double)(_nelems.data()[0] * _nelems.data()[1])/(double)numPes);
+    } else if (_nelems.nInts == 3) {
+      _binSize = (int)ceil((double)(_nelems.data()[0] * _nelems.data()[1] * _nelems.data()[2])/(double)numPes);
+    }
+    return _binSize;
+  }
 
   void pup(PUP::er& p){
     p|_nelems;
@@ -281,19 +294,9 @@ public:
 
   int registerArray(CkArrayIndexMax& numElements, CkArrayID aid)
   {
-    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);
-    } else if (numElements.nInts == 3) {
-      binSize = (int)ceil((double)(numElements.data()[0] * numElements.data()[1] * numElements.data()[2])/(double)numPes);
-    }
-
     int idx = arrs.size();
     arrs.resize(idx+1);
-    arrs[idx] = new dimInfo(numElements, binSize);
+    arrs[idx] = new dimInfo(numElements);
     return idx;
   }
  
@@ -318,7 +321,13 @@ public:
 
   void pup(PUP::er& p){
     RRMap::pup(p);
+    int npes = CkNumPes();
+    p|npes;
     p|arrs;
+    if (p.isUnpacking() && npes != CkNumPes())  {   // binSize needs update
+      for (int i=0; i<arrs.size(); i++)
+        arrs[i]->compute_binsize();
+    }
   }
 };
 
@@ -364,12 +373,9 @@ public:
       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);
-       fflush(NULL);
       }
       fclose(mapf);
     }
-    printf("File reading done.\n");
-    fflush(NULL);
 
     return idx;
   }
index 1d27337cc8a8292fec5ffa67c468fae655b01e67..ee6f7b7db0085ea6d1424dfe68b9f7e3e235e04b 100644 (file)
@@ -14,6 +14,9 @@
 #include "pup.h"
 #include "cklists.h"
 
+#define CHARMDEBUG_MAJOR   10
+#define CHARMDEBUG_MINOR    0
+
 void *CpdGetCurrentObject();
 void *CpdGetCurrentMsg();
 
index 169fccf9eac6e11ee3825b65e5565cd796a3d0db..a02dea698af6c2f964300cf2d9da5fa8730b3434 100644 (file)
@@ -1479,14 +1479,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
@@ -1582,9 +1583,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 c66262cc9c0d5952713dea5b0a5e6bcada74d495..a4f687dd55c9ab5b4c636a1e1d302d34101232af 100644 (file)
@@ -239,37 +239,39 @@ static void CpdList_ccs_list_items_set(char *msg)
 
 /** gather information about the machine we're currently running on */
 void CpdMachineArchitecture(char *msg) {
-  char reply[6]; // where we store our reply
+  char reply[8]; // where we store our reply
+  reply[0]=CHARMDEBUG_MAJOR;
+  reply[1]=CHARMDEBUG_MINOR;
   // decide if we are 32 bit (1) or 64 bit (2)
-  reply[0] = 0;
-  if (sizeof(char*) == 4) reply[0] = 1;
-  else if (sizeof(char*) == 8) reply[0] = 2;
+  reply[2] = 0;
+  if (sizeof(char*) == 4) reply[2] = 1;
+  else if (sizeof(char*) == 8) reply[2] = 2;
   // decide if we are little endian (1) or big endian (2)
-  reply[1] = 0;
+  reply[3] = 0;
   int value = 1;
   char firstByte = *((char*)&value);
-  if (firstByte == 1) reply[1] = 1;
-  else reply[1] = 2;
+  if (firstByte == 1) reply[3] = 1;
+  else reply[3] = 2;
   // add the third bit if we are in bigsim
 #if CMK_BLUEGENE_CHARM
-  reply[1] |= 4;
+  reply[3] |= 4;
 #endif
   // get the size of an "int"
-  reply[2] = sizeof(int);
+  reply[4] = sizeof(int);
   // get the size of an "long"
-  reply[3] = sizeof(long);
+  reply[5] = sizeof(long);
 #if CMK_LONG_LONG_DEFINED
   // get the size of an "long long"
-  reply[4] = sizeof(long long);
+  reply[6] = sizeof(long long);
 #else
   // Per Filippo, the debugger will be fine with this. It should never
   // come up, since configure didn't detect support for `long long` on
   // the machine.
-  reply[4] = 0;
+  reply[6] = 0;
 #endif
   // get the size of an "bool"
-  reply[5] = sizeof(bool);
-  CcsSendReply(6, (void*)reply);
+  reply[7] = sizeof(bool);
+  CcsSendReply(8, (void*)reply);
   CmiFree(msg);
 }
 
index 65d01ba48305e1ec1d99ffde76bc3d2fa8c39429..fabc93fadc2652692bd382310a7e11a56a8ea1e1 100644 (file)
@@ -505,6 +505,7 @@ extern int CmiPhysicalRank(int pe);
 
 extern int CmiPrintCPUAffinity();
 extern int CmiSetCPUAffinity(int core);
+extern int CmiOnCore();
 
 /** Return 1 if our outgoing message queue 
    for this node is longer than this many bytes. */
index dc0ca7d637254ae51c15a0e2eca5a31121cf1204..10f4d7579c722bd601781c29e397a696ed71f02f 100644 (file)
@@ -10,6 +10,8 @@ cpu affinity.
  * new options +pemap +commmap takes complex pattern of a list of cores
 */
 
+#define _GNU_SOURCE
+
 #include "converse.h"
 #include "sockRoutines.h"
 
@@ -21,18 +23,14 @@ cpu affinity.
 #include <stdio.h>
 #include <unistd.h>
 
-
-#include <stdlib.h>
-#include <stdio.h>
-
 #ifdef _WIN32
 #include <windows.h>
 #include <winbase.h>
 #else
 #define _GNU_SOURCE
 #include <sched.h>
-long sched_setaffinity(pid_t pid, unsigned int len, unsigned long *user_mask_ptr);
-long sched_getaffinity(pid_t pid, unsigned int len, unsigned long *user_mask_ptr);
+//long sched_setaffinity(pid_t pid, unsigned int len, unsigned long *user_mask_ptr);
+//long sched_getaffinity(pid_t pid, unsigned int len, unsigned long *user_mask_ptr);
 #endif
 
 #if defined(__APPLE__) 
@@ -43,6 +41,7 @@ long sched_getaffinity(pid_t pid, unsigned int len, unsigned long *user_mask_ptr
 #include <sys/mpctl.h>
 #endif
 
+
 #define MAX_EXCLUDE      16
 static int excludecore[MAX_EXCLUDE] = {-1};
 static int excludecount = 0;
@@ -112,8 +111,8 @@ int set_cpu_affinity(unsigned int cpuid) {
   return 0;
 }
 
-int set_thread_affinity(int cpuid) {
 #if CMK_SMP
+int set_thread_affinity(int cpuid) {
   unsigned long mask = 0xffffffff;
   unsigned int len = sizeof(mask);
 
@@ -128,9 +127,17 @@ int set_thread_affinity(int cpuid) {
     return -1;
   }
 #elif  CMK_HAS_PTHREAD_SETAFFINITY
-  SET_MASK(cpuid)
-  /* PID 0 refers to the current process */
-  if (pthread_setaffinity_np(pthread_self(), len, &mask) < 0) {
+  int s, j;
+  cpu_set_t cpuset;
+  pthread_t thread;
+
+  thread = pthread_self();
+
+  CPU_ZERO(&cpuset);
+  CPU_SET(cpuid, &cpuset);
+
+  s = pthread_setaffinity_np(thread, sizeof(cpu_set_t), &cpuset);
+  if (s != 0) {
     perror("pthread_setaffinity");
     return -1;
   }
@@ -142,8 +149,25 @@ int set_thread_affinity(int cpuid) {
 #endif
 
   return 0;
+}
+#endif
+
+int CmiSetCPUAffinity(int mycore)
+{
+  int core = mycore;
+  if (core < 0) {
+    core = CmiNumCores() + core;
+  }
+  if (core < 0) {
+    CmiError("Error: Invalid cpu affinity core number: %d\n", mycore);
+    CmiAbort("CmiSetCPUAffinity failed");
+  }
+  /* set cpu affinity */
+#if CMK_SMP
+  return set_thread_affinity(core);
 #else
-  return -1;
+  return set_cpu_affinity(core);
+  /* print_cpu_affinity(); */
 #endif
 }
 
@@ -178,21 +202,35 @@ int print_cpu_affinity() {
   return 0;
 }
 
-int print_thread_affinity() {
 #if CMK_SMP
+int print_thread_affinity() {
   unsigned long mask;
   size_t len = sizeof(mask);
 
 #if  CMK_HAS_PTHREAD_SETAFFINITY
-  if (pthread_getaffinity_np(pthread_self(), len, &mask) < 0) {
-    perror("pthread_setaffinity");
+  int s, j;
+  cpu_set_t cpuset;
+  pthread_t thread;
+  char str[256], pe[16];
+
+  thread = pthread_self();
+  s = pthread_getaffinity_np(thread, sizeof(cpu_set_t), &cpuset);
+  if (s != 0) {
+    perror("pthread_getaffinity");
     return -1;
   }
-  CmiPrintf("[%d] %s affinity mask is: 0x%08lx\n", CmiMyPe(), CmiMyPe()>=CmiNumPes()?"communication pthread":"pthread", mask);
-#endif
+
+  sprintf(str, "[%d] %s affinity is: ", CmiMyPe(), CmiMyPe()>=CmiNumPes()?"communication pthread":"pthread");
+  for (j = 0; j < CPU_SETSIZE; j++)
+        if (CPU_ISSET(j, &cpuset)) {
+            sprintf(pe, " %d", j);
+            strcat(str, pe);
+        }
+  CmiPrintf("%s\n", str);
 #endif
   return 0;
 }
+#endif
 
 int CmiPrintCPUAffinity()
 {
@@ -203,6 +241,24 @@ int CmiPrintCPUAffinity()
 #endif
 }
 
+  /* returns which core is running on, only works on Linux */
+int CmiOnCore(void) {
+  FILE *fp;
+  int core=-1;
+  char str[128];
+  int n;
+
+  fp = fopen("/proc/self/stat", "r");
+  if (fp == NULL) return -1;
+  for (n=0; n<39; n++)  {
+    fscanf(fp, "%s", str);
+  }
+  fclose(fp);
+  core = atoi(str);
+
+  return core;
+}
+
 static int cpuAffinityHandlerIdx;
 static int cpuAffinityRecvHandlerIdx;
 
@@ -287,25 +343,6 @@ static void cpuAffinityHandler(void *m)
   }
 }
 
-int CmiSetCPUAffinity(int mycore)
-{
-  int core = mycore;
-  if (core < 0) {
-    core = CmiNumCores() + core;
-  }
-  if (core < 0) {
-    CmiError("Error: Invalid cpu affinity core number: %d\n", mycore);
-    CmiAbort("CmiSetCPUAffinity failed");
-  }
-  /* set cpu affinity */
-#if CMK_SMP
-  return set_thread_affinity(core);
-#else
-  return set_cpu_affinity(core);
-  /* print_cpu_affinity(); */
-#endif
-}
-
 /* called on each processor */
 static void cpuAffinityRecvHandler(void *msg)
 {
index 33dab6758f049887e6316d3dce06bf660f4e3fc7..92ec69a4d1d3bd69eb00fe89dd5c22d4c63707ca 100644 (file)
@@ -640,7 +640,7 @@ cklocation.o: cklocation.C charm++.h charm.h converse.h conv-config.h \
   tempo.decl.h waitqd.h waitqd.decl.h sdag.h ckcheckpoint.h \
   CkCheckpoint.decl.h ckevacuation.h ckarrayreductionmgr.h trace.h \
   trace-bluegene.h envelope.h register.h ck.h qd.h stats.h ckfutures.h \
-  ckIgetControl.h CkLocation.def.h
+  ckIgetControl.h TopoManager.h CkLocation.def.h
        $(CHARMC) -c -I. cklocation.C
 
 ckarray.o: ckarray.C charm++.h charm.h converse.h conv-config.h \
@@ -2678,11 +2678,11 @@ controlPoints.o: controlPoints.C charm++.h charm.h converse.h \
   waitqd.h waitqd.decl.h sdag.h ckcheckpoint.h CkCheckpoint.decl.h \
   ckevacuation.h ckarrayreductionmgr.h trace.h trace-bluegene.h \
   envelope.h controlPoints.h ControlPoints.decl.h charm++.h pup_stl.h \
-  LBDatabase.h arrayRedistributor.h pathHistory.h PathHistory.decl.h \
-  envelope.h cp_effects.h ck.h qd.h register.h stats.h ckfutures.h \
-  ckIgetControl.h ckarray.h trace-controlPoints.h trace.h register.h \
-  trace-common.h trace-projections.h ckhashtable.h pup.h pathHistory.h \
-  cp_effects.h ControlPoints.def.h
+  charm-api.h LBDatabase.h arrayRedistributor.h pathHistory.h \
+  PathHistory.decl.h envelope.h cp_effects.h ck.h qd.h register.h stats.h \
+  ckfutures.h ckIgetControl.h ckarray.h trace-controlPoints.h trace.h \
+  register.h trace-common.h trace-projections.h ckhashtable.h pup.h \
+  pathHistory.h cp_effects.h ControlPoints.def.h
        $(CHARMC) -c -I. controlPoints.C
 
 arrayRedistributor.o: arrayRedistributor.C charm++.h charm.h converse.h \
@@ -2702,7 +2702,7 @@ arrayRedistributor.o: arrayRedistributor.C charm++.h charm.h converse.h \
   ckevacuation.h ckarrayreductionmgr.h trace.h trace-bluegene.h \
   envelope.h trace-controlPoints.h trace.h envelope.h register.h \
   trace-common.h LBDatabase.h controlPoints.h ControlPoints.decl.h \
-  charm++.h pup_stl.h arrayRedistributor.h pathHistory.h \
+  charm++.h pup_stl.h charm-api.h arrayRedistributor.h pathHistory.h \
   PathHistory.decl.h cp_effects.h ck.h qd.h register.h stats.h \
   ckfutures.h ckIgetControl.h ckarray.h
        $(CHARMC) -c -I. arrayRedistributor.C
index 717255aed292e9f06e34f5f4e71fcf09c9cc5bdf..1f3d8f0299b3511478065ea1582b715a9e577b4e 100644 (file)
@@ -365,7 +365,8 @@ LIBCONV_CORE= convcore.o conv-conds.o queueing.o msgmgr.o \
        traceCore.o traceCoreCommon.o tracec.o \
        converseProjections.o machineProjections.o \
        quiescence.o isomalloc.o mem-arena.o conv-counter.o \
-       global-nop.o cmipool.o cpuaffinity.o cputopology.o modifyScheduler.o
+       global-nop.o cmipool.o cpuaffinity.o cputopology.o  \
+       modifyScheduler.o
 
 #############################################
 #Comlib Core objects that go into libck.a
index 4f7b2e6c270bd51e588c854686148e85e5c1a36a..e36ff80a8d3eb150c0ce0a46eb040f788879c91d 100644 (file)
@@ -24,6 +24,7 @@ test: all
        -sync
        ./charmrun ./hello +p3 +restart log $(TESTOPTS)
        ./charmrun ./hello +p4 +restart log $(TESTOPTS)
+       ./charmrun ./hello +p2 +restart log $(TESTOPTS)
 
 bgtest: all
        -rm -fr log