Merge commit 'bad1e25ac34e5b0c0cba41a71d136e9c667990a1' into charm reviewed-6.2.2
authorIsaac Dooley <idooley2@illinois.edu>
Wed, 21 Jul 2010 16:34:01 +0000 (11:34 -0500)
committerIsaac Dooley <idooley2@illinois.edu>
Wed, 21 Jul 2010 16:34:01 +0000 (11:34 -0500)
doc/charm++/controlpoints.tex
src/ck-core/init.C
src/ck-cp/controlPoints.C
src/ck-cp/controlPoints.h
src/ck-perf/trace-common.C
src/ck-perf/trace-controlPoints.C
src/scripts/Makefile

index 01e45bc23095cd494eaeec1b0b99f5889c3c18c2..5aa81cddcf80646329a1d4bd0a31fae59a8a0197 100644 (file)
@@ -84,11 +84,7 @@ Alternatively, the program can specify that it wants to call \texttt{gotoNextPha
 
 \subsection{Linking With The Control Point Framework}
 
-The program should be linked with the following options to compile in the control point framework:
-
-\texttt{-module ControlPoints -tracemode controlPoints}
-
-The \texttt{ControlPoint} module contains the framework code responsible for recording information about the running program as well as adjust the control point values. The trace module will enable measurements to be gathered including information about utilization, idle time, and memory usage. 
+The control point tuning framework is now an integral part of the Charm++ runtime system. It does not need to be linked in to an application in any special way. It contains the framework code responsible for recording information about the running program as well as adjust the control point values. The trace module will enable measurements to be gathered including information about utilization, idle time, and memory usage. 
 
 \subsection{Runtime Command Line Arguments}
 
@@ -105,7 +101,13 @@ The scheme used for tuning can be selected at runtime by the use of one of the f
       +CPMemoryAware            Adjust control points to approach available memory
 \end{alltt} 
 
-To intelligently tune or steer an application's performance, performance measurements ought to be used. Some of the schemes above require that memory footprint statistics and utilization statistics be gathered. The following flags enable the gathering of such measurements.
+To intelligently tune or steer an application's performance, performance measurements ought to be used. Some of the schemes above require that memory footprint statistics and utilization statistics be gathered. All measurements are performed by a tracing module that has some overheads, so is not enabled by default. To use any type of measurement based steering scheme, it is necessary to add a runtime command line argument to the user program to enable the tracing module:
+
+\begin{alltt} 
+    +CPEnableMeasurements
+\end{alltt}
+
+The following flags enable the gathering of the different types of available measurements.
 \begin{alltt} 
         +CPGatherAll            Gather all types of measurements for each phase
 +CPGatherMemoryUsage            Gather memory usage after each phase
index e09563a560d14d0eb578856dd1cde94568fdfba2..746ea16af9d97bc0794f0a2b8a39debe4aafdf52 100644 (file)
@@ -160,6 +160,7 @@ CkpvStaticDeclare(int,  _numInitsRecd);
 CkpvStaticDeclare(PtrQ*, _buffQ);
 CkpvStaticDeclare(PtrVec*, _bocInitVec);
 
+
 /*
        FAULT_EVAC
 */
@@ -798,6 +799,8 @@ static void _nullFn(void *, void *)
 
 extern void _registerLBDatabase(void);
 extern void _registerPathHistory(void);
+extern void _registerControlPoints(void);
+extern void _registerTraceControlPoints();
 extern void _registerExternalModules(char **argv);
 extern void _ckModuleInit(void);
 extern void _loadbalancerInit();
@@ -1030,8 +1033,25 @@ void _initCharm(int unused_argc, char **argv)
 #if CMK_MEM_CHECKPOINT
                _registerCkMemCheckpoint();
 #endif
-               
+
+
+               /*
+                 Setup Control Point Automatic Tuning Framework.
+
+                 By default it is enabled as a part of charm, 
+                 however it won't enable its tracing module 
+                 unless a +CPEnableMeasurements command line argument
+                 is specified. See trace-common.C for more info
+
+                 Thus there should be no noticable overhead to 
+                 always having the control point framework linked
+                 in.
+                 
+               */
                _registerPathHistory();
+               _registerControlPoints();
+               _registerTraceControlPoints();
+
 
                /**
                  CkRegisterMainModule is generated by the (unique)
@@ -1060,7 +1080,7 @@ void _initCharm(int unused_argc, char **argv)
        }
        CmiNodeAllBarrier();
 
-    // Execute the initcalls registered in modules
+       // Execute the initcalls registered in modules
        _initCallTable.enumerateInitCalls();
 
 #ifndef CMK_OPTIMIZE
index 70f0191e0f97b7a613484a867172dc69cfa62c5d..4a58a2dbc1f3d1c90de70bf6fe5860944f49caf8 100644 (file)
@@ -1,7 +1,6 @@
 #include <charm++.h>
 
 // This file is compiled twice to make a version that is capable of not needing the tracing to be turned on. 
-// The Makefile will have -DCP_DISABLE_TRACING
 
 #include "controlPoints.h"
 #include "trace-controlPoints.h"
@@ -54,7 +53,7 @@ static void periodicProcessControlPoints(void* ptr, double currWallTime);
 /* readonly */ bool shouldGatherAll;
 /* readonly */ char CPDataFilename[512];
 
-
+extern bool enableCPTracing;
 
 /// The control point values to be used for the first few phases if the strategy doesn't choose to do something else.
 /// These probably come from the command line arguments, so are available only on PE 0
@@ -643,37 +642,34 @@ void controlPointManager::setFrameworkAdvancePhase(bool _frameworkShouldAdvanceP
 
   /// Called by either the application or the Control Point Framework to advance to the next phase  
   void controlPointManager::gotoNextPhase(){
-    
-#ifndef CP_DISABLE_TRACING
-    CkPrintf("gotoNextPhase shouldGatherAll=%d\n", (int)shouldGatherAll);
+    CkPrintf("gotoNextPhase shouldGatherAll=%d enableCPTracing=%d\n", (int)shouldGatherAll, (int)enableCPTracing);
     fflush(stdout);
-
-    if(shouldGatherAll && CkMyPe() == 0 && !alreadyRequestedAll){
-      alreadyRequestedAll = true;
-      CkCallback *cb = new CkCallback(CkIndex_controlPointManager::gatherAll(NULL), 0, thisProxy);
-      CkPrintf("Requesting all measurements\n");
-      thisProxy.requestAll(*cb);
-      delete cb;
-    
-    } else {
       
-      if(shouldGatherMemoryUsage && CkMyPe() == 0 && !alreadyRequestedMemoryUsage){
-       alreadyRequestedMemoryUsage = true;
-       CkCallback *cb = new CkCallback(CkIndex_controlPointManager::gatherMemoryUsage(NULL), 0, thisProxy);
-       thisProxy.requestMemoryUsage(*cb);
-       delete cb;
-      }
-      
-      if(shouldGatherUtilization && CkMyPe() == 0 && !alreadyRequestedIdleTime){
-       alreadyRequestedIdleTime = true;
-       CkCallback *cb = new CkCallback(CkIndex_controlPointManager::gatherIdleTime(NULL), 0, thisProxy);
-       thisProxy.requestIdleTime(*cb);
+    if(enableCPTracing){
+      if(shouldGatherAll && CkMyPe() == 0 && !alreadyRequestedAll){
+       alreadyRequestedAll = true;
+       CkCallback *cb = new CkCallback(CkIndex_controlPointManager::gatherAll(NULL), 0, thisProxy);
+       CkPrintf("Requesting all measurements\n");
+       thisProxy.requestAll(*cb);
        delete cb;
+       
+      } else {
+       
+       if(shouldGatherMemoryUsage && CkMyPe() == 0 && !alreadyRequestedMemoryUsage){
+         alreadyRequestedMemoryUsage = true;
+         CkCallback *cb = new CkCallback(CkIndex_controlPointManager::gatherMemoryUsage(NULL), 0, thisProxy);
+         thisProxy.requestMemoryUsage(*cb);
+         delete cb;
+       }
+       
+       if(shouldGatherUtilization && CkMyPe() == 0 && !alreadyRequestedIdleTime){
+         alreadyRequestedIdleTime = true;
+         CkCallback *cb = new CkCallback(CkIndex_controlPointManager::gatherIdleTime(NULL), 0, thisProxy);
+         thisProxy.requestIdleTime(*cb);
+         delete cb;
+       }
       }
     }
-    
-
-#endif
 
 
 
@@ -740,7 +736,8 @@ void controlPointManager::setFrameworkAdvancePhase(bool _frameworkShouldAdvanceP
   
   /// Entry method called on all PEs to request CPU utilization statistics
   void controlPointManager::requestIdleTime(CkCallback cb){
-#ifndef CP_DISABLE_TRACING
+    CkAssert(enableCPTracing);
+   
     double i = localControlPointTracingInstance()->idleRatio();
     double idle[3];
     idle[0] = i;
@@ -750,16 +747,14 @@ void controlPointManager::setFrameworkAdvancePhase(bool _frameworkShouldAdvanceP
     //    CkPrintf("[%d] idleRatio=%f\n", CkMyPe(), i);
     
     localControlPointTracingInstance()->resetTimings();
-
+    
     contribute(3*sizeof(double),idle,idleTimeReductionType, cb);
-#else
-    CkAbort("Should not get here\n");
-#endif
   }
   
   /// All processors reduce their memory usages in requestIdleTime() to this method
   void controlPointManager::gatherIdleTime(CkReductionMsg *msg){
-#ifndef CP_DISABLE_TRACING
+    CkAssert(enableCPTracing);
+
     int size=msg->getSize() / sizeof(double);
     CkAssert(size==3);
     double *r=(double *) msg->getData();
@@ -778,9 +773,6 @@ void controlPointManager::setFrameworkAdvancePhase(bool _frameworkShouldAdvanceP
     alreadyRequestedIdleTime = false;
     checkForShutdown();
     delete msg;
-#else
-    CkAbort("Should not get here\n");
-#endif
   }
 
 
@@ -790,7 +782,8 @@ void controlPointManager::setFrameworkAdvancePhase(bool _frameworkShouldAdvanceP
 
   /// Entry method called on all PEs to request CPU utilization statistics and memory usage
   void controlPointManager::requestAll(CkCallback cb){
-#ifndef CP_DISABLE_TRACING
+    CkAssert(enableCPTracing);
+
     TraceControlPoints *t = localControlPointTracingInstance();
 
     double data[ALL_REDUCTION_SIZE];
@@ -824,14 +817,12 @@ void controlPointManager::setFrameworkAdvancePhase(bool _frameworkShouldAdvanceP
     localControlPointTracingInstance()->resetAll();
 
     contribute(ALL_REDUCTION_SIZE*sizeof(double),data,allMeasuresReductionType, cb);
-#else
-    CkAbort("Should not get here\n");
-#endif
   }
   
   /// All processors reduce their memory usages in requestIdleTime() to this method
   void controlPointManager::gatherAll(CkReductionMsg *msg){
-#ifndef CP_DISABLE_TRACING
+    CkAssert(enableCPTracing);
+
     CkAssert(msg->getSize()==ALL_REDUCTION_SIZE*sizeof(double));
     int size=msg->getSize() / sizeof(double);
     double *data=(double *) msg->getData();
@@ -890,9 +881,6 @@ void controlPointManager::setFrameworkAdvancePhase(bool _frameworkShouldAdvanceP
     alreadyRequestedAll = false;
     checkForShutdown();
     delete msg;
-#else
-    CkAbort("Should not get here\n");
-#endif
   }
 
 
@@ -907,10 +895,10 @@ void controlPointManager::setFrameworkAdvancePhase(bool _frameworkShouldAdvanceP
 
   void controlPointManager::exitIfReady(){
      if( !alreadyRequestedMemoryUsage && !alreadyRequestedAll && !alreadyRequestedIdleTime && CkMyPe()==0){
-       CkPrintf("controlPointManager::exitIfReady exiting immediately\n");
+       //  CkPrintf("controlPointManager::exitIfReady exiting immediately\n");
        doExitNow();
      } else {
-       CkPrintf("controlPointManager::exitIfReady Delaying exiting\n");
+       // CkPrintf("controlPointManager::exitIfReady Delaying exiting\n");
        exitWhenReady = true;
      }
   }
@@ -919,7 +907,7 @@ void controlPointManager::setFrameworkAdvancePhase(bool _frameworkShouldAdvanceP
 
   void controlPointManager::doExitNow(){
          writeOutputToDisk();
-         CkPrintf("[%d] Control point manager calling CkExit()\n", CkMyPe());
+         //      CkPrintf("[%d] Control point manager calling CkExit()\n", CkMyPe());
          CkExit();
   }
 
@@ -1058,8 +1046,7 @@ public:
       controlPointSamplePeriod =  DEFAULT_CONTROL_POINT_SAMPLE_PERIOD;
     }
 
-    
-    
+  
     
     whichTuningScheme = RandomSelection;
 
@@ -2723,8 +2710,4 @@ void ControlPointWriteOutputToDisk(){
 
 /*! @} */
 
-#ifdef CP_DISABLE_TRACING
-#include "ControlPointsNoTrace.def.h"
-#else
 #include "ControlPoints.def.h"
-#endif
index ef1cda9f3297cdc6e303b5975aff92e4acc4bf0a..c4a740190f6dcaa7b9032375037d956101c37909 100644 (file)
@@ -9,12 +9,7 @@
 #ifndef __CONTROLPOINTS_H__
 #define __CONTROLPOINTS_H__
 
-
-#ifdef CP_DISABLE_TRACING
-#include "ControlPointsNoTrace.decl.h"
-#else
 #include "ControlPoints.decl.h"
-#endif
 
 #include <vector>
 #include <map>
index 4a5c1b33b2d997773e5476b33384697b66418afc..3d82948222c2ad198a9ae315e5950cc1b7f6e09f 100644 (file)
@@ -321,6 +321,12 @@ static int checkTraceOnPe(char **argv)
 /// defined in moduleInit.C
 void _createTraces(char **argv);
 
+
+bool enableCPTracing; // A global variable specifying whether or not the control point tracing module should be active in the run
+extern void _registerTraceControlPoints();
+extern void _createTracecontrolPoints(char **argv);
+
+
 /**
     traceInit:                 called at Converse level
     traceCharmInit:    called at Charm++ level
@@ -340,6 +346,17 @@ static inline void _traceInit(char **argv)
   // defined in moduleInit.C
   _createTraces(argv);
 
+  // Now setup the control point tracing module if desired. It is always compiled/linked in, but is not always enabled
+  // FIXME: make sure it is safe to use argv in SMP version 
+  // because CmiGetArgFlagDesc is destructive and this is called on all PEs.
+  if( CmiGetArgFlagDesc(argv,"+CPEnableMeasurements","Enable recording of measurements for Control Points") ){
+    enableCPTracing = true;
+    _createTracecontrolPoints(argv);   
+  } else {
+    enableCPTracing = false;
+  }
+  
+
   // set trace on/off
   CkpvAccess(_traces)->setTraceOnPE(CkpvAccess(traceOnPe));
 
index 2591f2ace76f6faec27c7db05421660c3e5e8be8..b3bf28544f04e2d13ac67e4e0a5bd1308732cca2 100644 (file)
@@ -20,6 +20,9 @@ CkGroupID traceControlPointsGID;
 /**
   For each TraceFoo module, _createTraceFoo() must be defined.
   This function is called in _createTraces() generated in moduleInit.C
+
+  This module is special in that it is always included in charm, but sometimes it does nothing.
+  This is called on all processors in SMP version.
 */
 void _createTracecontrolPoints(char **argv)
 {
@@ -110,6 +113,7 @@ void TraceControlPoints::beginExecute(int event,int msgType,int ep,int srcPe,
 
 void TraceControlPoints::endExecute(void)
 {
+  //  CkPrintf("TraceControlPoints::endExecute\n");
   nesting_level--;
   if(nesting_level == 0){
     
index 393ea13970cd36b2d15802ecd0af3cb50f131f2f..68e7fa1dd6e7314338785164a997f00816e2c0db 100644 (file)
@@ -648,9 +648,9 @@ LIBCK_CORE=trace-common.o tracef.o init.o register.o qd.o ck.o main.o  \
            ObjGraph.o graph.o LButil.o Refiner.o RefinerApprox.o  \
            RefinerComm.o bitvecset.o ckset.o ckheap.o CommLBHeap.o \
           NullLB.o LBSimulation.o $(COMLIB_CORE_OBJS) \
-          charmProjections.o cktiming.o pathHistory.o
+          charmProjections.o cktiming.o pathHistory.o controlPoints.o arrayRedistributor.o cp_effects.o trace-controlPoints.o
 
-charm-target: converse $(L)/libck.a $(L)/libckf.a loadbalancers default_libs comlib_objs controlPoints_objs 
+charm-target: converse $(L)/libck.a $(L)/libckf.a loadbalancers default_libs comlib_objs 
 
 CHARMLIBS: charm++ CONVLIBS
        cd libs; $(MAKE) charmlibs OPTS='$(OPTS)'
@@ -764,27 +764,6 @@ TRACE_OBJS =  trace-projections.o  trace-summary.o  trace-simple.o \
              trace-bluegene.o trace-projector.o trace-converse.o trace-all.o \
           trace-memory.o
 
-######################################################################
-#
-#Control Point Library
-#
-######################################################################
-
-
-CONTROLPOINTS_OBJS = controlPoints.o arrayRedistributor.o cp_effects.o
-
-controlPoints_objs: $(L)/libmoduleControlPoints.a $(L)/libmoduleControlPointsNoTrace.a
-
-$(L)/libmoduleControlPoints.a: $(CONTROLPOINTS_OBJS)
-       $(CHARMC) -o $(L)/libmoduleControlPoints.a $(CONTROLPOINTS_OBJS)
-
-$(L)/libmoduleControlPointsNoTrace.a: controlPointsNoTrace.o arrayRedistributor.o cp_effects.o
-       $(CHARMC) -o $(L)/libmoduleControlPointsNoTrace.a controlPointsNoTrace.o arrayRedistributor.o cp_effects.o
-
-controlPointsNoTrace.o: controlPoints.C controlPoints.h ControlPointsNoTrace.decl.h
-       $(CHARMC) -I. -c controlPoints.C -o controlPointsNoTrace.o -DCP_DISABLE_TRACING $(OPTS)
-
-
 
 ###############################################################################
 #
@@ -1025,7 +1004,7 @@ depends: basics
         fi; \
        echo '#generated by make depends' > $(DEPENDFILE); \
        processFiles='';        \
-        for i in $(LIBCONV_CORE) $(TRACE_OBJS) $(LIBCK_CORE) $(LB_OBJ) $(LIBBLUE_OBJS) $(COMLIB_OBJS) $(CONTROLPOINTS_OBJS); do \
+        for i in $(LIBCONV_CORE) $(TRACE_OBJS) $(LIBCK_CORE) $(LB_OBJ) $(LIBBLUE_OBJS) $(COMLIB_OBJS) ; do \
              processed='false';        \
              for f in $$processFiles; do       \
                if test $$i = $$f ; then        \
@@ -1055,7 +1034,7 @@ dependsCaseSensitive: basics
         fi; \
        echo '#generated by make depends' > $(DEPENDFILE); \
        processFiles='';        \
-        for i in $(LIBCONV_CORE) $(TRACE_OBJS) $(LIBCK_CORE) $(LB_OBJ) $(LIBBLUE_OBJS) $(COMLIB_OBJS) $(CONTROLPOINTS_OBJS); do \
+        for i in $(LIBCONV_CORE) $(TRACE_OBJS) $(LIBCK_CORE) $(LB_OBJ) $(LIBBLUE_OBJS) $(COMLIB_OBJS); do \
              processed='false';        \
              for f in $$processFiles; do       \
                if test $$i = $$f ; then        \