Merged arrays into Charj mainline.
authorJonathan Lifflander <jliffl2@illinois.edu>
Mon, 14 Jun 2010 15:44:45 +0000 (10:44 -0500)
committerJonathan Lifflander <jliffl2@illinois.edu>
Mon, 14 Jun 2010 15:44:45 +0000 (10:44 -0500)
204 files changed:
.cproject
.gitignore
build
examples/ampi/cuda/simple/.gitignore [new file with mode: 0644]
examples/ampi/cuda/simple/Makefile [new file with mode: 0644]
examples/ampi/cuda/simple/simple-cuda.cu [new file with mode: 0644]
examples/ampi/cuda/simple/simple.c [new file with mode: 0644]
examples/bigsim/sdag/jacobi-no-redn/bg_config
examples/bigsim/sdag/jacobi3d/jacobi3d.C
examples/bigsim/tools/changelog/changelog.C
examples/bigsim/tools/loadlog/loadlog.C
examples/bigsim/tools/rewritelog/interpolatelog.C
examples/fem/adapt/test/pgm.o [deleted file]
src/arch/bluegenel/conv-mach.sh
src/arch/bluegenep/cc-xlc.sh
src/arch/bluegenep/cc-xlc64.h [new file with mode: 0644]
src/arch/bluegenep/cc-xlc64.sh [new file with mode: 0644]
src/arch/bluegenep/conv-mach.sh
src/arch/bluegenep/machine.c
src/arch/bluegenep/manytomany.c
src/arch/common/cc-icc.sh
src/arch/common/cc-xlc64.sh
src/arch/common/conv-mach-bigsim.h
src/arch/common/conv-mach-ifort.sh
src/arch/cuda/hybridAPI/wr.h
src/arch/cuda/hybridAPI/wrqueue.cu
src/arch/lapi/cc-mpcc64.sh
src/arch/lapi/charmrun
src/arch/lapi/conv-common.h
src/arch/lapi/conv-mach.h
src/arch/lapi/conv-mach.sh
src/arch/lapi/machine.c
src/arch/mpi-bluegenep/cc-xlc.sh
src/arch/mpi-sp/cc-mpcc32.sh
src/arch/mpi-sp/cc-mpcc64.sh
src/arch/mpi-sp/conv-mach.sh
src/arch/mpi/charmrun
src/arch/net-aix-ppc/conv-mach.sh
src/arch/net-linux-ppc/cc-xlc64.sh
src/arch/net-linux-ppc/conv-mach-smp.h
src/arch/net-linux-ppc/conv-mach.sh
src/arch/net/charmrun/charmrun.c
src/arch/net/machine-ibverbs.c
src/arch/util/machine-smp.c
src/ck-com/MulticastStrategy.C
src/ck-core/charm++.h
src/ck-core/charmf.C
src/ck-core/charmmod.f90
src/ck-core/ck.C
src/ck-core/ck.h
src/ck-core/ckarray.h
src/ck-core/ckcheckpoint.C
src/ck-core/ckfutures.C
src/ck-core/cklocation.C
src/ck-core/cklocation.ci
src/ck-core/cknodegroupreduction.h
src/ck-core/ckreduction.C
src/ck-core/cktiming.C [new file with mode: 0644]
src/ck-core/cktiming.h [new file with mode: 0644]
src/ck-core/debug-charm.C
src/ck-core/debug-charm.h
src/ck-core/debug-message.C
src/ck-core/envelope.h
src/ck-core/init.C
src/ck-core/middle-blue.h
src/ck-core/middle-conv.h
src/ck-core/register.C
src/ck-cp/controlPoints.C
src/ck-cp/controlPoints.h
src/ck-cp/controlPointsf.h [new file with mode: 0644]
src/ck-ldb/LBDatabase.C
src/ck-ldb/LBDatabase.h
src/ck-ldb/NullLB.C
src/ck-ldb/lbdbf.C
src/ck-perf/trace-bluegene.C
src/ck-perf/trace-bluegene.h
src/ck-perf/trace-common.C
src/ck-perf/trace-common.h
src/ck-perf/trace-converse.c
src/ck-perf/trace-projections.C
src/ck-perf/trace-projections.h
src/ck-perf/trace-projector.C
src/ck-perf/trace-summary.C
src/ck-perf/trace.h
src/conv-ccs/ccs-builtins.C
src/conv-ccs/ccs-server.c
src/conv-ccs/conv-ccs.c
src/conv-ccs/conv-ccs.h
src/conv-ccs/middle-ccs.C [new file with mode: 0644]
src/conv-core/conv-config.h
src/conv-core/conv-trace.h
src/conv-core/convcore.c
src/conv-core/converse.h
src/conv-core/cpuaffinity.c
src/conv-core/debug-conv.c
src/conv-core/debug-conv.h
src/conv-core/global-elfgot.C
src/conv-core/memoryaffinity.c [new file with mode: 0644]
src/conv-core/msgmgr.c
src/conv-core/threads.c
src/conv-ldb/cldb.c
src/conv-ldb/cldb.neighbor.c
src/conv-ldb/cldb.rand.c
src/conv-ldb/cldb.spray.c
src/conv-ldb/edgelist.c
src/conv-ldb/generate.c
src/conv-ldb/graphdefs.h [moved from src/conv-ldb/typedefs.h with 93% similarity]
src/conv-perf/traceCore.C
src/conv-perf/traceCoreAPI.h
src/conv-perf/traceCoreCommon.C
src/langs/bluegene/bigsim_init.C
src/langs/bluegene/bigsim_logs.C
src/langs/bluegene/bigsim_logs.h
src/langs/bluegene/bigsim_proc.C
src/langs/bluegene/bigsim_record.C
src/langs/bluegene/bigsim_record.h
src/langs/bluegene/blue.C
src/langs/bluegene/blue.h
src/langs/bluegene/blue_impl.h
src/langs/charj/.gitignore
src/langs/charj/Makefile
src/langs/charj/bin/charjc
src/langs/charj/build.xml
src/langs/charj/lib/antlr-2.7.7.jar [deleted file]
src/langs/charj/lib/antlr-3.0.1.jar [deleted file]
src/langs/charj/lib/antlr-3.1b1.jar [deleted file]
src/langs/charj/lib/antlr-3.2.jar [new file with mode: 0644]
src/langs/charj/lib/antlr-runtime-3.0.1.jar [deleted file]
src/langs/charj/lib/antlr-runtime-3.1b1.jar [deleted file]
src/langs/charj/lib/gunit-1.0.2.jar [deleted file]
src/langs/charj/lib/stringtemplate-3.1.jar [deleted file]
src/langs/charj/lib/stringtemplate-3.1b1.jar [deleted file]
src/langs/charj/src/charj/translator/AstModifier.java [new file with mode: 0644]
src/langs/charj/src/charj/translator/Charj.g
src/langs/charj/src/charj/translator/Charj.stg
src/langs/charj/src/charj/translator/CharjAST.java
src/langs/charj/src/charj/translator/CharjASTModifier.g [new file with mode: 0644]
src/langs/charj/src/charj/translator/CharjEmitter.g
src/langs/charj/src/charj/translator/CharjSemantics.g
src/langs/charj/src/charj/translator/ClassSymbol.java
src/langs/charj/src/charj/translator/MethodSymbol.java
src/langs/charj/src/charj/translator/PackageScope.java
src/langs/charj/src/charj/translator/SymbolTable.java
src/langs/charj/src/charj/translator/SymbolWithScope.java
src/langs/charj/src/charj/translator/Translator.java
src/langs/charj/tests/fib/Fib.cj [new file with mode: 0644]
src/langs/charj/tests/fib/Fib.h [deleted file]
src/langs/charj/tests/hello/HelloArray.cj [new file with mode: 0644]
src/langs/charj/tests/unit/Conditional.cj
src/langs/charj/tests/unit/Declarations.cj
src/langs/charj/tests/unit/Empty.cj
src/langs/charj/tests/unit/ForLoop.cj
src/langs/charj/tests/unit/Main.cj [new file with mode: 0644]
src/langs/charj/tests/unit/ReservedWords.cj
src/langs/charj/tests/unit/SimpleClass.cj
src/libs/ck-libs/ampi/ampi.C
src/libs/ck-libs/ampi/ampi.h
src/libs/ck-libs/ampi/ampiimpl.h
src/libs/ck-libs/common.mk
src/libs/ck-libs/idxl/idxl.C
src/libs/ck-libs/pose/cancel.h
src/libs/ck-libs/pose/chpt.h
src/libs/ck-libs/pose/eqheap.h
src/libs/ck-libs/pose/etrans.pl
src/libs/ck-libs/pose/eventID.h
src/libs/ck-libs/pose/evq.h
src/libs/ck-libs/pose/gvt.C
src/libs/ck-libs/pose/gvt.h
src/libs/ck-libs/pose/lbObject.h
src/libs/ck-libs/pose/memory_temporal.h
src/libs/ck-libs/pose/opt.h
src/libs/ck-libs/pose/pose.C
src/libs/ck-libs/pose/pose.h
src/libs/ck-libs/pose/pvtobj.C
src/libs/ck-libs/pose/pvtobj.h
src/libs/ck-libs/pose/rep.h
src/libs/ck-libs/pose/seq.h
src/libs/ck-libs/pose/sim.C
src/libs/ck-libs/pose/sim.ci
src/libs/ck-libs/pose/sim.h
src/libs/ck-libs/pose/srtable.h
src/libs/ck-libs/pose/stats.h
src/libs/ck-libs/pythonCCS/charmdebug-python.C
src/libs/ck-libs/tcharm/Make.depends [new file with mode: 0644]
src/libs/ck-libs/tcharm/Makefile
src/libs/ck-libs/tcharm/tcharm.C
src/scripts/Make.depends
src/scripts/Makefile
src/scripts/configure
src/scripts/configure.in
src/scripts/conv-autoconfig.h.in
src/util/ckcomplex.h
src/xlat-i/xi-grammar.tab.C
src/xlat-i/xi-grammar.tab.h
src/xlat-i/xi-grammar.y
src/xlat-i/xi-main.C
src/xlat-i/xi-symbol.C
src/xlat-i/xi-symbol.h
tests/ampi/Makefile
tests/charm++/chkpt/Makefile
tests/charm++/kNeighbor/kNeighbor.C
tests/charm++/kNeighbor/kNeighbor.ci
tests/converse/commbench/smputil.c
tests/util/check.C

index 3dbb439aa86e5245be9ce7b193d37c9392026893..ba6c2fcca0fa545184bbfd14f84e1b70434efb4e 100644 (file)
--- a/.cproject
+++ b/.cproject
@@ -35,6 +35,7 @@
 <listOptionValue builtIn="false" value="CMK_SEPARATE_PATH=1"/>
 <listOptionValue builtIn="false" value="CMK_USE_BACKTRACE=1"/>
 <listOptionValue builtIn="false" value="CMK_CCS_AVAILABLE"/>
+<listOptionValue builtIn="false" value="CMK_CHARMDEBUG=1"/>
 </option>
 <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.899752412" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
 </tool>
@@ -49,6 +50,7 @@
 <listOptionValue builtIn="false" value="CMK_USE_BACKTRACE=1"/>
 <listOptionValue builtIn="false" value="CMK_CCS_AVAILABLE"/>
 <listOptionValue builtIn="false" value="CPD_USE_MMAP=1"/>
+<listOptionValue builtIn="false" value="CMK_CHARMDEBUG=1"/>
 </option>
 <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1357944409" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
 </tool>
@@ -65,7 +67,7 @@
 </toolChain>
 </folderInfo>
 <sourceEntries>
-<entry excluding="bin/|include/|lib/|lib_so/|tmp/|net-**" flags="VALUE_WORKSPACE_PATH" kind="sourcePath" name=""/>
+<entry excluding="bin/|include/|lib/|lib_so/|tmp/|net-**|mpi-**" flags="VALUE_WORKSPACE_PATH" kind="sourcePath" name=""/>
 </sourceEntries>
 </configuration>
 </storageModule>
index b5632c94ab4409a16f7f0b26a50599517db3eebf..d4763e22636362a49a54859e8c1a5f8aaef039bb 100644 (file)
@@ -23,9 +23,10 @@ lapi*
 vmi-*
 multicore-*
 uth-*
+bluegenep*
 
 # Ignore cruft that would result from compiling charm example/test code
 # Note this is negated inside src/arch to permit addition of new charmrun files in there
 charmrun
-
+pgm
 *.swp
diff --git a/build b/build
index dd5877a2f4de62f81d43a83a4fab67b12795a419..7bddf2c488db5daeef86632f84e8d211a69d9fce 100755 (executable)
--- a/build
+++ b/build
@@ -83,13 +83,17 @@ syntax() {
   echo "  --build-shared     build Charm++ dynamic libraries (.so) (default)"
   echo "  --no-build-shared  don't build Charm++'s shared libraries"
   echo ''
+  echo 'Enable/disable features:'
+  src/scripts/configure --help | grep enable-
+  src/scripts/configure --help | grep with-
+  echo "  --with-production       build Charm++ with all optimizations for maximum performance, and disabling all above features"
+  echo ''
   echo 'Miscellaneous options:'
   echo '  --incdir=DIR       specify additional include path for compiler'
   echo '  --libdir=DIR      specify additional lib path for compiler'
   echo '  --basedir=DIR             shortcut for the above two - DIR/include and DIR/lib'
   echo '  -j[N]              parallel make, N is the number of paralle make jobs'
   echo "  --with-romio       build AMPI with ROMIO library"
-  echo "  --with-production  build Charm++ with all optimizations for maximum performance"
   echo "  --destination=DIR  build Charm++ inside DIR, by default the destination is <version>"
   echo "  --suffix=DIR       append DIR to the destination directory of the Charm++ build"
   echo "  --tau-makefile=FILE Specify which TAU stub makefile to use"
@@ -300,6 +304,14 @@ do
                WITH_PRODUCTION="true" 
                shift
                ;;
+    --with-*)
+               CONFIG_OPTS="$CONFIG_OPTS $1"
+               shift
+               ;;
+    --without-*)
+               CONFIG_OPTS="$CONFIG_OPTS $1"
+               shift
+               ;;
     --build-shared|-bs)
                # obsolete, do nothing
                shift
@@ -344,6 +356,10 @@ do
                CONFIG_OPTS="$CONFIG_OPTS $1"
                shift
                ;;
+    --disable-*)
+               CONFIG_OPTS="$CONFIG_OPTS $1"
+               shift
+               ;;
     -j*)
                 PMAKENUM=`echo $1 | awk -Fj '{print $2}'`
                MAKEOPTS="$MAKEOPTS -j $PMAKENUM"
@@ -547,7 +563,7 @@ then
     echo '#define CMK_OPTIMIZE 1' >> $ConvHeader
     # Prepend optimize so that an explicit -no-optimize still works
     OPTS="-optimize $OPTS"
-    CONFIG_OPTS="--disable-tracing --disable-replay $CONFIG_OPTS"
+    CONFIG_OPTS="--disable-tracing --disable-charmdebug --disable-replay --disable-error-checking $CONFIG_OPTS"
 fi
 
 # build with Tau
@@ -588,6 +604,7 @@ echo $VERSION | sed -e 's@-.*@@' > $DESTINATION/tmp/.gdir
 if test $BUILD_EMULATOR = 1
 then
   PROGRAM="$PROGRAM bigsim"
+#  CONFIG_OPTS="--disable-charmdebug $CONFIG_OPTS"
 fi
 
 printError()
diff --git a/examples/ampi/cuda/simple/.gitignore b/examples/ampi/cuda/simple/.gitignore
new file mode 100644 (file)
index 0000000..ab23474
--- /dev/null
@@ -0,0 +1 @@
+simple
diff --git a/examples/ampi/cuda/simple/Makefile b/examples/ampi/cuda/simple/Makefile
new file mode 100644 (file)
index 0000000..6990f14
--- /dev/null
@@ -0,0 +1,26 @@
+# Ensure that CUDA_DIR, NVIDIA_CUDA_SDK, and LD_LIBRARY_PATH are set
+# in your environment. For the tests to work right, those settings
+# need to be in a login script.
+
+NVCC=$(CUDA_DIR)/bin/nvcc
+CHARMDIR=../../../..
+AMPICC=$(CHARMDIR)/bin/ampicc
+
+CC=$(AMPICC)
+LD=$(AMPICC)
+CFLAGS=$(OPTS)
+LDFLAGS=$(OPTS)
+
+simple: simple-cuda.o
+
+simple-cuda.o: simple-cuda.cu
+       $(NVCC) $(OPTS) -I $(CHARMDIR)/include -c simple-cuda.cu
+
+test:
+       ./simple +vp 1
+       ./simple +vp 2
+       ./simple +vp 16
+       ./charmrun +p2 ./simple +vp 16
+
+clean:
+       rm -f charmrun simple *.o
diff --git a/examples/ampi/cuda/simple/simple-cuda.cu b/examples/ampi/cuda/simple/simple-cuda.cu
new file mode 100644 (file)
index 0000000..b29323a
--- /dev/null
@@ -0,0 +1,37 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include "wr.h"
+
+extern workRequestQueue* wrQueue;
+
+__global__ void helloKernel() {
+
+}
+
+extern "C"
+void *kernelSetup() {
+  workRequest *wr = new workRequest;
+  wr = (workRequest*) malloc(sizeof(workRequest));
+
+  wr->dimGrid.x = 1;
+  wr->dimBlock.x = 1;
+  wr->smemSize = 0;
+  wr->id = 0;
+  wr->nBuffers = 0;
+  wr->bufferInfo = NULL;
+
+  return wr;
+}
+
+void kernelSelect(workRequest *wr) {
+  printf("inside kernelSelect\n");
+  switch (wr->id) {
+  case 0:
+    printf("calling kernel\n");
+    helloKernel<<<wr->dimGrid,wr->dimBlock,wr->smemSize>>>();
+    break;
+  default:
+    printf("error: id %d not valid\n", wr->id);
+    break;
+  }
+}
diff --git a/examples/ampi/cuda/simple/simple.c b/examples/ampi/cuda/simple/simple.c
new file mode 100644 (file)
index 0000000..a115a5e
--- /dev/null
@@ -0,0 +1,16 @@
+#include "ampi.h"
+
+void *kernelSetup();
+
+int main(int argc, char **argv)
+{
+    MPI_Init(&argc, &argv);
+    MPI_Request req;
+    MPI_Status sts;
+    void *wr = kernelSetup();
+    AMPI_GPU_Iinvoke(wr, &req);
+    MPI_Wait(&req, &sts);
+
+    MPI_Finalize();
+    return 0;
+}
index 8ca74d83138f5d1a9ea4629a0bc11cb6f1c8efbc..7785ba7b357ca8b2360e415ebafcf8df224667ab 100644 (file)
@@ -1,11 +1,11 @@
-x 4
+x 2
 y 2
 z 2
 cth 1
-wth 1
+wth 2
 #stacksize  4000
 #timing  walltime
-timing  bgelapse
+timing  elapse
 #timing  counter
 cpufactor   1.0
 fpfactor    5e-7
index 62fcb824d4324145249053cffde417bef0a787db..1dd2f7bed390a304b01f3299cc9ed29caf6ebf8d 100644 (file)
@@ -1,10 +1,3 @@
-/*****************************************************************************
- * $Source$
- * $Author$
- * $Date$
- * $Revision$
- *****************************************************************************/
-
 /** \file jacobi3d.C
  *  Author: Abhinav S Bhatele
  *  Date Created: June 01st, 2009
index 9e991145e030bfeacef3a42c8cdadae5271d5b89..e06cf3c602e164acba0ad023eb562d45f28ca8f7 100644 (file)
@@ -21,6 +21,8 @@ int main()
                                                                                 
   int* allNodeOffsets = BgLoadOffsets(totalProcs,numPes);
 
+  int numNodes = totalProcs / numWth;
+
   // load timelines from each emulating processor
   for (int i=0; i<numPes; i++) 
   {
@@ -28,7 +30,9 @@ int main()
     int rec_count = 0;
 
       // procNum is the target PE on this emulating processor
-    for(int procNum=i;procNum<totalProcs;procNum+=numPes){
+    for (int nodeNum=i;nodeNum<numNodes;nodeNum+=numPes) {
+     for (int procNum=nodeNum*numWth; procNum<(nodeNum+1)*numWth; procNum++) {
+       //for(int procNum=i;procNum<totalProcs;procNum+=numPes){
 
       BgTimeLineRec &tlinerec = tlinerecs[rec_count];
       rec_count++;
@@ -53,6 +57,7 @@ int main()
         }  
       }
 
+    }
     }
     BgWriteTimelines(i,tlinerecs,rec_count,OUTPUTDIR);
     delete[] tlinerecs;
index 3483e8106e5e06a81832080815ebdcea19424ec8..539033b7a612dc55f398ae7c01ef9d5951c3815c 100644 (file)
@@ -57,6 +57,8 @@ int main()
         BgMsgEntry *msg = bglog->msgs[midx];
         if (msg->sendTime < bglog->startTime || msg->sendTime > bglog->endTime)
           printf("[%d] Invalid MsgEntry [%d]: sendTime: %f in log startT: %f endT: %f execT: %f\n", i, idx, msg->sendTime, bglog->startTime, bglog->endTime, bglog->execTime);
+        if (msg->sendTime > msg->recvTime)
+          printf("[%d] Invalid recvTime in MsgEntry [%d]: sendTime: %f recvTime: %f\n", i, idx, msg->sendTime, msg->recvTime);
       }
     }
 
index 3c208f9d536117bffd36e092d92dc4dda1b49918..7f58493666405d843962af9e8903c8f0159d8fe4 100644 (file)
@@ -59,7 +59,7 @@ double map_linearly_to_interval(double val, double old_lower, double old_upper,
   if(val == old_lower)
        new_val = new_lower;
   else if(val == old_upper)
-       new_val = old_lower;
+       new_val = new_upper;
   else
        new_val = new_lower + ((val-old_lower)*(new_upper-new_lower))/(old_upper-old_lower);
 
@@ -118,12 +118,15 @@ int main()
     // Create output directory
     mkdir(OUTPUTDIR, 0777);
 
+    int numNodes = totalProcs / numWth;
 
     for (int fileNum=0; fileNum<numPes; fileNum++){
         BgTimeLineRec *tlinerecs = new BgTimeLineRec[totalProcs/numPes+1];
         int rec_count = 0;
 
-        for(int procNum=fileNum;procNum<totalProcs;procNum+=numPes){
+        //for(int procNum=fileNum;procNum<totalProcs;procNum+=numPes){
+       for (int nodeNum=fileNum;nodeNum<numNodes;nodeNum+=numPes) {
+         for (int procNum=nodeNum*numWth; procNum<(nodeNum+1)*numWth; procNum++) {
 
             BgTimeLineRec &tlinerec = tlinerecs[rec_count];
             rec_count++;
@@ -298,8 +301,8 @@ int main()
 
             }
 
-
-        }
+        }         // end of procNum
+      }    // end of nodeNum
 
 #ifdef WRITE_OUTPUT_FILES
             // Write out the file
diff --git a/examples/fem/adapt/test/pgm.o b/examples/fem/adapt/test/pgm.o
deleted file mode 100644 (file)
index 60bb731..0000000
Binary files a/examples/fem/adapt/test/pgm.o and /dev/null differ
index 987ef7d65b4de6833724d8ff9819777312fb414c..a3bac84ba989539c30f65aef86a938188368d783 100644 (file)
@@ -17,12 +17,12 @@ then
 fi
 
 BGL_BIN=$BGL_FLOOR/blrts-gnu/bin
-BGL_INC="-I$BGL_INSTALL/bglsys/include"
+BGL_INC="-I$BGL_INSTALL/bglsys/include -I/gsa/yktgsa/home/g/m/gmartyna/dev/myincs"
 #-I$BGL_INSTALL/blrts-gnu/powerpc-bgl-blrts-gnu/sys-include/" 
 
 #BGL_LIB="-L$BGL_INSTALL/bglsys/lib -L/gsa/watgsa/home/s/a/sameer77/bgx/new2/bglsw-install/blrts-gnu/powerpc-bgl-blrts-gnu/lib -lc"
 
-BGL_LIB="-L$BGL_INSTALL/bglsys/lib"        #" -L$BGL_INSTALL/blrts-gnu/powerpc-bgl-blrts-gnu/lib"
+BGL_LIB="-L$BGL_INSTALL/bglsys/lib -L/gsa/yktgsa/home/g/m/gmartyna/dev/mylibs"        #" -L$BGL_INSTALL/blrts-gnu/powerpc-bgl-blrts-gnu/lib"
 
 # test if compiler binary present
 if test ! -x $BGL_BIN/powerpc-bgl-blrts-gnu-g++
index 34b4e5a7ea3c5eb71370f436a1cada0b4db4a55b..22feae18e948aca1a8a70373ad0a50df9c77599a 100644 (file)
@@ -1,8 +1,8 @@
-XLC_PRE=/opt/ibmcmp
+XLC_PRE=/soft/apps/ibmcmp-jan2010
 XLC_POST=bin/bg
 XLC_F=$XLC_PRE/xlf/bg/11.1
-CMK_CC="$XLC_PRE/vac/bg/9.0/${XLC_POST}xlc -qcpluscmt -I$CHARMINC $BGP_INC"
-CMK_CXX="$XLC_PRE/vacpp/bg/9.0/${XLC_POST}xlC -I$CHARMINC $BGP_INC"
+CMK_CC="$XLC_PRE/vac/bg/9.0/${XLC_POST}xlc -qcpluscmt -qhalt=e -I$CHARMINC $BGP_INC"
+CMK_CXX="$XLC_PRE/vacpp/bg/9.0/${XLC_POST}xlC -qhalt=e -I$CHARMINC $BGP_INC"
 CMK_LD="$CMK_CC $BGP_LIB "
 CMK_LDXX="$CMK_CXX $BGP_LIB"
 CMK_CF77="$XLC_F/${XLC_POST}xlf "
diff --git a/src/arch/bluegenep/cc-xlc64.h b/src/arch/bluegenep/cc-xlc64.h
new file mode 100644 (file)
index 0000000..9effcb3
--- /dev/null
@@ -0,0 +1 @@
+/* no defines needed. */
diff --git a/src/arch/bluegenep/cc-xlc64.sh b/src/arch/bluegenep/cc-xlc64.sh
new file mode 100644 (file)
index 0000000..5ecc2fe
--- /dev/null
@@ -0,0 +1,22 @@
+XLC_PRE=/soft/apps/ibmcmp-jan2010
+XLC_POST=bin/bg
+COMMENT="64-bit mode ignored! No VM on bluegene --> no 64 bit memory model."
+XLC_F=$XLC_PRE/xlf/bg/11.1
+CMK_CC="$XLC_PRE/vac/bg/9.0/${XLC_POST}xlc -qcpluscmt -I$CHARMINC $BGP_INC"
+CMK_CXX="$XLC_PRE/vacpp/bg/9.0/${XLC_POST}xlC -I$CHARMINC $BGP_INC"
+CMK_LD="$CMK_CC $BGP_LIB "
+CMK_LDXX="$CMK_CXX $BGP_LIB"
+CMK_CF77="$XLC_F/${XLC_POST}xlf "
+CMK_CF90="$XLC_F/${XLC_POST}xlf90  -qsuffix=f=f90" 
+CMK_CF90_FIXED="$XLC_PRE/xlf/11.1/${XLC_POST}xlf90 " 
+CMK_C_OPTIMIZE='-O3 -qstrict -Q  '
+CMK_CXX_OPTIMIZE='-O3 -qstrict -Q '
+CMK_AR='ar cq'
+CMK_NM='nm '
+CMK_QT="aix"
+CMK_NATIVE_CC="gcc"
+CMK_NATIVE_CXX="g++"
+CMK_NATIVE_LD="$CMK_NATIVE_CC"
+CMK_NATIVE_LDXX="$CMK_NATIVE_CXX"
+CMK_RANLIB="ranlib"
+CMK_F90LIBS="-lxlf90 -lxlopt -lxl -lxlfmath"
index 218fde949caa3d09f4d0b0c5503b8df6c6ed9667..ad1b68b1cc838c4dbe0f7ea8c113ae5e645e4a11 100644 (file)
@@ -12,10 +12,12 @@ then
   BGP_INSTALL=$BGP_FLOOR
 fi
 
+BGP_ZLIB=/soft/apps/zlib-1.2.3
+
 BGP_BIN=$BGP_FLOOR/gnu-linux/bin
-BGP_INC="-I$BGP_INSTALL/comm/include -I$BGP_INSTALL/arch/include"
+BGP_INC="-I$BGP_INSTALL/comm/include -I$BGP_INSTALL/arch/include -I$BGP_ZLIB/include "
 
-BGP_LIB="-L$BGP_INSTALL/comm/lib -L$BGP_INSTALL/runtime/SPI"
+BGP_LIB="-L$BGP_INSTALL/comm/lib -L$BGP_INSTALL/runtime/SPI -L$BGP_ZLIB/lib "
 
 # test if compiler binary present
 if test ! -x $BGP_BIN/powerpc-bgp-linux-g++
index cfc04d758941b9854edd43ce05330451834cf85f..d02b227960d48d7d7d8051da6c5796092d1f154f 100644 (file)
@@ -165,7 +165,7 @@ static void CmiStartThreads(char **argv) {
 //int received_broadcast;
 
 /*Add a message to this processor's receive queue, pe is a rank */
-static void CmiPushPE(int pe,void *msg) {
+void CmiPushPE(int pe,void *msg) {
     CmiState cs = CmiGetStateN(pe);
     MACHSTATE2(3,"Pushing message into rank %d's queue %p{",pe, cs->recv);
 #if CMK_IMMEDIATE_MSG
index 3138fb730d49ee2d00b83841d741e119c1755468..154550c36610eb0b38d7e0a646ea0e59a4066598 100644 (file)
@@ -213,7 +213,9 @@ void   CmiDirect_manytomany_start ( void       * h,
      & handle->send_request[tag],
      handle->m2m_scb_done[tag],
      DCMF_MATCH_CONSISTENCY,
+     0,
      tag,
+     NULL,
      handle->m2m_srankIndex[tag],
      handle->m2m_sndbuf[tag],
      handle->m2m_sndlens[tag],
index b024abe2fad862db458f0f09aa980d76e5545ab6..e457c927c0fb1b599bd082465b33a69c36e38e19 100644 (file)
@@ -7,7 +7,7 @@ test -z "$ICC_ver" && echo "ICC compiler not found!" && exit 1
 
 #test intel x86, AMD or IA-64
 CPU_model=""
-model=`cat /proc/cpuinfo | grep 'model name'`
+model=`cat /proc/cpuinfo | grep 'model name' | tail -1`
 if echo $model | grep 'AMD' > /dev/null 2>/dev/null
 then
   CPU_model="AMD"
index b53e6232d1e6ad2ccc4d193f89dce1ec5f57ea79..50be1e33ab57febcf9ca38cb53a89be51a4e1267 100644 (file)
@@ -6,8 +6,18 @@ CMK_CXX_OPTIMIZE='-O3 -qstrict -Q! '
 CMK_CC64=true
 CMK_PIC='-qpic=small'
 
-CMK_LD="$CMK_CC -brtl "
-CMK_LDXX="$CMK_CXX -brtl "
+CMK_LD="$CMK_CC "
+CMK_LDXX="$CMK_CXX "
+if test "$isAIX" = true
+then
+  CMK_LD="$CMK_LD -brtl"
+  CMK_LDXX="$CMK_LDXX -brtl"
+fi
+
+CMK_SEQ_CC='xlc_r -q64'
+CMK_SEQ_LD='xlc_r -q64'
+CMK_SEQ_CXX='xlC_r -qstaticinline -q64'
+CMK_SEQ_LDXX='xlC_r -q64'
 
 CMK_NATIVE_CC='xlc_r -q64'
 CMK_NATIVE_LD='xlc_r -q64'
@@ -18,5 +28,9 @@ CMK_CF77='xlf_r -q64 '
 CMK_CF90='xlf90_r -q64 -qsuffix=f=f90' 
 CMK_CF90_FIXED='xlf90_r -q64 ' 
 
-CMK_AR='ar -X 64 cq'
-CMK_NM='nm -X 64'
+if test "$isAIX" = "true"
+then
+  AR_OPTS="-X 64"
+fi
+CMK_AR="ar $AR_OPTS cq"
+CMK_NM="nm $AR_OPTS"
index cfb0dfaaf06c55a0afe3fe962263650572b97826..9ff6bb54be569d9aaffb4e0b255d62123fd29f89 100644 (file)
@@ -16,4 +16,4 @@
 #define BIGSIM_OOC_PREFETCH                                0
 
 
-#define CMK_CHARE_USE_PTR                                  1
+/*#define CMK_CHARE_USE_PTR                                  1 */
index 4f746a537fee03f0e81c3bdbc68dc3e68c084a55..b2b759386b90bb14b1e00faa43abe1f87bc84b93 100644 (file)
@@ -10,7 +10,15 @@ then
 fi
 if test -x "$F90DIR" 
 then
-  F90LIBDIR="`dirname $F90DIR`/../lib"
+  F90DIR=`dirname $F90DIR`
+  Minor=`basename $F90DIR`
+  if test "$Minor" = "intel64"
+  then
+    F90DIR=`dirname $F90DIR`
+    F90LIBDIR="$F90DIR/../lib/$Minor"
+  else
+    F90LIBDIR="$F90DIR/../lib"
+  fi
   F90MAIN="$F90LIBDIR/for_main.o"
 fi
 # for_main.o is important for main() in f90 code
index 7080b217fd3d8c75b5141096773907bce0f939ae..306524271fdaeb0dbf23cb92c465a676219a9b5e 100644 (file)
@@ -108,8 +108,8 @@ typedef struct workRequest {
   int id; 
 
   /* The following flag is used for control by the system */
-
   int state; 
+
   /* user data, may be used to pass scalar values to kernel calls */
   void *userData; 
 
@@ -170,6 +170,7 @@ typedef struct {
  *
  */
 void enqueue(workRequestQueue *q, workRequest *wr); 
+void setWRCallback(workRequest *wr, void *cb);
 
 #ifdef GPU_MEMPOOL
 void hapi_poolFree(void *);
index 9a13704e71b9f52ceae7af3bcc94e8b9fea97481..566fc5649b3eeae2b1005b1c02e6f6419099a116 100644 (file)
@@ -82,6 +82,10 @@ void enqueue(workRequestQueue *q, workRequest *wr) {
 #endif
 }
 
+void setWRCallback(workRequest *wr, void *cb) {
+    wr->callbackFn = cb;
+}
+
 void dequeue(workRequestQueue *q) {
   q->head++; 
   if (q->head == q->capacity) {
index a48b9c6f7ce163443e28eac3a2ee6cfeadcdba5a..0c73ce36d6ff978cf173f89c56a149dea35dde9d 100644 (file)
@@ -1,6 +1,6 @@
 COMMENT="Enable 64-bit mode (-q64)"
-CMK_CC='mpcc_r -q64 -qcpluscmt '
-CMK_CXX='mpCC_r -q64 -qstaticinline '
+CMK_CC='mpcc_r -q64 -qcpluscmt -qhalt=e '
+CMK_CXX='mpCC_r -q64 -qstaticinline -qhalt=e '
 CMK_LD="mpcc_r -q64 -brtl"
 CMK_LDXX="mpCC_r -q64 -brtl"
 CMK_SEQ_CC='xlc_r -q64'
index 0fd9b18179a7f06659b73f341e6616f5903a12d8..2a6e0f10204115729ce7e3fee531d19cffa25114 100755 (executable)
@@ -15,13 +15,17 @@ while [ $# -gt 0 ]
          shift
          ;;
       +ppn)
-         args=$args"$1 $2"
+         args=$args"$1 $2 "
          ppnused="$2"
          shift
          ;;
       +p[0-9]*)
           pes=`expr substr $1 3 10`
           ;;
+      +ppn[0-9]*)
+         ppnused=`expr substr $1 5 12`
+         args=$args"+ppn $ppnused "
+         ;;
       +n)
          nodes=$2
           shift
@@ -62,6 +66,7 @@ if [ -z "$args" -o "$args1" == "-" -o "$args1" == "+" ]
 fi
 
 executable=`echo $args | awk '{print $1}'`
+args=`echo ${args#*$executable}`
 
 # check if the node size has been set, or a file called .nodesize is present
 #if [ -z "$nodesize" ]
@@ -293,6 +298,10 @@ EOF
 # user exports
 grep -E -v "#@" $llfile | grep "export" >> $filename
 
+if [ ! -x "$executable" ]
+    then
+    executable = "$PWD/$executable"
+fi
 if [ ! -x "$executable" ]
     then
     echo "Executable not found: $executable"
@@ -302,8 +311,8 @@ fi
 if [ $interactive -eq 0 ]
     then
     # submit the job as poe, iterating 
-    echo "Running interactively> poe $args -llfile $filename"
-    poe $args -llfile $filename
+    echo "Running interactively> poe $executable $args -llfile $filename"
+    poe $executable $args -llfile $filename
     status=$?
     if [ $status -eq 255 ];
       then
@@ -315,7 +324,7 @@ if [ $interactive -eq 0 ]
       do
       echo "Retrying in two minutes..."
       sleep 120
-      poe $args -llfile $filename;
+      poe $executable $args -llfile $filename;
       status=$?
       if [ $status -eq 255 ];
         then
@@ -328,10 +337,10 @@ if [ $interactive -eq 0 ]
     
 else
     # append the command at the end of the file and llsubmit it
-    echo "Submitting batch> poe $args"
+    echo "Submitting batch> poe $executable $args"
     cat >> $filename <<EOF
 
-poe $args
+poe $executable $args
 EOF
     llsubmit $filename
 fi
index 05ffd2f11fc783ebcba535ef3a597ac3c3d9e13e..4a5f5f8f2915bb8775ca435b5bcb448e368c2dde 100644 (file)
@@ -1,4 +1,6 @@
 
+#define CMK_CONVERSE_LAPI                                  1
+
 #define CMK_CMIDELIVERS_USE_COMMON_CODE                    1
 
 #define CMK_CMIPRINTF_IS_A_BUILTIN                         0
index c6692c2f64568bc9b16ca59d391af6e1356feb23..c67b4e00f1be09335c315c7231920ff0a2b73391 100644 (file)
@@ -18,7 +18,7 @@
 #define CMK_MEMORY_PAGESIZE                                8192
 #define CMK_MEMORY_PROTECTABLE                             0
 
-#define CMK_NODE_QUEUE_AVAILABLE                           1
+#define CMK_NODE_QUEUE_AVAILABLE                           0
 
 #define CMK_SHARED_VARS_UNAVAILABLE                        1 /* non SMP versions */
 #define CMK_SHARED_VARS_POSIX_THREADS_SMP                  0 /* SMP versions */
index d88d40f85af26cf393042d423418d8bd810ac9d9..8335555799026ed7df8fc6adcae3bcd9ff82c83b 100644 (file)
@@ -1,35 +1,65 @@
 COMMENT="Enable 32-bit mode (-q32)"
 
+isLinux=false
+isAIX=false
+case `uname -s` in
+Linux) 
+       isLinux=true
+       ;;
+AIX)
+       isAIX=true
+       ;;
+esac
+
 CMK_CPP_CHARM='/usr/lib/cpp -P -D_NO_PROTO '
 CMK_CPP_C='/usr/lib/cpp -P -D_NO_PROTO '
+CMK_CC='mpcc_r -q32 -qcpluscmt -qhalt=e '
+CMK_CXX='mpCC_r -q32 -qstaticinline -qhalt=e '
+CMK_CXXPP='xlC -q32 -E '
+CMK_C_OPTIMIZE='-O3 -qstrict -Q  '
+CMK_CXX_OPTIMIZE='-O3 -qstrict -Q '
+CMK_XIOPTS=''
 CMK_LDRO='ld -r -o '
 CMK_LDRO_WORKS=0
-CMK_CC='mpcc_r -q32 -qcpluscmt '
-CMK_CXX='mpCC_r -q32 -qstaticinline '
-CMK_CXXPP='xlC -q32 -E '
+CMK_LD_SHARED='-G'
 CMK_LD="mpcc_r -q32 -brtl "
 CMK_LDXX="mpCC_r -q32 -brtl "
-CMK_CF77='mpxlf_r -q32 '
-CMK_CF90='mpxlf90_r -q32 -qsuffix=f=f90'
-CMK_CF90_FIXED='mpxlf90_r -q32 '
-CMK_C_OPTIMIZE='-O3 -qstrict -Q  '
-CMK_CXX_OPTIMIZE='-O3 -qstrict -Q '
-CMK_AR='ar -X 32 cq'
-CMK_RANLIB='true'
+if test $isAIX = true
+then
+CMK_QT='aix'
 CMK_LIBS="-lckqt -lhC -llapi_r"
-CMK_LD_SHARED='-G'
+else
+CMK_QT='generic'
+CMK_LIBS="-lckqt -llapi"
+fi
+
+if test "$isAIX" = true
+then
+  AR_OPTS="-X 32"
+fi
+CMK_AR="ar $AR_OPTS cq"
+CMK_NM="/bin/nm $AR_OPTS"
+CMK_NM_FILTER="grep ^_CK_ | cut -f 1 -d ' '"
+CMK_RANLIB='true'
+
 CMK_SEQ_LIBS=''
 CMK_SEQ_CC='xlc_r -q32 '
 CMK_SEQ_LD='xlc_r -q32 '
 CMK_SEQ_CXX='xlC_r -q32 -qstaticinline '
 CMK_SEQ_LDXX='xlC_r -q32 '
+
 CMK_NATIVE_CC='xlc_r -q32 '
 CMK_NATIVE_LD='xlc_r -q32 '
 CMK_NATIVE_CXX='xlC_r -q32 -qstaticinline '
 CMK_NATIVE_LDXX='xlC_r -q32 '
-CMK_NM='/bin/nm -X 32'
-CMK_NM_FILTER="grep ^_CK_ | cut -f 1 -d ' '"
-CMK_QT='aix'
-CMK_XIOPTS=''
-CMK_MOD_EXT='mod'
+
+CMK_CF77='mpxlf_r -q32 '
+CMK_CF90='mpxlf90_r -q32 -qsuffix=f=f90'
+CMK_CF90_FIXED='mpxlf90_r -q32 '
+if test $isAIX = true
+then
 CMK_F90LIBS='-lxlf90_r -lhC -llapi_r'
+else
+CMK_F90LIBS='-lxlf90_r -llapi'
+fi
+CMK_MOD_EXT='mod'
index 7ebf7a73d46affcbd37e80078b42a2c5c9deac23..9ddfb7937e9db1fd5afd162caa169dd9aa7ca7f1 100755 (executable)
@@ -90,11 +90,11 @@ Chao Mei 01/28/2010
 
 /* Redefine CmiNodeLocks only for PCQueue data structure */
 #define CmiNodeLock CmiNodeLock_nonsmp
-#undef CmiCreateLock()
-#undef CmiLock(lock)
-#undef CmiUnlock(lock)
-#undef CmiTryLock(lock)
-#undef CmiDestroyLock(lock)
+#undef CmiCreateLock
+#undef CmiLock
+#undef CmiUnlock
+#undef CmiTryLock
+#undef CmiDestroyLock
 typedef pthread_mutex_t *CmiNodeLock_nonsmp;
 CmiNodeLock CmiCreateLock(){
   CmiNodeLock lk = (CmiNodeLock)malloc(sizeof(pthread_mutex_t));  
@@ -418,9 +418,7 @@ char *CopyMsg(char *msg, int len) {
     return copy;
 }
  
-#if CMK_NODE_QUEUE_AVAILABLE
 CsvDeclare(CmiNodeState, NodeState);
-#endif
 
 #if CMK_IMMEDIATE_MSG
 #include "immediate.c"
@@ -829,7 +827,12 @@ static void PumpMsgsComplete(lapi_handle_t *myLapiContext, void *am_info) {
     broot = CMI_BROADCAST_ROOT(msg);
     destrank = CMI_DEST_RANK(msg);
     /* Only check proc-level msgs */
-    if (broot>=0 && destrank != DGRAM_NODEMESSAGE){
+    if (broot>=0
+#if CMK_NODE_QUEUE_AVAILABLE
+        && destrank != DGRAM_NODEMESSAGE
+#endif
+    )
+    {
         MsgOrderInfo *info;        
         if(broot>0){
             info = &CpvAccessOther(bcastMsgSeqInfo, destrank);
@@ -2092,13 +2095,13 @@ void ConverseInit(int argc, char **argv, CmiStartFn fn, int usched, int initret)
     if (CmiGetArgFlag(argv,"++debug")) {  /*Pause so user has a chance to start and attach debugger*/
         printf("CHARMDEBUG> Processor %d has PID %d\n",CmiMyNode(),getpid());
         if (!CmiGetArgFlag(argv,"++debug-no-pause"))
-            sleep(10);
+            sleep(30);
     }
 
-#if CMK_NODE_QUEUE_AVAILABLE
     CsvInitialize(CmiNodeState, NodeState);
     CmiNodeStateInit(&CsvAccess(NodeState));
 
+#if CMK_NODE_QUEUE_AVAILABLE
     CsvInitialize(PCQueue, nodeBcastQ);
     CsvAccess(nodeBcastQ) = PCQueueCreate();
 #endif
index a89265ae87324355b6b788e051c6d940e66bc1af..825be2e6dc08bf289e0379ee4750a8d15a6e80ef 100644 (file)
@@ -1,8 +1,8 @@
 XLC_PRE=/opt/ibmcmp
 XLC_POST=bin/bg
 XLC_F=$XLC_PRE/xlf/bg/11.1/
-CMK_CC="$XLC_PRE/vacpp/bg/9.0/${XLC_POST}xlc -qcpluscmt $BGP_INC"
-CMK_CXX="$XLC_PRE/vacpp/bg/9.0/${XLC_POST}xlC $BGP_INC"
+CMK_CC="$XLC_PRE/vacpp/bg/9.0/${XLC_POST}xlc -qcpluscmt -qhalt=e $BGP_INC"
+CMK_CXX="$XLC_PRE/vacpp/bg/9.0/${XLC_POST}xlC -qhalt=e $BGP_INC"
 CMK_LD="$CMK_CC $BGP_LIB "
 CMK_LDXX="$CMK_CXX  $BGP_LIB"
 CMK_CF77="$XLC_F/${XLC_POST}xlf "
index 5a89f294516e66e2eb2d3e2263452e1e1a0cd2bb..9b1e8c7e256454fc99fa36cbbfa94b4ff6dd2156 100644 (file)
@@ -3,8 +3,8 @@ if [ "$OBJECT_MODE" != "32" ]
 then
        echo "WARNING: Charm built in 32-bit mode, but OBJECT_MODE=$OBJECT_MODE"
 fi
-CMK_CC='mpcc_r -q32 -qcpluscmt '
-CMK_CXX='mpCC_r -q32 -qstaticinline '
+CMK_CC='mpcc_r -q32 -qcpluscmt -qhalt=e '
+CMK_CXX='mpCC_r -q32 -qstaticinline -qhalt=e '
 CMK_LD="mpcc_r -q32 -brtl"
 CMK_LDXX="mpCC_r -q32 -brtl"
 CMK_NATIVE_CC='xlc_r -q32'
index a4dd3960718064f89d96d5f9400ab8b60386e2ed..fc3de22ee8d33741de53e5c34d45e330758cdbb5 100644 (file)
@@ -4,8 +4,8 @@ then
         echo "WARNING: Charm built in 64-bit mode, but OBJECT_MODE=$OBJECT_MODE"
 fi
 
-CMK_CC='mpcc_r -q64 -qcpluscmt '
-CMK_CXX='mpCC_r -q64 -qstaticinline '
+CMK_CC='mpcc_r -q64 -qcpluscmt -qhalt=e '
+CMK_CXX='mpCC_r -q64 -qstaticinline -qhalt=e '
 CMK_LD="mpcc_r -q64 -brtl"
 CMK_LDXX="mpCC_r -q64 -brtl"
 CMK_NATIVE_CC='xlc_r -q64'
index f0429e15bc18b354b060ba7b58dc741d0712d911..f8100ddd16b1ee1ee4108ac1405fa0f30fbd2f91 100644 (file)
@@ -2,8 +2,8 @@ CMK_CPP_CHARM='/usr/lib/cpp -P -D_NO_PROTO '
 CMK_CPP_C='/usr/lib/cpp -P -D_NO_PROTO '
 CMK_LDRO='ld -r -o '
 CMK_LDRO_WORKS=0
-CMK_CC='mpcc_r -qcpluscmt '
-CMK_CXX='mpCC_r -qstaticinline '
+CMK_CC='mpcc_r -qcpluscmt -qhalt=e '
+CMK_CXX='mpCC_r -qstaticinline -qhalt=e '
 CMK_CXXPP='xlC -E '
 CMK_LD="mpcc_r -brtl "
 CMK_LDXX="mpCC_r -brtl "
index c8ca0fa804c03856d88233a8b1587c274a4cea94..3daf8fa8c14f07db18d5484613e8b1174a69fa55 100755 (executable)
@@ -137,6 +137,7 @@ then
         kraken*)
                 ncores=`expr \( $pes + 11 \) / 12 \* 12`
                ncpus="#PBS -l size=$ncores"
+               ppn=''
                ;;
        *)
                ncpus="#PBS -l ncpus=$pes"
@@ -144,12 +145,12 @@ then
        esac
        if test $USE_LSF -eq 0
        then
-         mpirun=`which mpirun 2>/dev/null`
-          npcmd="-np "
+          mpirun=`which aprun 2>/dev/null`
+          npcmd="-n "
           if test -z "$mpirun"
           then
-            mpirun=`which aprun 2>/dev/null`
-            npcmd="-n "
+           mpirun=`which mpirun 2>/dev/null`
+            npcmd="-np "
           fi
           cat > $script << EOF
 #!/bin/sh
index 196cb47b1ce519682d02cd853a5afcb8ad46be93..8ef559a14ae2df7e49f4efd16d9ef457d21b47f5 100644 (file)
@@ -1,7 +1,9 @@
+isAIX=true
+
 CMK_CPP_CHARM='/usr/lib/cpp'
 CMK_CPP_C='xlc -E'
-CMK_CC='xlc_r -qcpluscmt '
-CMK_CXX='xlC_r -qstaticinline '
+CMK_CC='xlc_r -qcpluscmt -qhalt=e '
+CMK_CXX='xlC_r -qstaticinline -qhalt=e '
 CMK_LD="xlc_r -brtl -bmaxdata:0x80000000 -bmaxstack:0x80000000 "
 CMK_LDXX="xlC_r -brtl -bmaxdata:0x80000000 -bmaxstack:0x80000000"
 CMK_CXXPP='xlC -E'
index 47d6395fabd64f0620d80a4d3f137e95478930ef..b0976e8d0d082f3c5c652345c5af7fa3a3c0b65d 100644 (file)
@@ -1,6 +1,7 @@
 COMMENT="Enable 64-bit mode (-q64)"
 CMK_CC='xlc_r -q64 '
-CMK_CXX='xlC_r -q64 -qstaticinline '
+#CMK_CXX='xlC_r -q64 -qstaticinline '
+CMK_CXX='xlC_r -q64 '
 CMK_C_OPTIMIZE='-O3 -qstrict -Q!  '
 CMK_CXX_OPTIMIZE='-O3 -qstrict -Q! '
 CMK_LD="$CMK_CC "
@@ -10,7 +11,7 @@ CMK_QT="aix"
 
 CMK_NATIVE_CC='xlc_r -q64'
 CMK_NATIVE_LD='xlc_r -q64'
-CMK_NATIVE_CXX='xlC_r -qstaticinline -q64'
+CMK_NATIVE_CXX='xlC_r -q64'
 CMK_NATIVE_LDXX='xlC_r -q64'
 
 CMK_CF77='xlf_r -q64 '
index e351ef82e8346a199f8a3c52047c1606329f08f6..1a3acc898c9800cc60492480a3aab6538964b873 100644 (file)
@@ -17,5 +17,7 @@
 #define CMK_MMAP_PROBE                                     0
 
 #define CMK_NOT_USE_TLS_THREAD                             1
-/* #define CMK_PCQUEUE_LOCK                                   1  */
-
+#if ( defined(__xlc__) || defined(__xlC__) ) && CMK_POWER7
+#warning "XLC compiler on Power7 does not support memory fence correctly, pcqueue lock is turned back on."
+#define CMK_PCQUEUE_LOCK                                   1
+#endif
index 64bd77955083e561b57e9c8b247cbc58f431eabf..237caa97b29d21fe45bbdc7e9c2e4aef2093a297 100644 (file)
@@ -1,3 +1,5 @@
+isLinux=true
+
 CMK_CPP_CHARM="/lib/cpp -P"
 CMK_CPP_C="gcc -E"
 CMK_CC="gcc -fPIC -m32"
index c906c2322dad2898c2ae1e06c6da3a65322c6b61..ea5853a3a84d889b5ff6373730bfd8274e4f17c8 100644 (file)
@@ -656,6 +656,7 @@ char *arg_currdir_r;
 int   arg_server;
 int   arg_server_port=0;
 char *arg_server_auth=NULL;
+int   replay_single=0;
 
 #if CMK_BPROC
 int   arg_startpe;
@@ -771,6 +772,14 @@ void arg_init(int argc, char **argv)
        arg_argv[arg_argc++]="++debug";
   }
 
+  /* Check for +replay-detail to know we have to load only one single processor */
+  for (i=0;argv[i];i++) {
+    if (0==strcmp(argv[i],"+replay-detail")) {
+      replay_single = 1;
+      arg_requested_pes = 1;
+    }
+  }
+  
 #ifdef CMK_BPROC
   if (arg_local) {
     fprintf(stderr,"Warning> ++local cannot be used in bproc version, ignored!\n");
@@ -1400,17 +1409,21 @@ void req_ccs_connect(void)
   pe=ChMessageInt(h.hdr.pe);
   reqBytes=ChMessageInt(h.hdr.len);
 
-  if (pe<=-nodetab_size || pe>=nodetab_size) {
+  if (pe == -1) {
+    /*Treat -1 as broadcast and sent to 0 as root of the spanning tree*/
+    pe = 0;
+  }
+  if ((pe<=-nodetab_size || pe>=nodetab_size) && 0==replay_single) {
     /*Treat out of bound values as errors. Helps detecting bugs*/
+    /* But when virtualized with Bigemulator, we can have more pes than nodetabs */
+    /* TODO: We should somehow check boundaries also for bigemulator... */
+#if ! CMK_BLUEGENE_CHARM
     if (pe==-nodetab_size) fprintf(stderr,"Invalid processor index in CCS request: are you trying to do a broadcast instead?");
     else fprintf(stderr,"Invalid processor index in CCS request.");
     CcsServer_sendReply(&h.hdr,0,0);
     free(reqData);
     return;
-  }
-  else if (pe == -1) {
-    /*Treat -1 as broadcast and sent to 0 as root of the spanning tree*/
-    pe = 0;
+#endif
   }
   else if (pe < -1) {
     /*Treat negative values as multicast to a number of processors specified by -pe.
@@ -1425,12 +1438,17 @@ void req_ccs_connect(void)
 #if LOOPBACK /*Immediately reply "there's nothing!" (for performance testing)*/
     CcsServer_sendReply(&h.hdr,0,0);
 #else
+    int destpe = pe;
+#if CMK_BLUEGENE_CHARM
+    destpe = destpe % nodetab_size;
+#endif
+    if (replay_single) destpe = 0;
     /*Fill out the charmrun header & forward the CCS request*/
     ChMessageHeader_new("req_fw",sizeof(h.hdr)+reqBytes,&h.ch);  
 
     bufs[0]=&h; lens[0]=sizeof(h);
     bufs[1]=reqData; lens[1]=reqBytes;
-    skt_sendV(nodetab_ctrlfd(pe),2,bufs,lens);
+    skt_sendV(nodetab_ctrlfd(destpe),2,bufs,lens);
 
 #endif
   }
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 e8083bd9fa9618e00d5fc31d150e3b56faf7a898..1a9c371e089035ece860e12c3740da295a47d634 100644 (file)
@@ -463,8 +463,12 @@ static void CmiStartThreads(char **argv)
     pthread_attr_destroy(&attr);
   }
 #if ! (CMK_TLS_THREAD && !CMK_NOT_USE_TLS_THREAD)
+#if CMK_CONVERSE_MPI
+  pthread_setspecific(Cmi_state_key, Cmi_state_vector+_Cmi_mynodesize);
+#else
   pthread_setspecific(Cmi_state_key, Cmi_state_vector);
 #endif
+#endif
 
 }
 
index 7b5a92f46fcf3394efc8cdf6f5743ef2479c6b88..43c851b128b4130190ceea557daef4c4185cf9a0 100644 (file)
@@ -353,7 +353,6 @@ void MulticastStrategy::handleMessage(void *msg){
 
 }
 
-#include <string>
 
 void MulticastStrategy::handleNewMulticastMessage(envelope *env) {
     
index d72f5287a29971d9959a175fbff6042c9c0d2ef6..53d667663cb665c59755d461ee0b32dfba250583 100644 (file)
@@ -703,19 +703,6 @@ class CProxy {
 
 PUPmarshall(CProxy)
 
-/*These disambiguation macros are needed to support
-  multiple inheritance in Chares (Groups, Arrays).
-  They resolve ambiguous accessor calls to the parent "super".
-  Because mutator routines need to change *all* the base
-  classes, mutators are generated in xi-symbol.C.
-*/
-#define CK_DISAMBIG_CPROXY(super) \
-    int ckIsDelegated(void) const {return super::ckIsDelegated();}\
-    inline CkDelegateMgr *ckDelegatedTo(void) const {return super::ckDelegatedTo();}\
-    inline CkDelegateData *ckDelegatedPtr(void) const {return super::ckDelegatedPtr();} \
-    CkGroupID ckDelegatedIdx(void) const {return super::ckDelegatedIdx();}\
-
-
 
 /*The base classes of each proxy type
 */
@@ -724,11 +711,11 @@ class CProxy_Chare : public CProxy {
     CkChareID _ck_cid;
   public:
     CProxy_Chare() {
-#ifndef CMK_OPTIMIZE
+#if CMK_ERROR_CHECKING
        _ck_cid.onPE=0; _ck_cid.objPtr=0;
 #endif
     }
-#ifndef CMK_OPTIMIZE
+#if CMK_ERROR_CHECKING
     inline void ckCheck(void) const  {   //Make sure this proxy has a value
 #ifdef CMK_CHARE_USE_PTR
        if (_ck_cid.objPtr==0)
@@ -752,13 +739,6 @@ class CProxy_Chare : public CProxy {
 };
 PUPmarshall(CProxy_Chare)
 
-#define CK_DISAMBIG_CHARE(super) \
-       CK_DISAMBIG_CPROXY(super) \
-       inline void ckCheck(void) const {super::ckCheck();} \
-       const CkChareID &ckGetChareID(void) const\
-          {return super::ckGetChareID();} \
-        operator const CkChareID &(void) const {return ckGetChareID();}
-
 /******************* Reduction Declarations ****************/
 //Silly: need the type of a reduction client here so it can be used by proxies.
 //A clientFn is called on PE 0 when all contributions
@@ -792,13 +772,6 @@ PUPbytes(CkReductionClientBundle)
        void className::ckSetReductionClient(CkCallback *cb) const \
                { (mgr)->ckSetReductionClient(cb); }\
 
-#define CK_REDUCTION_CLIENT_DISAMBIG(super) \
-       inline void setReductionClient(CkReductionClientFn fn,void *param=NULL) const \
-               { super::setReductionClient(fn,param); } \
-       inline void ckSetReductionClient(CkReductionClientFn fn,void *param=NULL) const \
-               { super::ckSetReductionClient(fn,param); } \
-       inline void ckSetReductionClient(CkCallback *cb) const \
-               { super::ckSetReductionClient(cb); }\
 
 class CProxy_NodeGroup;
 class CProxy_CkArrayReductionMgr;
@@ -808,7 +781,7 @@ class CProxy_Group : public CProxy {
 
   public:
     CProxy_Group() {
-#ifndef CMK_OPTIMIZE
+#if CMK_ERROR_CHECKING
        _ck_gid.setZero();
 #endif
        //CkPrintf(" In CProxy_Group Constructor\n");
@@ -828,7 +801,7 @@ class CProxy_Group : public CProxy {
 /*    CProxy_Group(const NodeGroup *g)  //<- for compatability with NodeGroups
         :CProxy(), _ck_gid(g->ckGetGroupID()) {}*/
 
-#ifndef CMK_OPTIMIZE
+#if CMK_ERROR_CHECKING
     inline void ckCheck(void) const {   //Make sure this proxy has a value
        if (_ck_gid.isZero())
                CkAbort("Error! This group proxy has not been initialized!");
@@ -853,16 +826,6 @@ class CProxy_Group : public CProxy {
     CK_REDUCTION_CLIENT_DECL
 };
 PUPmarshall(CProxy_Group)
-#define CK_DISAMBIG_GROUP(super) \
-       CK_DISAMBIG_CPROXY(super) \
-       inline void ckCheck(void) const {super::ckCheck();} \
-       CkChareID ckGetChareID(void) const \
-          {return super::ckGetChareID();} \
-       CkGroupID ckGetGroupID(void) const \
-          {return super::ckGetGroupID();} \
-       operator CkGroupID () const { return ckGetGroupID(); } \
-       CK_REDUCTION_CLIENT_DISAMBIG(super)\
-
 
 class CProxyElement_Group : public CProxy_Group {
   private:
@@ -885,11 +848,6 @@ class CProxyElement_Group : public CProxy_Group {
     }
 };
 PUPmarshall(CProxyElement_Group)
-#define CK_DISAMBIG_GROUP_ELEMENT(super) \
-       CK_DISAMBIG_GROUP(super) \
-       int ckGetGroupPe(void) const\
-          {return super::ckGetGroupPe();} \
-
 
 class CProxySection_Group : public CProxy_Group {
 private:
@@ -970,29 +928,6 @@ public:
   }
 };
 PUPmarshall(CProxySection_Group)
-#define CK_DISAMBIG_GROUP_SECTION(super) \
-    CK_DISAMBIG_GROUP(super) \
-        inline int ckGetNumSections() const \
-      { return super::ckGetNumSections(); } \
-        inline CkSectionInfo &ckGetSectionInfo() \
-      { return super::ckGetSectionInfo(); } \
-        inline CkSectionID *ckGetSectionIDs() \
-      { return super::ckGetSectionIDs(); } \
-        inline CkSectionID &ckGetSectionID() \
-      { return super::ckGetSectionID(); } \
-        inline CkSectionID &ckGetSectionID(int i) \
-      { return super::ckGetSectionID(i); } \
-        inline CkGroupID ckGetGroupIDn(int i) const \
-      { return super::ckGetGroupIDn(i); } \
-        inline int *ckGetElements() const \
-      { return super::ckGetElements(); } \
-        inline int *ckGetElements(int i) const \
-      { return super::ckGetElements(i); } \
-        inline int ckGetNumElements() const \
-      { return super::ckGetNumElements(); }  \
-        inline int ckGetNumElements(int i) const \
-      { return super::ckGetNumElements(i); }  \
-
 
 /* These classes exist to provide chare indices for the basic
  chare types.*/
@@ -1017,7 +952,7 @@ class CProxy_NodeGroup : public CProxy{
     CkGroupID _ck_gid;
   public:
     CProxy_NodeGroup() {
-#ifndef CMK_OPTIMIZE
+#if CMK_ERROR_CHECKING
        _ck_gid.setZero();
 #endif
        //CkPrintf("In CProxy_NodeGroup0 Constructor %d\n",CkLocalNodeBranch(_ck_gid));
@@ -1031,7 +966,7 @@ class CProxy_NodeGroup : public CProxy{
 /*    CProxy_Group(const NodeGroup *g)  //<- for compatability with NodeGroups
         :CProxy(), _ck_gid(g->ckGetGroupID()) {}*/
 
-#ifndef CMK_OPTIMIZE
+#if CMK_ERROR_CHECKING
     inline void ckCheck(void) const {   //Make sure this proxy has a value
        if (_ck_gid.isZero())
                CkAbort("Error! This group proxy has not been initialized!");
@@ -1181,6 +1116,8 @@ inline T *CkAllocateMarshallMsgT(int size,const CkEntryOptions *opts)
 
 /************************** Debugging Utilities **************/
 
+CkpvExtern(DebugEntryTable, _debugEntryTable);
+
 //For debugging: convert given index to a string (NOT threadsafe)
 static const char *idx2str(const CkArrayIndex &ind) {
   static char retBuf[80];
@@ -1217,7 +1154,7 @@ public:
   }
     */
   void deallocate() {
-    CkPrintf("CkConditional::delete %d\n",refcount);
+    //CkPrintf("CkConditional::delete %d\n",refcount);
     if (--refcount == 0) {
       //((CkConditional*)p)->~CkConditional();
       delete this;
index dc4a46a79425d371d58a7aba0cd7fc3f6748d8d0..953ae4e2edcdb8d4e32c73e6c1819208b98d2770 100644 (file)
@@ -5,6 +5,7 @@
 #include "charm++.h"
 #include <stdarg.h>
 #include "charmf.h"
+#include "cktiming.h"
 
 extern "C" int typesize(int type, int count)
 {
@@ -173,4 +174,40 @@ FDECL void FTN_NAME(CMIMEMORYCHECK, cmimemorycheck) ()
   CmiMemoryCheck();
 }
 
+// cktiming utility
+
+FDECL void FTN_NAME(INITBIGSIMTRACE, initbigsimtrace)(int *outputParams)
+{
+  initBigSimTrace(*outputParams);
+}
+
+FDECL void FTN_NAME(FINALIZEBIGSIMTRACE, finalizebigsimtrace)()
+{
+  finalizeBigSimTrace();
+}
+
+FDECL void FTN_NAME(STARTTRACEBIGSIM, starttracebigsim)()
+{
+  startTraceBigSim();
+}
+
+FDECL void FTN_NAME(ENDTRACEBIGSIM1, endtracebigsim1)(char *eventName, int *stepno, double *p1)
+{
+  endTraceBigSim(eventName, *stepno, *p1);
+}
+
+
+FDECL void FTN_NAME(ENDTRACEBIGSIM2, endtracebigsim2)(char *eventName, int *stepno, double *p1, double *p2)
+{
+  endTraceBigSim(eventName, *stepno, *p1, *p2);
+}
+
+FDECL void FTN_NAME(ENDTRACEBIGSIM3, endtracebigsim3)(char *eventName, int *stepno, double *p1, double *p2, double *p3)
+{
+  // printf("%d %f %f %f\n", *stepno, *p1, *p2, *p3);
+  endTraceBigSim(eventName, *stepno, *p1, *p2, *p3);
+}
+
+
+
 
index f92b802469ee7f101ab884b84f6c664016b3f9d6..3f593daf9f2812ab5da989475ff87107c6af9f30 100644 (file)
@@ -5,4 +5,22 @@ module charm
   real*8,    external :: CkWallTimer
   real*8,    external :: CmiCpuTimer
   real*8,    external :: CkCpuTimer
+
+  INTERFACE
+      SUBROUTINE endtracebigsim1(e,step,p1) 
+         CHARACTER* (*)  e
+         INTEGER step
+         DOUBLE PRECISION p1
+      END SUBROUTINE 
+      SUBROUTINE endtracebigsim2(e,step,p1,p2) 
+         CHARACTER* (*)  e
+         INTEGER step
+         DOUBLE PRECISION p1,p2
+      END SUBROUTINE 
+      SUBROUTINE endtracebigsim3(e,step,p1,p2,p3) 
+         CHARACTER* (*)  e
+         INTEGER step
+         DOUBLE PRECISION p1,p2,p3
+      END SUBROUTINE 
+   END INTERFACE 
 end module charm
index c247c1feb7d73ab90007ca86345f2672634a27a5..b9443a649191a033e815f929ece6138fafe7fe1d 100644 (file)
@@ -27,12 +27,13 @@ void automaticallySetMessagePriority(envelope *env); // in control point framewo
 
 #ifndef CMK_CHARE_USE_PTR
 #include <map>
-CpvDeclare(CkVec<void *>, chare_objs);
-CpvDeclare(CkVec<int>, chare_types);
-CpvDeclare(CkVec<VidBlock *>, vidblocks);
+CkpvDeclare(CkVec<void *>, chare_objs);
+CkpvDeclare(CkVec<int>, chare_types);
+CkpvDeclare(CkVec<VidBlock *>, vidblocks);
 
 typedef std::map<int, CkChareID>  Vidblockmap;
-CpvDeclare(Vidblockmap, vmap);      // remote VidBlock to notify upon deletion
+CkpvDeclare(Vidblockmap, vmap);      // remote VidBlock to notify upon deletion
+CkpvDeclare(int, currentChareIdx);
 #endif
 
 
@@ -52,10 +53,12 @@ void _initChareTables()
 {
 #ifndef CMK_CHARE_USE_PTR
           /* chare and vidblock table */
-  CpvInitialize(CkVec<void *>, chare_objs);
-  CpvInitialize(CkVec<int>, chare_types);
-  CpvInitialize(CkVec<VidBlock *>, vidblocks);
-  CpvInitialize(Vidblockmap, vmap);
+  CkpvInitialize(CkVec<void *>, chare_objs);
+  CkpvInitialize(CkVec<int>, chare_types);
+  CkpvInitialize(CkVec<VidBlock *>, vidblocks);
+  CkpvInitialize(Vidblockmap, vmap);
+  CkpvInitialize(int, currentChareIdx);
+  CkpvAccess(currentChareIdx) = -1;
 #endif
 }
 
@@ -65,7 +68,10 @@ Chare::Chare(void) {
   thishandle.objPtr=this;
 #ifndef CMK_CHARE_USE_PTR
      // for plain chare, objPtr is actually the index to chare obj table
-  if (chareIdx >= 0) thishandle.objPtr=(void*)chareIdx;
+  if (CkpvAccess(currentChareIdx) >= 0) {
+    thishandle.objPtr=(void*)CkpvAccess(currentChareIdx);
+  }
+  chareIdx = CkpvAccess(currentChareIdx);
 #endif
 #if (defined(_FAULT_MLOG_) || defined(_FAULT_CAUSAL_))
   mlogData = new ChareMlogData();
@@ -104,10 +110,10 @@ Chare::~Chare() {
 */
   if (chareIdx != -1)
   {
-    CmiAssert(CpvAccess(chare_objs)[chareIdx] == this);
-    CpvAccess(chare_objs)[chareIdx] = NULL;
-    Vidblockmap::iterator iter = CpvAccess(vmap).find(chareIdx);
-    if (iter != CpvAccess(vmap).end()) {
+    CmiAssert(CkpvAccess(chare_objs)[chareIdx] == this);
+    CkpvAccess(chare_objs)[chareIdx] = NULL;
+    Vidblockmap::iterator iter = CkpvAccess(vmap).find(chareIdx);
+    if (iter != CkpvAccess(vmap).end()) {
       register CkChareID *pCid = (CkChareID *)
         _allocMsg(DeleteVidMsg, sizeof(CkChareID));
       int srcPe = iter->second.onPE;
@@ -118,7 +124,7 @@ Chare::~Chare() {
       CmiSetHandler(ret, _charmHandlerIdx);
       CmiSyncSendAndFree(srcPe, ret->getTotalsize(), (char *)ret);
       CpvAccess(_qd)->create();
-      CpvAccess(vmap).erase(iter);
+      CkpvAccess(vmap).erase(iter);
     }
   }
 #endif
@@ -516,11 +522,11 @@ extern "C" void CkDeliverMessageFree(int epIdx,void *msg,void *obj)
   //BIGSIM_OOC DEBUGGING
   //CkPrintf("CkDeliverMessageFree: name of entry fn: %s\n", _entryTable[epIdx]->name);
   //fflush(stdout);
-#ifndef CMK_OPTIMIZE
+#if CMK_CHARMDEBUG
   CpdBeforeEp(epIdx, obj, msg);
 #endif
   _entryTable[epIdx]->call(msg, obj);
-#ifndef CMK_OPTIMIZE
+#if CMK_CHARMDEBUG
   CpdAfterEp(epIdx);
 #endif
   if (_entryTable[epIdx]->noKeep)
@@ -545,16 +551,16 @@ extern "C" void CkDeliverMessageReadonly(int epIdx,const void *msg,void *obj)
   { /* Method needs a copy of the message to keep/delete */
     void *oldMsg=(void *)msg;
     deliverMsg=CkCopyMsg(&oldMsg);
-#ifndef CMK_OPTIMIZE
+#if CMK_ERROR_CHECKING
     if (oldMsg!=msg)
       CkAbort("CkDeliverMessageReadonly: message pack/unpack changed message pointer!");
 #endif
   }
-#ifndef CMK_OPTIMIZE
+#if CMK_CHARMDEBUG
   CpdBeforeEp(epIdx, obj, (void*)msg);
 #endif
   _entryTable[epIdx]->call(deliverMsg, obj);
-#ifndef CMK_OPTIMIZE
+#if CMK_CHARMDEBUG
   CpdAfterEp(epIdx);
 #endif
 }
@@ -569,7 +575,7 @@ static inline void _invokeEntryNoTrace(int epIdx,envelope *env,void *obj)
 static inline void _invokeEntry(int epIdx,envelope *env,void *obj)
 {
 
-#ifndef CMK_OPTIMIZE /* Consider tracing: */
+#if CMK_TRACE_ENABLED 
   if (_entryTable[epIdx]->traceEnabled) {
     _TRACE_BEGIN_EXECUTE(env);
     _invokeEntryNoTrace(epIdx,env,obj);
@@ -599,8 +605,8 @@ void CkCreateChare(int cIdx, int eIdx, void *msg, CkChareID *pCid, int destPE)
     env->setMsgtype(NewVChareMsg);
     env->setVidPtr(pCid->objPtr);
 #ifndef CMK_CHARE_USE_PTR
-    CpvAccess(vidblocks).push_back((VidBlock*)pCid->objPtr);
-    int idx = CpvAccess(vidblocks).size()-1;
+    CkpvAccess(vidblocks).push_back((VidBlock*)pCid->objPtr);
+    int idx = CkpvAccess(vidblocks).size()-1;
     pCid->objPtr = (void *)idx;
     env->setVidPtr((void *)idx);
 #endif
@@ -643,7 +649,8 @@ void CkCreateLocalGroup(CkGroupID groupID, int epIdx, envelope *env)
   CkpvAccess(_currentGroup) = groupID;
   CkpvAccess(_currentGroupRednMgr) = env->getRednMgr();
 #ifndef CMK_CHARE_USE_PTR
-  ((Chare *)obj)->chareIdx = -1;
+  //((Chare *)obj)->chareIdx = -1;
+  CkpvAccess(currentChareIdx) = -1;
 #endif
   _invokeEntryNoTrace(epIdx,env,obj); /* can't trace groups: would cause nested begin's */
   _STATS_RECORD_PROCESS_GROUP_1();
@@ -666,7 +673,8 @@ void CkCreateLocalNodeGroup(CkGroupID groupID, int epIdx, envelope *env)
 //  store nodegroup into _currentNodeGroupObj
   CkpvAccess(_currentNodeGroupObj) = obj;
 #ifndef CMK_CHARE_USE_PTR
-  ((Chare *)obj)->chareIdx = -1;
+  //((Chare *)obj)->chareIdx = -1;
+  CkpvAccess(currentChareIdx) = -1;
 #endif
   _invokeEntryNoTrace(epIdx,env,obj);
   CkpvAccess(_currentNodeGroupObj) = NULL;
@@ -823,9 +831,9 @@ static inline void *_allocNewChare(envelope *env, int &idx)
   void *tmp=malloc(_chareTable[chareIdx]->size);
   _MEMCHECK(tmp);
 #ifndef CMK_CHARE_USE_PTR
-  CpvAccess(chare_objs).push_back(tmp);
-  CpvAccess(chare_types).push_back(chareIdx);
-  idx = CpvAccess(chare_objs).size()-1;
+  CkpvAccess(chare_objs).push_back(tmp);
+  CkpvAccess(chare_types).push_back(chareIdx);
+  idx = CkpvAccess(chare_objs).size()-1;
 #endif
   setMemoryTypeChare(tmp);
   return tmp;
@@ -836,7 +844,8 @@ static void _processNewChareMsg(CkCoreState *ck,envelope *env)
   int idx;
   register void *obj = _allocNewChare(env, idx);
 #ifndef CMK_CHARE_USE_PTR
-  ((Chare *)obj)->chareIdx = idx;
+  //((Chare *)obj)->chareIdx = idx;
+  CkpvAccess(currentChareIdx) = idx;
 #endif
   _invokeEntry(env->getEpIdx(),env,obj);
 }
@@ -871,11 +880,12 @@ static void _processNewVChareMsg(CkCoreState *ck,envelope *env)
   CkChareID vid;
   vid.onPE = srcPe;
   vid.objPtr = env->getVidPtr();
-  CpvAccess(vmap)[idx] = vid;    
+  CkpvAccess(vmap)[idx] = vid;    
 #endif
   CpvAccess(_qd)->create();
 #ifndef CMK_CHARE_USE_PTR
-  ((Chare *)obj)->chareIdx = idx;
+  //((Chare *)obj)->chareIdx = idx;
+  CkpvAccess(currentChareIdx) = idx;
 #endif
   _invokeEntry(env->getEpIdx(),env,obj);
 }
@@ -894,7 +904,7 @@ static inline void _processForPlainChareMsg(CkCoreState *ck,envelope *env)
   else {
 #ifndef CMK_CHARE_USE_PTR
     if (_chareTable[_entryTable[epIdx]->chareIdx]->chareType == TypeChare)
-      obj = CpvAccess(chare_objs)[(CmiIntPtr)env->getObjPtr()];
+      obj = CkpvAccess(chare_objs)[(CmiIntPtr)env->getObjPtr()];
     else
       obj = env->getObjPtr();
 #else
@@ -914,7 +924,7 @@ static inline void _processForChareMsg(CkCoreState *ck,envelope *env)
 static inline void _processFillVidMsg(CkCoreState *ck,envelope *env)
 {
 #ifndef CMK_CHARE_USE_PTR
-  register VidBlock *vptr = CpvAccess(vidblocks)[(CmiIntPtr)env->getVidPtr()];
+  register VidBlock *vptr = CkpvAccess(vidblocks)[(CmiIntPtr)env->getVidPtr()];
 #else
   register VidBlock *vptr = (VidBlock *) env->getVidPtr();
   _CHECK_VALID(vptr, "FillVidMsg: Not a valid VIdPtr\n");
@@ -928,7 +938,7 @@ static inline void _processFillVidMsg(CkCoreState *ck,envelope *env)
 static inline void _processForVidMsg(CkCoreState *ck,envelope *env)
 {
 #ifndef CMK_CHARE_USE_PTR
-  register VidBlock *vptr = CpvAccess(vidblocks)[(CmiIntPtr)env->getVidPtr()];
+  register VidBlock *vptr = CkpvAccess(vidblocks)[(CmiIntPtr)env->getVidPtr()];
 #else
   VidBlock *vptr = (VidBlock *) env->getVidPtr();
   _CHECK_VALID(vptr, "ForVidMsg: Not a valid VIdPtr\n");
@@ -940,9 +950,9 @@ static inline void _processForVidMsg(CkCoreState *ck,envelope *env)
 static inline void _processDeleteVidMsg(CkCoreState *ck,envelope *env)
 {
 #ifndef CMK_CHARE_USE_PTR
-  register VidBlock *vptr = CpvAccess(vidblocks)[(CmiIntPtr)env->getVidPtr()];
+  register VidBlock *vptr = CkpvAccess(vidblocks)[(CmiIntPtr)env->getVidPtr()];
   delete vptr;
-  CpvAccess(vidblocks)[(CmiIntPtr)env->getVidPtr()] = NULL;
+  CkpvAccess(vidblocks)[(CmiIntPtr)env->getVidPtr()] = NULL;
 #endif
   CmiFree(env);
 }
@@ -1097,7 +1107,7 @@ void _processHandler(void *converseMsg,CkCoreState *ck)
 
 //#if CMK_RECORD_REPLAY
   if (ck->watcher!=NULL) {
-    if (!ck->watcher->processMessage(env,ck)) return;
+    if (!ck->watcher->processMessage(&env,ck)) return;
   }
 //#endif
 #if (defined(_FAULT_MLOG_) || defined(_FAULT_CAUSAL_))
@@ -1293,8 +1303,8 @@ void _skipCldHandler(void *converseMsg)
 // Made non-static to be used by ckmessagelogging
 void _skipCldEnqueue(int pe,envelope *env, int infoFn)
 {
-#if CMK_REPLAYSYSTEM
-  if (_replaySystem) {
+#if CMK_CHARMDEBUG
+  if (!ConverseDeliver(pe)) {
     CmiFree(env);
     return;
   }
@@ -1317,7 +1327,8 @@ void _skipCldEnqueue(int pe,envelope *env, int infoFn)
        env, env->getQueueing(),env->getPriobits(),
        (unsigned int *)env->getPrioPtr());
   } else {
-    CkPackMessage(&env);
+    if (pe < 0 || CmiNodeOf(pe) != CmiMyNode())
+      CkPackMessage(&env);
     int len=env->getTotalsize();
     CmiSetXHandler(env,CmiGetHandler(env));
 #if CMK_OBJECT_QUEUE_AVAILABLE
@@ -1360,8 +1371,8 @@ void _skipCldEnqueue(int pe,envelope *env, int infoFn)
 // by pass Charm++ priority queue, send as Converse message
 static void _noCldEnqueueMulti(int npes, int *pes, envelope *env)
 {
-#if CMK_REPLAYSYSTEM
-  if (_replaySystem) {
+#if CMK_CHARMDEBUG
+  if (!ConverseDeliver(-1)) {
     CmiFree(env);
     return;
   }
@@ -1378,8 +1389,8 @@ static void _noCldEnqueue(int pe, envelope *env)
     CmiHandleMessage(env);
   } else
 */
-#if CMK_REPLAYSYSTEM
-  if (_replaySystem) {
+#if CMK_CHARMDEBUG
+  if (!ConverseDeliver(pe)) {
     CmiFree(env);
     return;
   }
@@ -1400,8 +1411,8 @@ void _noCldNodeEnqueue(int node, envelope *env)
     CmiHandleMessage(env);
   } else {
 */
-#if CMK_REPLAYSYSTEM
-  if (_replaySystem) {
+#if CMK_CHARMDEBUG
+  if (!ConverseDeliver(node)) {
     CmiFree(env);
     return;
   }
@@ -1437,6 +1448,9 @@ static inline int _prepareMsg(int eIdx,void *msg,const CkChareID *pCid)
   register envelope *env = UsrToEnv(msg);
   _CHECK_USED(env);
   _SET_USED(env, 1);
+#if CMK_REPLAYSYSTEM
+  setEventID(env);
+#endif
   env->setMsgtype(ForChareMsg);
   env->setEpIdx(eIdx);
   env->setSrcPe(CkMyPe());
@@ -1444,7 +1458,7 @@ static inline int _prepareMsg(int eIdx,void *msg,const CkChareID *pCid)
   criticalPath_send(env);
   automaticallySetMessagePriority(env);
 #endif
-#ifndef CMK_OPTIMIZE
+#if CMK_CHARMDEBUG
   setMemoryOwnedBy(((char*)env)-sizeof(CmiChunkHeader), 0);
 #endif
 #if CMK_OBJECT_QUEUE_AVAILABLE
@@ -1456,7 +1470,7 @@ static inline int _prepareMsg(int eIdx,void *msg,const CkChareID *pCid)
     register int pe = -(pCid->onPE+1);
     if(pe==CkMyPe()) {
 #ifndef CMK_CHARE_USE_PTR
-      VidBlock *vblk = CpvAccess(vidblocks)[(CmiIntPtr)pCid->objPtr];
+      VidBlock *vblk = CkpvAccess(vidblocks)[(CmiIntPtr)pCid->objPtr];
 #else
       VidBlock *vblk = (VidBlock *) pCid->objPtr;
 #endif
@@ -1503,7 +1517,7 @@ void CkSendMsg(int entryIdx, void *msg,const CkChareID *pCid, int opts)
     CkSendMsgInline(entryIdx, msg, pCid, opts);
     return;
   }
-#ifndef CMK_OPTIMIZE
+#if CMK_ERROR_CHECKING
   if (opts & CK_MSG_IMMEDIATE) {
     CmiAbort("Immediate message is not allowed in Chare!");
   }
@@ -1533,7 +1547,7 @@ void CkSendMsgInline(int entryIndex, void *msg, const CkChareID *pCid, int opts)
     if(!CmiNodeAlive(CkMyPe())){
        return;
     }
-#ifndef CMK_OPTIMIZE
+#if CMK_CHARMDEBUG
     //Just in case we need to breakpoint or use the envelope in some way
     _prepareMsg(entryIndex,msg,pCid);
 #endif
@@ -1555,11 +1569,14 @@ static inline envelope *_prepareMsgBranch(int eIdx,void *msg,CkGroupID gID,int t
   CkNodeGroupID nodeRedMgr;
   _CHECK_USED(env);
   _SET_USED(env, 1);
+#if CMK_REPLAYSYSTEM
+  setEventID(env);
+#endif
   env->setMsgtype(type);
   env->setEpIdx(eIdx);
   env->setGroupNum(gID);
   env->setSrcPe(CkMyPe());
-#ifndef CMK_OPTIMIZE
+#if CMK_ERROR_CHECKING
   nodeRedMgr.setZero();
   env->setRednMgr(nodeRedMgr);
 #endif
@@ -1567,7 +1584,7 @@ static inline envelope *_prepareMsgBranch(int eIdx,void *msg,CkGroupID gID,int t
   criticalPath_send(env);
   automaticallySetMessagePriority(env);
 #endif
-#ifndef CMK_OPTIMIZE
+#if CMK_CHARMDEBUG
   setMemoryOwnedBy(((char*)env)-sizeof(CmiChunkHeader), 0);
 #endif
   CmiSetHandler(env, _charmHandlerIdx);
@@ -1648,7 +1665,7 @@ void CkSendMsgBranchInline(int eIdx, void *msg, int destPE, CkGroupID gID, int o
     IrrGroup *obj=(IrrGroup *)_localBranch(gID);
     if (obj!=NULL)
     { //Just directly call the group:
-#ifndef CMK_OPTIMIZE
+#if CMK_ERROR_CHECKING
       envelope *env=_prepareMsgBranch(eIdx,msg,gID,ForBocMsg);
 #else
       envelope *env=UsrToEnv(msg);
@@ -1802,7 +1819,7 @@ void CkSendMsgNodeBranchInline(int eIdx, void *msg, int node, CkGroupID gID, int
     CmiImmediateUnlock(CksvAccess(_nodeGroupTableImmLock));
     if (obj!=NULL)
     { //Just directly call the group:
-#ifndef CMK_OPTIMIZE
+#if CMK_ERROR_CHECKING
       envelope *env=_prepareMsgBranch(eIdx,msg,gID,ForNodeBocMsg);
 #else
       envelope *env=UsrToEnv(msg);
@@ -1896,7 +1913,7 @@ static void _prepareOutgoingArrayMsg(envelope *env,int type)
   _CHECK_USED(env);
   _SET_USED(env, 1);
   env->setMsgtype(type);
-#ifndef CMK_OPTIMIZE
+#if CMK_CHARMDEBUG
   setMemoryOwnedBy(((char*)env)-sizeof(CmiChunkHeader), 0);
 #endif
   CmiSetHandler(env, _charmHandlerIdx);
@@ -1941,6 +1958,20 @@ void CkDeleteChares() {
   int i;
   int numGroups = CkpvAccess(_groupIDTable)->size();
 
+  // delete all plain chares
+#ifndef CMK_CHARE_USE_PTR
+  for (i=0; i<CkpvAccess(chare_objs).size(); i++) {
+       Chare *obj = (Chare*)CkpvAccess(chare_objs)[i];
+       delete obj;
+       CkpvAccess(chare_objs)[i] = NULL;
+  }
+  for (i=0; i<CkpvAccess(vidblocks).size(); i++) {
+       VidBlock *obj = CkpvAccess(vidblocks)[i];
+       delete obj;
+       CkpvAccess(vidblocks)[i] = NULL;
+  }
+#endif
+
   // delete all array elements
   for(i=0;i<numGroups;i++) {
     IrrGroup *obj = CkpvAccess(_groupTable)->find((*CkpvAccess(_groupIDTable))[i]).getObj();
@@ -1948,7 +1979,6 @@ void CkDeleteChares() {
       CkLocMgr *mgr = (CkLocMgr*)obj;
       ElementDestroyer destroyer(mgr);
       mgr->iterate(destroyer);
-printf("[%d] DELETE!\n", CkMyPe());
     }
   }
 
@@ -1981,7 +2011,7 @@ int _recplay_crc = 0;
 int _recplay_checksum = 0;
 int _recplay_logsize = 1024*1024;
 
-CkMessageWatcher::~CkMessageWatcher() {}
+CkMessageWatcher::~CkMessageWatcher() { if (next!=NULL) delete next;}
 
 class CkMessageRecorder : public CkMessageWatcher {
   char *buffer;
@@ -1989,24 +2019,31 @@ class CkMessageRecorder : public CkMessageWatcher {
 public:
   CkMessageRecorder(FILE *f_): curpos(0) { f=f_; buffer=new char[_recplay_logsize]; }
   ~CkMessageRecorder() {
-    CkPrintf("closing log\n");
-    flushLog();
+    flushLog(0);
     fprintf(f,"-1 -1 -1 ");
     fclose(f);
     delete[] buffer;
+#if 0
+    FILE *stsfp = fopen("sts", "w");
+    void traceWriteSTS(FILE *stsfp,int nUserEvents);
+    traceWriteSTS(stsfp, 0);
+    fclose(stsfp);
+#endif
+    CkPrintf("[%d] closing log at %f.\n", CkMyPe(), CmiWallTimer());
   }
 
 private:
-  void flushLog() {
-    CkPrintf("flushing log\n");
+  void flushLog(int verbose=1) {
+    if (verbose) CkPrintf("[%d] flushing log\n", CkMyPe());
     fprintf(f, "%s", buffer);
     curpos=0;
   }
-  virtual CmiBool process(envelope *env,CkCoreState *ck) {
-    if (env->getEvent()) {
+  virtual CmiBool process(envelope **envptr,CkCoreState *ck) {
+    if ((*envptr)->getEvent()) {
       char tmp[128];
-      bool wasPacked = env->isPacked();
-      if (!wasPacked) CkPackMessage(&env);
+      bool wasPacked = (*envptr)->isPacked();
+      if (!wasPacked) CkPackMessage(envptr);
+      envelope *env = *envptr;
       unsigned int crc1=0, crc2=0;
       if (_recplay_crc) {
         //unsigned int crc = crc32_initial(((unsigned char*)env)+CmiMsgHeaderSizeBytes, env->getTotalsize()-CmiMsgHeaderSizeBytes);
@@ -2016,9 +2053,9 @@ private:
         crc1 = checksum_initial(((unsigned char*)env)+CmiMsgHeaderSizeBytes, sizeof(*env)-CmiMsgHeaderSizeBytes);
         crc2 = checksum_initial(((unsigned char*)env)+sizeof(*env), env->getTotalsize()-sizeof(*env));
       }
-      curpos+=sprintf(&buffer[curpos],"%d %d %d %hhd %x %x\n",env->getSrcPe(),env->getTotalsize(),env->getEvent(), env->getMsgtype()==NodeBocInitMsg || env->getMsgtype()==ForNodeBocMsg, crc1, crc2);
+      curpos+=sprintf(&buffer[curpos],"%d %d %d %hhd %x %x %d\n",env->getSrcPe(),env->getTotalsize(),env->getEvent(), env->getMsgtype()==NodeBocInitMsg || env->getMsgtype()==ForNodeBocMsg, crc1, crc2, env->getEpIdx());
       if (curpos > _recplay_logsize-128) flushLog();
-      if (!wasPacked) CkUnpackMessage(&env);
+      if (!wasPacked) CkUnpackMessage(envptr);
     }
     return CmiTrue;
   }
@@ -2041,13 +2078,14 @@ public:
   }
   ~CkMessageDetailRecorder() {fclose(f);}
 private:
-  virtual CmiBool process(envelope *env, CkCoreState *ck) {
-    bool wasPacked = env->isPacked();
-    if (!wasPacked) CkPackMessage(&env);
+  virtual CmiBool process(envelope **envptr, CkCoreState *ck) {
+    bool wasPacked = (*envptr)->isPacked();
+    if (!wasPacked) CkPackMessage(envptr);
+    envelope *env = *envptr;
     CmiUInt4 size = env->getTotalsize();
     fwrite(&size, 4, 1, f);
     fwrite(env, env->getTotalsize(), 1, f);
-    if (!wasPacked) CkUnpackMessage(&env);
+    if (!wasPacked) CkUnpackMessage(envptr);
     return CmiTrue;
   }
 };
@@ -2058,25 +2096,29 @@ private:
 extern "C" void CkMessageReplayQuiescence(void *rep, double time);
 extern "C" void CkMessageDetailReplayDone(void *rep, double time);
 
+#if CMK_BLUEGENE_CHARM
+void CthEnqueueBigSimThread(CthThreadToken* token, int s,
+                                   int pb,unsigned int *prio);
+#endif
+
 class CkMessageReplay : public CkMessageWatcher {
   int counter;
        int nextPE, nextSize, nextEvent, nexttype; //Properties of next message we need:
+       int nextEP;
        unsigned int crc1, crc2;
        /// Read the next message we need from the file:
        void getNext(void) {
          if (3!=fscanf(f,"%d%d%d", &nextPE,&nextSize,&nextEvent)) CkAbort("CkMessageReplay> Syntax error reading replay file");
-          REPLAYDEBUG("getNext: "<<nextPE<<" " << nextSize << " " << nextEvent)
          if (nextSize > 0) {
            // We are reading a regular message
-           if (3!=fscanf(f,"%d%x%x", &nexttype,&crc1,&crc2)) {
+           if (4!=fscanf(f,"%d%x%x%d", &nexttype,&crc1,&crc2,&nextEP)) {
              CkAbort("CkMessageReplay> Syntax error reading replay file");
            }
+            REPLAYDEBUG("getNext: "<<nextPE<<" " << nextSize << " " << nextEvent)
          } else if (nextSize == -2) {
            // We are reading a special message (right now only thread awaken)
            // Nothing to do since we have already read all info
-#if CMK_BLUEGENE_CHARM
-           return getNext();          // ignoring thread event is ok
-#endif
+            REPLAYDEBUG("getNext: "<<nextPE<<" " << nextSize << " " << nextEvent)
          } else if (nextPE!=-1 || nextSize!=-1 || nextEvent!=-1) {
            CkPrintf("Read from file item %d %d %d\n",nextPE,nextSize,nextEvent);
            CkAbort("CkMessageReplay> Unrecognized input");
@@ -2094,10 +2136,16 @@ class CkMessageReplay : public CkMessageWatcher {
                if (nextPE!=env->getSrcPe()) return CmiFalse;
                if (nextEvent!=env->getEvent()) return CmiFalse;
                if (nextSize<0) return CmiFalse; // not waiting for a regular message
+#if 1
+               if (nextEP != env->getEpIdx()) {
+                       CkPrintf("[%d] CkMessageReplay> Message EP changed during replay org: [%d %d %d %d] got: [%d %d %d %d]\n", CkMyPe(), nextPE, nextSize, nextEvent, nextEP, env->getSrcPe(), env->getTotalsize(), env->getEvent(), env->getEpIdx());
+                       return CmiFalse;
+               }
+#endif
 #if ! CMK_BLUEGENE_CHARM
                if (nextSize!=env->getTotalsize())
                 {
-                       CkPrintf("CkMessageReplay> Message size changed during replay org: [%d %d %d] got: [%d %d %d]\n", nextPE, nextEvent, nextSize, env->getSrcPe(), env->getEvent(), env->getTotalsize());
+                       CkPrintf("[%d] CkMessageReplay> Message size changed during replay org: [%d %d %d %d] got: [%d %d %d %d]\n", CkMyPe(), nextPE, nextSize, nextEvent, nextEP, env->getSrcPe(), env->getTotalsize(), env->getEvent(), env->getEpIdx());
                         return CmiFalse;
                 }
                if (_recplay_crc || _recplay_checksum) {
@@ -2146,14 +2194,13 @@ class CkMessageReplay : public CkMessageWatcher {
                        envelope *env=delayedMessages.deq();
                        if (isNext(env)) { /* this is the next message: process it */
                                REPLAYDEBUG("Dequeueing message: "<<env->getSrcPe()<<" "<<env->getTotalsize()<<" "<<env->getEvent())
-                               //CmiSyncSendAndFree(CkMyPe(),env->getTotalsize(),(char *)env);
                                CsdEnqueueLifo((void*)env); // Make it at the beginning since this is the one we want next
                                return;
                        }
                        else /* Not ready yet-- put it back in the
                                queue */
                          {
-                               REPLAYDEBUG("requeueing delayed message: "<<env->getSrcPe()<<" "<<env->getTotalsize()<<" "<<env->getEvent())
+                               REPLAYDEBUG("requeueing delayed message: "<<env->getSrcPe()<<" "<<env->getTotalsize()<<" "<<env->getEvent()<<" ep:"<<env->getEpIdx())
                                delayedMessages.enq(env);
                          }
                }
@@ -2163,7 +2210,11 @@ class CkMessageReplay : public CkMessageWatcher {
              CthThreadToken *token=delayedTokens.deq();
              if (isNext(token)) {
             REPLAYDEBUG("Dequeueing token: "<<token->serialNo)
+#if ! CMK_BLUEGENE_CHARM
                CsdEnqueueLifo((void*)token);
+#else
+               CthEnqueueBigSimThread(token,0,0,NULL);
+#endif
                return;
              } else {
             REPLAYDEBUG("requeueing delayed token: "<<token->serialNo)
@@ -2184,14 +2235,18 @@ public:
        ~CkMessageReplay() {fclose(f);}
 
 private:
-       virtual CmiBool process(envelope *env,CkCoreState *ck) {
+       virtual CmiBool process(envelope **envptr,CkCoreState *ck) {
+          bool wasPacked = (*envptr)->isPacked();
+          if (!wasPacked) CkPackMessage(envptr);
+          envelope *env = *envptr;
          //CkAssert(*(int*)env == 0x34567890);
-         REPLAYDEBUG("ProcessMessage message: "<<env->getSrcPe()<<" "<<env->getTotalsize()<<" "<<env->getEvent() <<" " <<env->getMsgtype() <<" " <<env->getMsgIdx());
+         REPLAYDEBUG("ProcessMessage message: "<<env->getSrcPe()<<" "<<env->getTotalsize()<<" "<<env->getEvent() <<" " <<env->getMsgtype() <<" " <<env->getMsgIdx() << " ep:" << env->getEpIdx());
                 if (env->getEvent() == 0) return CmiTrue;
                if (isNext(env)) { /* This is the message we were expecting */
                        REPLAYDEBUG("Executing message: "<<env->getSrcPe()<<" "<<env->getTotalsize()<<" "<<env->getEvent())
                        getNext(); /* Advance over this message */
                        flush(); /* try to process queued-up stuff */
+                       if (!wasPacked) CkUnpackMessage(envptr);
                        return CmiTrue;
                }
 #if CMK_SMP
@@ -2206,8 +2261,8 @@ private:
                 }
 #endif
                else /*!isNext(env) */ {
-                       REPLAYDEBUG("Queueing message: "<<env->getSrcPe()<<" "<<env->getTotalsize()<<" "<<env->getEvent()
-                               <<" because we wanted "<<nextPE<<" "<<nextSize<<" "<<nextEvent)
+                       REPLAYDEBUG("Queueing message: "<<env->getSrcPe()<<" "<<env->getTotalsize()<<" "<<env->getEvent()<<" "<<env->getEpIdx()
+                               <<" because we wanted "<<nextPE<<" "<<nextSize<<" "<<nextEvent << " " << nextEP)
                        delayedMessages.enq(env);
                         flush();
                        return CmiFalse;
@@ -2247,8 +2302,10 @@ class CkMessageDetailReplay : public CkMessageWatcher {
     return env;
   }
 public:
+  double starttime;
   CkMessageDetailReplay(FILE *f_) {
     f=f_;
+    starttime=CkWallTimer();
     /* This must match what CkMessageDetailRecorder did */
     CmiUInt2 little;
     fread(&little, 2, 1, f);
@@ -2260,7 +2317,7 @@ public:
 
     CcdCallOnCondition(CcdPROCESSOR_STILL_IDLE, (CcdVoidFn)CkMessageDetailReplayDone, (void*)this);
   }
-  virtual CmiBool process(envelope *env,CkCoreState *ck) {
+  virtual CmiBool process(envelope **env,CkCoreState *ck) {
     void *msg = getNext();
     if (msg != NULL) CsdEnqueue(msg);
     return CmiTrue;
@@ -2276,7 +2333,8 @@ extern "C" void CkMessageReplayQuiescence(void *rep, double time) {
 }
 
 extern "C" void CkMessageDetailReplayDone(void *rep, double time) {
-  CkPrintf("[%d] Detailed replay finished. Exiting.\n",CkMyPe());
+  CkMessageDetailReplay *replay = (CkMessageDetailReplay *)rep;
+  CkPrintf("[%d] Detailed replay finished after %f seconds. Exiting.\n",CkMyPe(),CkWallTimer()-replay->starttime);
   ConverseExit();
 }
 
@@ -2297,7 +2355,7 @@ extern "C" void CthResumeNormalThreadDebug(CthThreadToken* token)
     free(token);
     return;
   }
-#ifndef CMK_OPTIMIZE
+#if CMK_TRACE_ENABLED
 #if ! CMK_TRACE_IN_CHARM
   if(CpvAccess(traceOn))
     CthTraceResume(t);
@@ -2330,15 +2388,19 @@ static FILE *openReplayFile(const char *prefix, const char *suffix, const char *
        return f;
 }
 
+#if CMK_BLUEGENE_CHARM
+CpvExtern(int      , CthResumeBigSimThreadIdx);
+#endif
+
 #include "ckliststring.h"
 void CkMessageWatcherInit(char **argv,CkCoreState *ck) {
     CmiBool forceReplay = CmiFalse;
     char *procs = NULL;
     _replaySystem = 0;
-    if (CmiGetArgFlagDesc(argv,"+recplay-crc","Enable crc32 for message record-replay")) {
+    if (CmiGetArgFlagDesc(argv,"+recplay-crc","Enable CRC32 checksum for message record-replay")) {
       _recplay_crc = 1;
     }
-    if (CmiGetArgFlagDesc(argv,"+recplay-checksum","Enable simple checksum for message record-replay")) {
+    if (CmiGetArgFlagDesc(argv,"+recplay-xor","Enable simple XOR checksum for message record-replay")) {
       _recplay_checksum = 1;
     }
     CmiGetArgIntDesc(argv,"+recplay-logsize",&_recplay_logsize,"Specify the size of the buffer used by the message recorder");
@@ -2388,6 +2450,8 @@ void CkMessageWatcherInit(char **argv,CkCoreState *ck) {
          CpdSetInitializeMemory(1);
 #if ! CMK_BLUEGENE_CHARM
          CmiNumberHandler(CpvAccess(CthResumeNormalThreadIdx), (CmiHandler)CthResumeNormalThreadDebug);
+#else
+         CkNumberHandler(CpvAccess(CthResumeBigSimThreadIdx), (CmiHandler)CthResumeNormalThreadDebug);
 #endif
          ck->addWatcher(new CkMessageReplay(openReplayFile("ckreplay_",".log","r")));
        }
index 1d8d9a62e941138ef09583acfc95ffc2db336486..4063a65f4708c6f92774943eba4ee69831ecc1cc 100644 (file)
 #endif
 
 // Flag that tells the system if we are replaying using Record/Replay
-extern int _replaySystem;
+extern "C" int _replaySystem;
 
-#if CMK_REPLAYSYSTEM
+#if CMK_CHARMDEBUG
+extern "C" int ConverseDeliver(int pe);
 inline void _CldEnqueue(int pe, void *msg, int infofn) {
-  if (_replaySystem) {
+  if (!ConverseDeliver(pe)) {
     CmiFree(msg);
     return;
   }
   CldEnqueue(pe, msg, infofn);
 }
 inline void _CldEnqueueMulti(int npes, int *pes, void *msg, int infofn) {
-  if (_replaySystem) {
+  if (!ConverseDeliver(-1)) {
     CmiFree(msg);
     return;
   }
   CldEnqueueMulti(npes, pes, msg, infofn);
 }
 inline void _CldEnqueueGroup(CmiGroup grp, void *msg, int infofn) {
-  if (_replaySystem) {
+  if (!ConverseDeliver(-1)) {
     CmiFree(msg);
     return;
   }
   CldEnqueueGroup(grp, msg, infofn);
 }
 inline void _CldNodeEnqueue(int node, void *msg, int infofn) {
-  if (_replaySystem) {
+  if (!ConverseDeliver(node)) {
     CmiFree(msg);
     return;
   }
@@ -122,7 +123,7 @@ protected:
   FILE *f;
   CkMessageWatcher *next;
 public:
-    CkMessageWatcher() : next(NULL) { }
+    CkMessageWatcher() : f(NULL), next(NULL) { }
     virtual ~CkMessageWatcher();
        /**
         * This message is about to be processed by Charm.
@@ -130,21 +131,27 @@ public:
         * The message is processed by the watcher starting from the innermost one
         * up to the outermost
         */
-       inline CmiBool processMessage(envelope *env,CkCoreState *ck) {
+       inline CmiBool processMessage(envelope **env,CkCoreState *ck) {
          CmiBool result = CmiTrue;
          if (next != NULL) result &= next->processMessage(env, ck);
          result &= process(env, ck);
+#if CMK_BLUEGENE_CHARM
+         //if (!result) BgRewindRecord();
+#endif
          return result;
        }
        inline int processThread(CthThreadToken *token, CkCoreState *ck) {
           int result = 1;
           if (next != NULL) result &= next->processThread(token, ck);
           result &= process(token, ck);
+#if CMK_BLUEGENE_CHARM
+          //if (!result) BgRewindRecord();
+#endif
           return result;
        }
 protected:
     /** These are used internally by this class to call the correct subclass method */
-       virtual CmiBool process(envelope *env,CkCoreState *ck) =0;
+       virtual CmiBool process(envelope **env,CkCoreState *ck) =0;
        virtual int process(CthThreadToken *token, CkCoreState *ck) {return 1;}
 public:
     inline void setNext(CkMessageWatcher *w) { next = w; }
index 63c112fba65905efe8e56400711c2aab538e54db..700543f4af48f07d1cbe91616e6115c35f279f00 100644 (file)
@@ -360,27 +360,6 @@ public:
        void pup(PUP::er &p);
 };
 PUPmarshall(CProxy_ArrayBase)
-#define CK_DISAMBIG_ARRAY(super) \
-       CK_DISAMBIG_CPROXY(super) \
-       inline void ckCheck(void) const {super::ckCheck();} \
-       inline operator CkArrayID () const {return ckGetArrayID();}\
-       inline static CkArrayID ckCreateEmptyArray(void)\
-         { return super::ckCreateEmptyArray(); }\
-       inline static CkArrayID ckCreateArray(CkArrayMessage *m,int ctor,const CkArrayOptions &opts)\
-         { return super::ckCreateArray(m,ctor,opts); }\
-       inline void ckInsertIdx(CkArrayMessage *m,int ctor,int onPe,const CkArrayIndex &idx) \
-         { super::ckInsertIdx(m,ctor,onPe,idx); }\
-       inline void ckBroadcast(CkArrayMessage *m, int ep, int opts=0) const \
-         { super::ckBroadcast(m,ep,opts); } \
-       inline CkArrayID ckGetArrayID(void) const \
-         { return super::ckGetArrayID();} \
-       inline CkArray *ckLocalBranch(void) const \
-         { return super::ckLocalBranch(); } \
-       inline CkLocMgr *ckLocMgr(void) const \
-         { return super::ckLocMgr(); } \
-       inline void doneInserting(void) { super::doneInserting(); }\
-       CK_REDUCTION_CLIENT_DISAMBIG(super) \
-
 
 class CProxyElement_ArrayBase:public CProxy_ArrayBase {
 private:
@@ -405,17 +384,6 @@ public:
        void pup(PUP::er &p);
 };
 PUPmarshall(CProxyElement_ArrayBase)
-#define CK_DISAMBIG_ARRAY_ELEMENT(super) \
-       CK_DISAMBIG_ARRAY(super) \
-       inline void ckInsert(CkArrayMessage *m,int ctor,int onPe) \
-         { super::ckInsert(m,ctor,onPe); }\
-       inline void ckSend(CkArrayMessage *m, int ep, int opts = 0) const \
-         { super::ckSend(m,ep,opts); }\
-       inline void *ckSendSync(CkArrayMessage *m, int ep) const \
-         { return super::ckSendSync(m,ep); }\
-       inline const CkArrayIndex &ckGetIndex() const \
-         { return super::ckGetIndex(); }\
-
 
 class CProxySection_ArrayBase:public CProxy_ArrayBase {
 private:
@@ -494,28 +462,6 @@ public:
        void pup(PUP::er &p);
 };
 PUPmarshall(CProxySection_ArrayBase)
-#define CK_DISAMBIG_ARRAY_SECTION(super) \
-       CK_DISAMBIG_ARRAY(super) \
-       inline void ckSend(CkArrayMessage *m, int ep, int opts = 0) \
-         { super::ckSend(m,ep,opts); } \
-        inline CkSectionInfo &ckGetSectionInfo() \
-         { return super::ckGetSectionInfo(); } \
-        inline CkSectionID *ckGetSectionIDs() \
-         { return super::ckGetSectionIDs(); } \
-        inline CkSectionID &ckGetSectionID() \
-         { return super::ckGetSectionID(); } \
-        inline CkSectionID &ckGetSectionID(int i) \
-         { return super::ckGetSectionID(i); } \
-        inline CkArrayID ckGetArrayIDn(int i) const \
-          { return super::ckGetArrayIDn(i); }  \
-        inline CkArrayIndexMax *ckGetArrayElements() const \
-         { return super::ckGetArrayElements(); } \
-        inline CkArrayIndexMax *ckGetArrayElements(int i) const \
-          { return super::ckGetArrayElements(i); } \
-        inline int ckGetNumElements() const \
-         { return super::ckGetNumElements(); }  \
-        inline int ckGetNumElements(int i) const \
-          { return super::ckGetNumElements(i); }  \
 
 //Simple C-like API:
 void CkSendMsgArray(int entryIndex, void *msg, CkArrayID aID, const CkArrayIndex &idx, int opts=0);
index 83ea1abdcdfeb2166f954fbf70084305d84d5bc7..c1342cc3ee4cf8fc031cac2238e5287ecc086567 100644 (file)
@@ -218,20 +218,20 @@ void CkPupMainChareData(PUP::er &p, CkArgMsg *args)
 
 #ifndef CMK_CHARE_USE_PTR
 
-CpvExtern(CkVec<void *>, chare_objs);
-CpvExtern(CkVec<int>, chare_types);
-CpvExtern(CkVec<VidBlock *>, vidblocks);
+CkpvExtern(CkVec<void *>, chare_objs);
+CkpvExtern(CkVec<int>, chare_types);
+CkpvExtern(CkVec<VidBlock *>, vidblocks);
 
 // handle plain non-migratable chare
 void CkPupChareData(PUP::er &p)
 {
   int i, n;
-  if (!p.isUnpacking()) n = CpvAccess(chare_objs).size();
+  if (!p.isUnpacking()) n = CkpvAccess(chare_objs).size();
   p|n;
   for (i=0; i<n; i++) {
         int chare_type;
        if (!p.isUnpacking()) {
-               chare_type = CpvAccess(chare_types)[i];
+               chare_type = CkpvAccess(chare_types)[i];
        }
        p | chare_type;
        if (p.isUnpacking()) {
@@ -246,20 +246,20 @@ void CkPupChareData(PUP::er &p)
                CkCreateLocalChare(migCtor, env);
                CkFreeSysMsg(m);
        }
-       Chare *obj = (Chare*)CpvAccess(chare_objs)[i];
+       Chare *obj = (Chare*)CkpvAccess(chare_objs)[i];
        obj->pup(p);
   }
 
-  if (!p.isUnpacking()) n = CpvAccess(vidblocks).size();
+  if (!p.isUnpacking()) n = CkpvAccess(vidblocks).size();
   p|n;
   for (i=0; i<n; i++) {
        VidBlock *v;
        if (p.isUnpacking()) {
                v = new VidBlock();
-               CpvAccess(vidblocks).push_back(v);
+               CkpvAccess(vidblocks).push_back(v);
        }
        else
-               v = CpvAccess(vidblocks)[i];
+               v = CkpvAccess(vidblocks)[i];
        v->pup(p);
   }
 }
index 4811103eaf361f998f3a53f51739a8a03b033bee..567989dbdfc2f2e8fbb2722328bc7f15fb19fb10 100644 (file)
@@ -184,7 +184,7 @@ void *CkWaitFuture(CkFutureID handle)
   if (!(fut->ready)) {
     CthSetNext(self, fut->waiters);
     fut->waiters = self;
-    CthSuspend();
+    while (!(fut->ready)) CthSuspend();
   }
   fut = (fs->array)+handle;
   value = fut->value;
index ead8314e301ef02534e348e5cbb07288a8d7227c..b72bbaaeec6eed11042f5df9c5ef9e130086cd78 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>
 
@@ -248,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;
@@ -268,7 +282,7 @@ public:
  */
 class DefaultArrayMap : public RRMap
 {
-private:
+public:
   CkPupPtrVec<dimInfo> arrs;
 
 public:
@@ -280,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;
   }
  
@@ -317,7 +321,84 @@ 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();
+    }
+  }
+};
+
+/**
+ * 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;
   }
 };
 
@@ -543,12 +624,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 6b7a4b74b4f31a244b90260ac49944a006bb788c..a619b36dace5f3b0c0482b38a534627d350ea2e2 100644 (file)
@@ -146,8 +146,6 @@ public:
         */
        void ckSetReductionClient(CkCallback *cb);
 
-       void contributorDied(contributorInfo *ci);//Don't expect more contributions
-
 //Contribute-- the given msg can contain any data.  The reducerType
 // field of the message must be valid.
 // Each contributor must contribute exactly once to each reduction.
@@ -276,7 +274,8 @@ class NodeGroup : public CkNodeReductionMgr {
   public:
     CmiNodeLock __nodelock;
     NodeGroup();
-    NodeGroup(CkMigrateMessage* m):CkNodeReductionMgr(m) { }
+    NodeGroup(CkMigrateMessage* m):CkNodeReductionMgr(m) { __nodelock=CmiCreateLock(); }
+    
     ~NodeGroup();
     inline const CkGroupID &ckGetGroupID(void) const {return thisgroup;}
     inline CkGroupID CkGetNodeGroupID(void) const {return thisgroup;}
index f90d7fcb45ff9a35dd1da7f4dd9e7ffb4f2ff9fd..17be691fe93d24699ac4c4b9afec043850b709e9 100644 (file)
@@ -54,10 +54,9 @@ waits for the migrant contributions to straggle in.
 #include "pathHistory.h"
 #endif
 
-#if 0
+#if CMK_DEBUG_REDUCTIONS
 //Debugging messages:
 // Reduction mananger internal information:
-#define DEBUGRED 1
 #define DEBR(x) CkPrintf x
 #define AA "Red PE%d Node%d #%d (%d,%d) Group %d> "
 #define AB ,CkMyPe(),CkMyNode(),redNo,nRemote,nContrib,thisgroup.idx
@@ -71,7 +70,6 @@ waits for the migrant contributions to straggle in.
 #define DEBREVAC(x) CkPrintf x
 #else
 //No debugging info-- empty defines
-#define DEBUGRED 0
 #define DEBR(x) // CkPrintf x
 #define DEBRMLOG(x) CkPrintf x
 #define AA
@@ -95,9 +93,7 @@ Group::Group()
        contributorStamped(&reductionInfo);
        contributorCreated(&reductionInfo);
        doneCreatingContributors();
-#if DEBUGRED
-       CkPrintf("[%d,%d]Creating nodeProxy with gid %d\n",CkMyNode(),CkMyPe(),CkpvAccess(_currentGroupRednMgr));
-#endif                 
+       DEBR(("[%d,%d]Creating nodeProxy with gid %d\n",CkMyNode(),CkMyPe(),CkpvAccess(_currentGroupRednMgr)));
 #if !GROUP_LEVEL_REDUCTION
        CProxy_CkArrayReductionMgr nodetemp(CkpvAccess(_currentGroupRednMgr));
        nodeProxy = nodetemp;
@@ -640,14 +636,14 @@ void CkReductionMgr::addContribution(CkReductionMsg *m)
         CmiAbort("this version should not have late migrations");
 #else
        //We've moved on-- forward late contribution straight to root
-    DEBR((AA"Migrant %p gives late contribution for #%d!\n"AB,m->ci,m->redNo));
+    DEBR((AA"Migrant gives late contribution for #%d!\n"AB,m->redNo));
        // if (!hasParent()) //Root moved on too soon-- should never happen
        //   CkAbort("Late reduction contribution received at root!\n");
     thisProxy[0].LateMigrantMsg(m);
 #endif
   }
   else if (isFuture(m->redNo)) {//An early contribution-- add to future Q
-    DEBR((AA"Contributor %p gives early contribution-- for #%d\n"AB,m->ci,m->redNo));
+    DEBR((AA"Contributor gives early contribution-- for #%d\n"AB,m->redNo));
     futureMsgs.enq(m);
   } else {// An ordinary contribution
     DEBR((AA"Recv'd local contribution %d for #%d at %d\n"AB,nContrib,m->redNo,this));
@@ -732,6 +728,7 @@ void CkReductionMgr::finishReduction(void)
       CkAbort("ERROR! Too many contributions at root!\n");
     }
     DEBR((AA"Passing result to client function\n"AB));
+    CkSetRefNum(result, redNo);
     if (!result->callback.isInvalid())
            result->callback.send(result);
     else if (!storedCallback.isInvalid())
@@ -750,32 +747,27 @@ void CkReductionMgr::finishReduction(void)
 
   //CkPrintf("[%d] Got all local Messages in finishReduction %d in redNo %d\n",CkMyPe(),nContrib,redNo);
 
-#if DEBUGRED
- // CkPrintf("[%d,%d]Callback for redNo %d in group %d  mesggcount=%d localgcount=%d\n",CkMyNode(),CkMyPe(),redNo,thisgroup.idx,ret->gcount,gcount);
-#endif
+ // DEBR(("[%d,%d]Callback for redNo %d in group %d  mesggcount=%d localgcount=%d\n",CkMyNode(),CkMyPe(),redNo,thisgroup.idx,ret->gcount,gcount));
   
   // Find our node reduction manager, and pass reduction to him:
   CkArrayReductionMgr *nodeMgr=nodeProxy[CkMyNode()].ckLocalBranch();
   nodeMgr->contributeArrayReduction(result);
 #endif
 #else                // _FAULT_MLOG_
-#if DEBUGRED
-    CkPrintf("~~~~~~~~~~~~~~~~~ About to call callback from end of SIMPLIFIED GROUP REDUCTION %d at %.6f\n",redNo,CmiWallTimer());
-#endif
+  DEBR(("~~~~~~~~~~~~~~~~~ About to call callback from end of SIMPLIFIED GROUP REDUCTION %d at %.6f\n",redNo,CmiWallTimer()));
+
+    CkSetRefNum(result, redNo);
     if (!result->callback.isInvalid())
         result->callback.send(result);
     else if (!storedCallback.isInvalid())
         storedCallback.send(result);
     else{
-#if DEBUGRED
-        CkPrintf("No reduction client for group %d \n",thisgroup.idx);
-#endif
+      DEBR(("No reduction client for group %d \n",thisgroup.idx));
         CkAbort("No reduction client!\n"
             "You must register a client with either SetReductionClient or during contribute.\n");
     }
-#if DEBUGRED
-       CkPrintf("[%d,%d]------------END OF SIMPLIFIED GROUP REDUCTION %d for group %d at %.6f\n",CkMyNode(),CkMyPe(),redNo,thisgroup.idx,CkWallTimer());
-#endif
+
+    DEBR(("[%d,%d]------------END OF SIMPLIFIED GROUP REDUCTION %d for group %d at %.6f\n",CkMyNode(),CkMyPe(),redNo,thisgroup.idx,CkWallTimer()));
 
 #endif               // _FAULT_MLOG_
 
@@ -1028,9 +1020,8 @@ void CkReductionMgr::pup(PUP::er &p)
 #endif
 #endif
   }
-#if DEBUGRED
-  CkPrintf("[%d,%d] pupping _____________  gcount = %d \n",CkMyNode(),CkMyPe(),gcount);
-#endif
+
+  DEBR(("[%d,%d] pupping _____________  gcount = %d \n",CkMyNode(),CkMyPe(),gcount));
 }
 
 
@@ -1042,9 +1033,7 @@ void CkReductionMgr::ArrayReductionHandler(CkReductionMsg *m){
        finalMsgs.enq(m);
        //CkPrintf("ArrayReduction Handler Invoked for %d \n",m->redNo);
        adj(m->redNo).mainRecvd = 1;
-#if DEBUGRED
-       CkPrintf("~~~~~~~~~~~~~ ArrayReductionHandler Callback called for redNo %d with mesgredNo %d at %.6f %d\n",completedRedNo,m->redNo,CmiWallTimer());
-#endif 
+       DEBR(("~~~~~~~~~~~~~ ArrayReductionHandler Callback called for redNo %d with mesgredNo %d at %.6f %d\n",completedRedNo,m->redNo,CmiWallTimer()));
        endArrayReduction();
 }
 
@@ -1086,9 +1075,9 @@ void CkReductionMgr :: endArrayReduction(){
 
        }
        numMsgs = tempMsgs.length();
-#if DEBUGRED
-       CkPrintf("[%d]Total = %d %d Sources = %d Number of Messages %d Adj(Completed redno).mainRecvd %d\n",CkMyPe(),msgs_gcount,  adj(completedRedNo+1).gcount,msgs_nSources,numMsgs,adj(completedRedNo+1).mainRecvd);
-#endif 
+
+       DEBR(("[%d]Total = %d %d Sources = %d Number of Messages %d Adj(Completed redno).mainRecvd %d\n",CkMyPe(),msgs_gcount,  adj(completedRedNo+1).gcount,msgs_nSources,numMsgs,adj(completedRedNo+1).mainRecvd));
+
        if(numMsgs == 0){
                return;
        }
@@ -1164,24 +1153,22 @@ void CkReductionMgr :: endArrayReduction(){
        ret->secondaryCallback = msgs_secondaryCallback;
        ret->sourceFlag=msgs_nSources;
 
-#if DEBUGRED
-       CkPrintf("~~~~~~~~~~~~~~~~~ About to call callback from end of GROUP REDUCTION %d at %.6f\n",completedRedNo,CmiWallTimer());
-#endif
+       DEBR(("~~~~~~~~~~~~~~~~~ About to call callback from end of GROUP REDUCTION %d at %.6f\n",completedRedNo,CmiWallTimer()));
+
+       CkSetRefNum(ret, ret->redNo);
        if (!ret->secondaryCallback.isInvalid())
            ret->secondaryCallback.send(ret);
     else if (!storedCallback.isInvalid())
            storedCallback.send(ret);
     else{
-#if DEBUGRED
-           CkPrintf("No reduction client for group %d \n",thisgroup.idx);
-#endif
+      DEBR(("No reduction client for group %d \n",thisgroup.idx));
            CkAbort("No reduction client!\n"
                    "You must register a client with either SetReductionClient or during contribute.\n");
     }
        completedRedNo++;
-#if DEBUGRED
-       CkPrintf("[%d,%d]------------END OF GROUP REDUCTION %d for group %d at %.6f\n",CkMyNode(),CkMyPe(),completedRedNo,thisgroup.idx,CkWallTimer());
-#endif
+
+       DEBR(("[%d,%d]------------END OF GROUP REDUCTION %d for group %d at %.6f\n",CkMyNode(),CkMyPe(),completedRedNo,thisgroup.idx,CkWallTimer()));
+
        for (i=1;i<(int)(adjVec.length());i++)
                adjVec[i-1]=adjVec[i];
        adjVec.length()--;
@@ -1735,9 +1722,7 @@ void CkNodeReductionMgr::contribute(contributorInfo *ci,CkReductionMsg *m)
   m->redNo=ci->redNo++;
   m->sourceFlag=-1;//A single contribution
   m->gcount=0;
-#if DEBUGRED
-       CkPrintf("[%d,%d] NodeGroup %d> localContribute called for redNo %d \n",CkMyNode(),CkMyPe(),thisgroup.idx,m->redNo);
-#endif
+  DEBR(("[%d,%d] NodeGroup %d> localContribute called for redNo %d \n",CkMyNode(),CkMyPe(),thisgroup.idx,m->redNo));
   addContribution(m);
 
 #if (defined(_FAULT_MLOG_) || defined(_FAULT_CAUSAL_))
@@ -1758,13 +1743,9 @@ void CkNodeReductionMgr::contributeWithCounter(contributorInfo *ci,CkReductionMs
   //m->ci=ci;
   m->redNo=ci->redNo++;
   m->gcount=count;
-#if DEBUGRED
- CkPrintf("[%d,%d] contributewithCounter started for %d at %0.6f{{{\n",CkMyNode(),CkMyPe(),m->redNo,CmiWallTimer());
-#endif
+  DEBR(("[%d,%d] contributewithCounter started for %d at %0.6f{{{\n",CkMyNode(),CkMyPe(),m->redNo,CmiWallTimer()));
   addContribution(m);
-#if DEBUGRED
-  CkPrintf("[%d,%d] }}}contributewithCounter finished for %d at %0.6f\n",CkMyNode(),CkMyPe(),m->redNo,CmiWallTimer());
-#endif
+  DEBR(("[%d,%d] }}}contributewithCounter finished for %d at %0.6f\n",CkMyNode(),CkMyPe(),m->redNo,CmiWallTimer()));
 
 #if (defined(_FAULT_MLOG_) || defined(_FAULT_CAUSAL_))
     CpvAccess(_currentObj) = oldObj;
@@ -1801,9 +1782,7 @@ void CkNodeReductionMgr::ReductionStarting(CkReductionNumberMsg *m)
 
 
 void CkNodeReductionMgr::doRecvMsg(CkReductionMsg *m){
-#if DEBUGRED
-       CkPrintf("[%d,%d] doRecvMsg called for  %d at %.6f[[[[[\n",CkMyNode(),CkMyPe(),m->redNo,CkWallTimer());
-#endif
+       DEBR(("[%d,%d] doRecvMsg called for  %d at %.6f[[[[[\n",CkMyNode(),CkMyPe(),m->redNo,CkWallTimer()));
        /*
                FAULT_EVAC
        */
@@ -1828,10 +1807,8 @@ void CkNodeReductionMgr::doRecvMsg(CkReductionMsg *m){
                   CkPrintf("BIG Problem Present %d Mesg RedNo %d \n",redNo,m->redNo);  
                   CkAbort("Recv'd late remote contribution!\n");
            }
-  }
-#if DEBUGRED        
-       CkPrintf("[%d,%d]]]]] doRecvMsg called for  %d at %.6f\n",CkMyNode(),CkMyPe(),m->redNo,CkWallTimer());
-#endif       
+       }
+       DEBR(("[%d,%d]]]]] doRecvMsg called for  %d at %.6f\n",CkMyNode(),CkMyPe(),m->redNo,CkWallTimer()));
 }
 
 //Sent up the reduction tree with reduced data
@@ -1852,15 +1829,11 @@ void CkNodeReductionMgr::RecvMsg(CkReductionMsg *m)
 #endif
    interrupt = 1;      
    CmiLock(lockEverything);   
-#if DEBUGRED   
-   CkPrintf("[%d,%d] Recv'd REMOTE contribution for %d at %.6f[[[\n",CkMyNode(),CkMyPe(),m->redNo,CkWallTimer());
-#endif   
+   DEBR(("[%d,%d] Recv'd REMOTE contribution for %d at %.6f[[[\n",CkMyNode(),CkMyPe(),m->redNo,CkWallTimer()));
    doRecvMsg(m);
    CmiUnlock(lockEverything);    
    interrupt = 0;
-#if DEBUGRED  
-   CkPrintf("[%d,%d] ]]]]]]Recv'd REMOTE contribution for %d at %.6f\n",CkMyNode(),CkMyPe(),m->redNo,CkWallTimer());
-#endif 
+   DEBR(("[%d,%d] ]]]]]]Recv'd REMOTE contribution for %d at %.6f\n",CkMyNode(),CkMyPe(),m->redNo,CkWallTimer()));
 }
 
 void CkNodeReductionMgr::startReduction(int number,int srcNode)
@@ -1925,7 +1898,7 @@ void CkNodeReductionMgr::doAddContribution(CkReductionMsg *m){
        }
        
        if (isFuture(m->redNo)) {//An early contribution-- add to future Q
-               DEBR((AA"Contributor %p gives early node contribution-- for #%d\n"AB,m->ci,m->redNo));
+               DEBR((AA"Contributor gives early node contribution-- for #%d\n"AB,m->redNo));
                futureMsgs.enq(m);
        } else {// An ordinary contribution
                DEBR((AA"Recv'd local node contribution %d for #%d at %d\n"AB,nContrib,m->redNo,this));
@@ -1955,7 +1928,7 @@ void CkNodeReductionMgr::LateMigrantMsg(CkReductionMsg *m){
        }
        
        if (isFuture(m->redNo)) {//An early contribution-- add to future Q
-               DEBR((AA"Latemigrant %p gives early node contribution-- for #%d\n"AB,m->ci,m->redNo));
+               DEBR((AA"Latemigrant gives early node contribution-- for #%d\n"AB,m->redNo));
 //             CkPrintf("[%d,%d] NodeGroup %d> Latemigrant gives early node contribution %d in redNo %d\n",CkMyNode(),CkMyPe(),thisgroup.idx,m->redNo,redNo);
                futureLateMigrantMsgs.enq(m);
        } else {// An ordinary contribution
@@ -2007,9 +1980,7 @@ void CkNodeReductionMgr::finishReduction(void)
   {//Pass data up tree to parent
        if(CmiNodeAlive(CkMyNode()) || killed == 0){
        DEBR((AA"Passing reduced data up to parent node %d. \n"AB,treeParent()));
-#if DEBUGRED
-       CkPrintf("[%d,%d] Passing data up to parentNode %d at %.6f for redNo %d with ncontrib %d\n",CkMyNode(),CkMyPe(),treeParent(),CkWallTimer(),redNo,nContrib);
-#endif
+       DEBR(("[%d,%d] Passing data up to parentNode %d at %.6f for redNo %d with ncontrib %d\n",CkMyNode(),CkMyPe(),treeParent(),CkWallTimer(),redNo,nContrib));
                /*
                        FAULT_EVAC
                */
@@ -2021,9 +1992,7 @@ void CkNodeReductionMgr::finishReduction(void)
   else
   {
                if(result->isMigratableContributor() && result->gcount+additionalGCount != result->sourceFlag){
-#if DEBUGRED
-                       CkPrintf("[%d,%d] NodeGroup %d> Node Reduction %d not done yet gcounts %d sources %d migratable %d \n",CkMyNode(),CkMyPe(),thisgroup.idx,redNo,result->gcount,result->sourceFlag,result->isMigratableContributor());
-#endif                 
+                 DEBR(("[%d,%d] NodeGroup %d> Node Reduction %d not done yet gcounts %d sources %d migratable %d \n",CkMyNode(),CkMyPe(),thisgroup.idx,redNo,result->gcount,result->sourceFlag,result->isMigratableContributor()));
                        msgs.enq(result);
                        return;
                }
@@ -2032,19 +2001,14 @@ void CkNodeReductionMgr::finishReduction(void)
          then call the reductionhandler and other stuff ***/
                
 
-#if DEBUGRED
-   CkPrintf("[%d,%d]------------------- END OF REDUCTION %d with %d remote contributions passed to client function at %.6f\n",CkMyNode(),CkMyPe(),redNo,nRemote,CkWallTimer());
-#endif
+               DEBR(("[%d,%d]------------------- END OF REDUCTION %d with %d remote contributions passed to client function at %.6f\n",CkMyNode(),CkMyPe(),redNo,nRemote,CkWallTimer()));
+   CkSetRefNum(result, redNo);
     if (!result->callback.isInvalid()){
-#if DEBUGRED
-           CkPrintf("[%d,%d] message Callback used \n",CkMyNode(),CkMyPe());
-#endif     
+      DEBR(("[%d,%d] message Callback used \n",CkMyNode(),CkMyPe()));
            result->callback.send(result);
     }
     else if (storedCallback!=NULL){
-#if DEBUGRED
-           CkPrintf("[%d,%d] stored Callback used \n",CkMyNode(),CkMyPe());
-#endif
+      DEBR(("[%d,%d] stored Callback used \n",CkMyNode(),CkMyPe()));
            storedCallback->send(result);
     }
     else{
@@ -2074,9 +2038,7 @@ void CkNodeReductionMgr::finishReduction(void)
 
     interrupt = 0;
     if (m!=NULL){ //One of these addContributions may have finished us.
-#if DEBUGRED
-               CkPrintf("[%d,%d] NodeGroup %d> Mesg with redNo %d might be useful in new reduction %d \n",CkMyNode(),CkMyPe(),thisgroup.idx,m->redNo,redNo);
-#endif
+      DEBR(("[%d,%d] NodeGroup %d> Mesg with redNo %d might be useful in new reduction %d \n",CkMyNode(),CkMyPe(),thisgroup.idx,m->redNo,redNo));
       doAddContribution(m);//<- if *still* early, puts it back in the queue
     }
   }
@@ -2173,11 +2135,7 @@ CmiBool CkNodeReductionMgr::hasParent(void) //Root Node
 }
 int CkNodeReductionMgr::treeParent(void) //My parent Node
 {
-#ifdef BINOMIAL_TREE
-       return parent;
-#else
   return parent;
-#endif
 }
 
 int CkNodeReductionMgr::firstKid(void) //My first child Node
diff --git a/src/ck-core/cktiming.C b/src/ck-core/cktiming.C
new file mode 100644 (file)
index 0000000..d03eb70
--- /dev/null
@@ -0,0 +1,360 @@
+#include "charm++.h"
+#include "cktiming.h"
+#include <stdio.h>
+#include <stdarg.h>
+#include <vector>
+
+/*
+ *
+ * WITH_MAMBO:    when using mambo
+ * CMK_BLUEGENE_CHARM:  when build with bigsim
+ * SPLIT_APART_CYCLE_ACCURATE: parallelize Mambo run
+ * */
+
+#undef WITH_MAMBO 
+#undef SPLIT_APART_CYCLE_ACCURATE
+
+// MAMBO
+#if  WITH_MAMBO
+#include "mambo.h"
+static uint64_t start_time, end_time;
+#else
+CkpvStaticDeclare(double, start_time);
+CkpvStaticDeclare(double, end_time);
+#endif
+
+CkpvDeclare(FILE*, bgfp);     // for bigsim run
+
+CkpvDeclare(int, outputParameters);
+
+//======================PAPI======================= 
+//#define BIG_SIM_PAPI
+#ifdef BIG_SIM_PAPI
+#include <papi.h>
+#define NUM_PAPI_EVENTS 9
+#define BIGSIM_PAPI
+
+int errorcode; 
+int events[NUM_PAPI_EVENTS];
+long long values[NUM_PAPI_EVENTS]; 
+char errorstring[PAPI_MAX_STR_LEN+1]; 
+#endif
+
+unsigned long bgTraceCounter;
+double startTime;
+
+CkpvDeclare(bool, insideTraceBracket);
+
+class StringPool {
+ std::vector<char *> events;
+ int dumped;
+public:
+  StringPool(): dumped(0) {}
+  void dump() {
+    char fname[128];
+    const char *subdir = "params";
+    if (dumped) return;
+    CmiMkdir(subdir);
+    sprintf(fname, "%s/param.%d", subdir, CkMyPe());
+    FILE *fp  = fopen(fname, "w");
+    if (fp == NULL) 
+      CmiAbort("Failed to generated trace param file!");
+      // write out
+    for (int i=0; i<events.size(); i++)
+      fprintf(fp, events[i]);
+    fclose(fp);
+    dumped = 1;
+  }
+  void insert(char *e) {
+    events.push_back(strdup(e));
+  }
+};
+
+CkpvStaticDeclare(StringPool, eventsPool);
+
+// called on all PEs once
+extern "C"
+void initBigSimTrace(int outputParams)
+{
+  CkpvInitialize(int, outputParameters);
+  CkpvAccess(outputParameters) = outputParams;
+  bgTraceCounter = 0;
+
+  CkpvInitialize(bool, insideTraceBracket);
+  CkpvAccess(insideTraceBracket) = false;
+
+  CkpvInitialize(double, start_time);
+  CkpvInitialize(double, end_time);
+
+  CkpvInitialize(FILE*, bgfp);
+  CkpvAccess(bgfp) = NULL;
+#ifdef CMK_BLUEGENE_CHARM
+  //   for bigsim emulation, write to files, one for each processor
+  //   always write immediately, instead of store and dump at the end
+  if (!BgIsReplay()) {
+  char fname[128];
+  const char *subdir = "params";
+  CmiMkdir(subdir);
+  sprintf(fname, "%s/param.%d", subdir, CkMyPe());
+  CkpvAccess(bgfp) = fopen(fname, "w");
+  if (CkpvAccess(bgfp) == NULL) 
+    CmiAbort("Failed to generated trace param file!");
+  }
+#endif
+  //   for Mambo simulation, write to screen for now
+//  CkpvAccess(bgfp) = stdout;
+  if (CkpvAccess(outputParameters))  { 
+    CkpvInitialize(StringPool, eventsPool);
+    if (CkMyPe()==0) CmiPrintf("outputParameters enabled!\n");
+#ifdef CMK_BLUEGENE_CHARM
+    BgRegisterUserTracingFunction(finalizeBigSimTrace);
+#endif
+  }
+
+
+#ifdef BIG_SIM_PAPI
+       CkPrintf("PAPI: number of available counters: %d\n", PAPI_num_counters());
+       CkAssert(PAPI_num_counters() >= 0);
+#endif
+
+}
+
+extern "C"
+void finalizeBigSimTrace()
+{
+  if (CkpvAccess(bgfp) != NULL) {
+    fclose(CkpvAccess(bgfp));
+    CkpvAccess(bgfp) = NULL;
+    CkpvAccess(outputParameters) = 0;
+  }
+  else {
+    if (CkpvAccess(outputParameters))
+      CkpvAccess(eventsPool).dump();
+  }
+}
+
+extern "C"
+void startTraceBigSim(){
+
+  CkAssert(CkpvAccess(insideTraceBracket) == false);
+  CkpvAccess(insideTraceBracket) = true;
+
+#if SPLIT_APART_CYCLE_ACCURATE
+  SimParameters *simParams = Node::Object()->simParameters;
+  if(simParams->bgSplitNumProcs != -1 && simParams->bgSplitMyProc!=-1){
+       (bgTraceCounter) ++;
+       if( ((bgTraceCounter) % simParams->bgSplitNumProcs) == simParams->bgSplitMyProc){
+         // Do slow mambo simulation for this case!
+         //CkPrintf("TRACEBIGSIM: Doing cycle accurate simulation for interesting event #%lu\n", (bgTraceCounter) );
+         start_time = begin(); // for MAMBO
+       }
+  }
+#endif  
+
+
+#ifdef BIGSIM_PAPI
+
+       for(int i=0;i<NUM_PAPI_EVENTS;i++)
+               values[i] = 0;
+
+       events[0] = PAPI_FP_OPS;
+       events[1] = PAPI_TOT_INS;
+       events[2] = PAPI_L1_ICM;
+       events[3] = PAPI_L2_TCM;
+       events[4] = PAPI_L3_TCM;
+       events[5] = PAPI_TLB_TL;
+       events[6] = PAPI_LD_INS;
+       events[7] = PAPI_SR_INS; // store instructions
+       events[8] = PAPI_RES_STL; // resource stalls
+
+/* Other available events:
+                                       PAPI_BR_INS,
+                                        PAPI_BR_MSP,
+                                        PAPI_FP_INS,
+                                        PAPI_TOT_INS,
+                                        PAPI_TOT_IIS,
+                                        PAPI_L1_DCM,
+                                        PAPI_L1_LDM,
+                                        PAPI_L2_TCM,
+                                        PAPI_L3_LDM,
+                                        PAPI_RES_STL,
+                                        PAPI_LD_INS,
+                                        PAPI_TLB_TL  
+*/
+
+       CkAssert(PAPI_start_counters(events, NUM_PAPI_EVENTS) == PAPI_OK);
+
+#endif
+
+
+#ifdef CMK_BLUEGENE_CHARM
+  BgMark("startTraceBigSim %f\n");
+#endif
+
+#if WITH_MAMBO
+  //   startTime = CmiWallTimer();
+  start_time = begin(); // for MAMBO
+#else
+  CkpvAccess(start_time) = CmiWallTimer();
+#endif
+  
+}
+  
+
+extern "C"
+void endTraceBigSim_20param(char * eventname, int stepno, int num_params, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 , double p14 , double p15 , double p16 , double p17 , double p18 , double p19 , double p20 ) {
+
+#if WITH_MAMBO
+    end_time=end();
+        //     double endTime = CmiWallTimer();
+#else
+    CkpvAccess(end_time) = CmiWallTimer();
+#endif
+
+    CkAssert(CkpvAccess(insideTraceBracket) == true);
+    CkpvAccess(insideTraceBracket) = false;
+
+    char perfCountString[1024]; 
+    perfCountString[0] = 0; 
+       char params[2048];
+
+if(num_params==0) sprintf(params, "");
+if(num_params==1) sprintf(params, "%f", p1);
+if(num_params==2) sprintf(params, "%f %f", p1, p2);
+if(num_params==3) sprintf(params, "%f %f %f", p1, p2, p3);
+if(num_params==4) sprintf(params, "%f %f %f %f", p1, p2, p3, p4);
+if(num_params==5) sprintf(params, "%f %f %f %f %f", p1, p2, p3, p4, p5);
+if(num_params==6) sprintf(params, "%f %f %f %f %f %f", p1, p2, p3, p4, p5, p6);
+if(num_params==7) sprintf(params, "%f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7);
+if(num_params==8) sprintf(params, "%f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8);
+if(num_params==9) sprintf(params, "%f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9);
+if(num_params==10) sprintf(params, "%f %f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
+if(num_params==11) sprintf(params, "%f %f %f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11);
+if(num_params==12) sprintf(params, "%f %f %f %f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12);
+if(num_params==13) sprintf(params, "%f %f %f %f %f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13);
+if(num_params==14) sprintf(params, "%f %f %f %f %f %f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14);
+if(num_params==15) sprintf(params, "%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15);
+if(num_params==16) sprintf(params, "%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16);
+if(num_params==17) sprintf(params, "%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17);
+if(num_params==18) sprintf(params, "%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18);
+if(num_params==19) sprintf(params, "%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19);
+if(num_params==20) sprintf(params, "%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20);
+
+       char paramString[2048];
+       sprintf(paramString, "params:{ %s }", params);
+       
+       char eventNameString[1024];
+       sprintf(eventNameString, "event:{ %s }", eventname);
+#ifdef BIGSIM_PAPI
+        CkAssert(PAPI_stop_counters(values, NUM_PAPI_EVENTS) == PAPI_OK); 
+
+        sprintf(perfCountString, " PAPI:{ " ); 
+
+       for(int i=0;i<NUM_PAPI_EVENTS;i++){
+               sprintf(perfCountString+strlen(perfCountString), " %lld ", values[i] );
+       }
+
+
+        printf("value=%lld\n", values[0]);
+
+        sprintf(perfCountString+strlen(perfCountString), " }");
+       
+#endif
+
+  char timeString[512];
+  timeString[0] = 0;
+  char stepString[128];
+  stepString[0] = 0;
+  sprintf(stepString, "step:{ %d }", stepno);
+
+#if ! CMK_BLUEGENE_CHARM
+#if WITH_MAMBO
+  //  sprintf(timeString, "time:{ %f }", endTime-startTime);
+  sprintf(timeString, "time_in_cycles:{ %llu }",  end_time-start_time); 
+#endif
+#endif
+
+  if (CkpvAccess(bgfp) == NULL) {
+  if (CkpvAccess(outputParameters)) {
+  double t = CkpvAccess(end_time)-CkpvAccess(start_time);
+if (t<0.0) {
+    CmiPrintf("time: %f\n", t);
+    t = 0.0;
+}
+  CmiAssert(t >= 0.0);
+
+  sprintf(timeString, "time_in_us:{ %lf } %s %s %s\n",  t*1e6, eventNameString, stepString, paramString);
+  CkpvAccess(eventsPool).insert(timeString);
+  }
+  }
+
+
+#if SPLIT_APART_CYCLE_ACCURATE
+  SimParameters *simParams = Node::Object()->simParameters;
+         if(simParams->bgSplitNumProcs != -1 && simParams->bgSplitMyProc!=-1){
+       if( ((bgTraceCounter) % simParams->bgSplitNumProcs) == simParams->bgSplitMyProc){
+         // Do slow mambo simulation for this case!
+         // Counter is incremented only in startTraceBigSim()
+       }
+  }
+#endif
+
+  char sequenceString[128];
+  sequenceString[0] = 0;
+
+#ifdef CMK_BLUEGENE_CHARM
+  BgMark("endTraceBigSim %f\n");
+  if (CkpvAccess(bgfp) != NULL) {
+  // write event ID
+  int seqno = tTIMELINEREC.length()-1;
+  if (seqno<0) CkAbort("Traces are not generated. Please run emulation with +bglog");
+  fprintf(CkpvAccess(bgfp),"%d ",seqno);
+  sprintf(sequenceString, "seqno:{ %d } ",seqno);
+//  fprintf(CkpvAccess(bgfp),"%s\n",params);
+  fprintf(CkpvAccess(bgfp), "TRACEBIGSIM: %s %s %s %s %s %s\n", eventNameString, stepString, sequenceString, timeString, perfCountString, paramString);
+  }
+#else
+/*
+//  printf("TRACEBIGSIM: %s %s %s %s %s\n", eventNameString, sequenceString, timeString, perfCountString, paramString);
+  if (CkpvAccess(bgfp) != NULL) {
+  fprintf(CkpvAccess(bgfp), "TRACEBIGSIM: %s %s %s %s %s\n", eventNameString, sequenceString, timeString, perfCountString, paramString);
+  }
+*/
+#endif
+
+
+}
+
+
+
+
+
+/** 
+       startTraceBigSim() begins tracing an event with a specified set of parameters. These are convenience
+       aliases so that a user can easily add/remove parameters while testing their application.
+       Up to 20 parameters can be specified. These just call through to startTraceBigSim_20param().
+*/
+void endTraceBigSim( char * eventName, int stepno ){endTraceBigSim_20param( eventName, stepno, 0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
+void endTraceBigSim( char * eventName , int stepno, double p1 ){endTraceBigSim_20param( eventName, stepno, 1 , p1 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 ){endTraceBigSim_20param( eventName, stepno, 2 , p1 , p2 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 ){endTraceBigSim_20param( eventName, stepno, 3 , p1 , p2 , p3 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 ){endTraceBigSim_20param( eventName, stepno, 4 , p1 , p2 , p3 , p4 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 ){endTraceBigSim_20param( eventName, stepno, 5 , p1 , p2 , p3 , p4 , p5 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 ){endTraceBigSim_20param( eventName, stepno, 6 , p1 , p2 , p3 , p4 , p5 , p6 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 ){endTraceBigSim_20param( eventName, stepno, 7 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 ){endTraceBigSim_20param( eventName, stepno, 8 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 ){endTraceBigSim_20param( eventName, stepno, 9 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 ){endTraceBigSim_20param( eventName, stepno, 10 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 ){endTraceBigSim_20param( eventName, stepno, 11 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , p11 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 ){endTraceBigSim_20param( eventName, stepno, 12 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , p11 , p12 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 ){endTraceBigSim_20param( eventName, stepno, 13 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , p11 , p12 , p13 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 , double p14 ){endTraceBigSim_20param( eventName, stepno, 14 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , p11 , p12 , p13 , p14 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 , double p14 , double p15 ){endTraceBigSim_20param( eventName, stepno, 15 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , p11 , p12 , p13 , p14 , p15 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 , double p14 , double p15 , double p16 ){endTraceBigSim_20param( eventName, stepno, 16 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , p11 , p12 , p13 , p14 , p15 , p16 , 0.0 , 0.0 , 0.0 , 0.0 );}
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 , double p14 , double p15 , double p16 , double p17 ){endTraceBigSim_20param( eventName, stepno, 17 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , p11 , p12 , p13 , p14 , p15 , p16 , p17 , 0.0 , 0.0 , 0.0 );}
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 , double p14 , double p15 , double p16 , double p17 , double p18 ){endTraceBigSim_20param( eventName, stepno, 18 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , p11 , p12 , p13 , p14 , p15 , p16 , p17 , p18 , 0.0 , 0.0 );}
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 , double p14 , double p15 , double p16 , double p17 , double p18 , double p19 ){endTraceBigSim_20param( eventName, stepno, 19 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , p11 , p12 , p13 , p14 , p15 , p16 , p17 , p18 , p19 , 0.0 );}
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 , double p14 , double p15 , double p16 , double p17 , double p18 , double p19 , double p20 ){endTraceBigSim_20param( eventName, stepno, 20 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , p11 , p12 , p13 , p14 , p15 , p16 , p17 , p18 , p19 , p20 );}
diff --git a/src/ck-core/cktiming.h b/src/ck-core/cktiming.h
new file mode 100644 (file)
index 0000000..d0b9779
--- /dev/null
@@ -0,0 +1,52 @@
+
+// CMK_BLUEGENE_CHARM is used during the emulation phase, 
+// where you genereate the bgTrace logs and the parameter files
+
+#ifdef CMK_BLUEGENE_CHARM
+#include "blue.h"
+#include "blue_impl.h"
+#endif
+
+
+//CkpvExtern(FILE *, bgfp);
+
+extern unsigned long bgTraceCounter;
+//extern bool insideTraceBracket;
+
+extern "C" {
+
+// Just some function declarations:
+void initBigSimTrace(int outputParams);
+void finalizeBigSimTrace();
+void startTraceBigSim();
+
+}
+
+/** 
+       startTraceBigSim() begins tracing an event with a specified set of parameters. These are convenience
+       aliases so that a user can easily add/remove parameters while testing their application.
+       Up to 20 parameters can be specified. These just call through to startTraceBigSim_20param().
+*/
+//void endTraceBigSim( char * eventName );
+void endTraceBigSim( char * eventName , int stepno, double p1 );
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 );
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 );
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 );
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 );
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 );
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 );
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 );
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 );
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 );
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 );
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 );
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 );
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 , double p14 );
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 , double p14 , double p15 );
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 , double p14 , double p15 , double p16 );
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 , double p14 , double p15 , double p16 , double p17 );
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 , double p14 , double p15 , double p16 , double p17 , double p18 );
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 , double p14 , double p15 , double p16 , double p17 , double p18 , double p19 );
+void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 , double p14 , double p15 , double p16 , double p17 , double p18 , double p19 , double p20 );
+
+
index ee31def9499813bb1e295327fc9de546c662f9c7..236f06b94c6c93dd6aa492acfb10351cdda0ca57 100644 (file)
 //#include "queueing.h"
 #include <unistd.h>
 
+#if CMK_BLUEGENE_CHARM
+#include "blue_impl.h"
+#endif
 
-/** Specify if we are replaying the processor from message logs, thus disable delivering of messages */
-int _replaySystem = 0;
-
-#undef ConverseDeliver
-int ConverseDeliver() {
-  return !_replaySystem;
-}
 
-#if CMK_CCS_AVAILABLE && !defined(_WIN32)
+#if CMK_CHARMDEBUG && CMK_CCS_AVAILABLE && !defined(_WIN32)
 
 #include "ck.h"
 
-CkVec<DebugEntryInfo> _debugEntryTable;
+CkpvDeclare(int, skipBreakpoint); /* This is a counter of how many breakpoints we should skip */
+CkpvDeclare(DebugEntryTable, _debugEntryTable);
 CpdPersistentChecker persistentCheckerUselessClass;
 
 void CpdFinishInitialization() {
-#ifndef CMK_OPTIMIZE
-  _debugEntryTable.resize(_entryTable.size());
-#endif
+  CkpvInitialize(int, skipBreakpoint);
+  CkpvAccess(skipBreakpoint) = 0;
+  CkpvInitialize(DebugEntryTable, _debugEntryTable);
+  CkpvAccess(_debugEntryTable).resize(_entryTable.size());
 }
 
 extern "C" void resetAllCRC();
@@ -76,12 +74,12 @@ void CpdBeforeEp(int ep, void *obj, void *msg) {
     else entry.msg = NULL;
     _debugData.push(entry);
     setMemoryStatus(entry.alreadyUserCode);
-    //if (_debugEntryTable[ep].isBreakpoint) printf("CpdBeforeEp breakpointed %d\n",ep);
+    //if (CkpvAccess(_debugEntryTable)[ep].isBreakpoint) printf("CpdBeforeEp breakpointed %d\n",ep);
     memoryBackup = &_debugData.peek().memoryBackup;
     if (!_entryTable[ep]->inCharm) {
       CpdResetMemory();
     }
-    CkVec<DebugPersistentCheck> &preExecutes = _debugEntryTable[ep].preProcess;
+    CkVec<DebugPersistentCheck> &preExecutes = CkpvAccess(_debugEntryTable)[ep].preProcess;
     for (int i=0; i<preExecutes.size(); ++i) {
       preExecutes[i].object->cpdCheck(preExecutes[i].msg);
     }
@@ -94,7 +92,7 @@ void CpdAfterEp(int ep) {
 #ifndef CMK_OPTIMIZE
   if (CpvAccess(cmiArgDebugFlag)) {
     DebugRecursiveEntry entry = _debugData.peek();
-    CkVec<DebugPersistentCheck> &postExecutes = _debugEntryTable[ep].postProcess;
+    CkVec<DebugPersistentCheck> &postExecutes = CkpvAccess(_debugEntryTable)[ep].postProcess;
     for (int i=0; i<postExecutes.size(); ++i) {
       postExecutes[i].object->cpdCheck(postExecutes[i].msg);
     }
@@ -362,8 +360,7 @@ void hostInfo(void *itemIter, pup_er pp, CpdListItemsRequest *req) {
 }
 
 /************ Message CPD Lists ****************/
-CpvCExtern(void *,debugQueue);
-CpvCExtern(int, skipBreakpoint);
+CkpvExtern(void *,debugQueue);
 
 // Interpret data in a message in a user-friendly way.
 //  Ignores most of the envelope fields used by CkPupMessage,
@@ -429,7 +426,13 @@ void CpdPupMessage(PUP::er &p, void *msg)
   p.synchronize(PUP::sync_end_object);
 }
 
-CpvStaticDeclare(void *, lastBreakPointMsg);
+struct ConditionalList {
+  int count;
+  int msgs[1];
+};
+CkpvStaticDeclare(void *, lastBreakPointMsg);
+CpvExtern(void*, conditionalQueue);
+ConditionalList * conditionalShm = NULL;
 
 //Cpd Lists for local and scheduler queues
 class CpdList_localQ : public CpdListAccessor {
@@ -438,20 +441,33 @@ public:
   CpdList_localQ() {}
   virtual const char * getPath(void) const {return "converse/localqueue";}
   virtual size_t getLength(void) const {
-    int x = CdsFifo_Length((CdsFifo)(CpvAccess(debugQueue)));
+    int x = CdsFifo_Length((CdsFifo)(CkpvAccess(debugQueue)));
     //CmiPrintf("*******Returning fifo length %d*********\n", x);
     //return CdsFifo_Length((CdsFifo)(CpvAccess(CmiLocalQueue)));
-    if (CpvAccess(lastBreakPointMsg) != NULL) x++;
+    if (CkpvAccess(lastBreakPointMsg) != NULL) x++;
     return x;
   }
   virtual void pup(PUP::er &p, CpdListItemsRequest &req) {
-    int length = CdsFifo_Length((CdsFifo)(CpvAccess(debugQueue)));
-    void ** messages = CdsFifo_Enumerate(CpvAccess(debugQueue));
+    int length;
+    void ** messages;
     int curObj=0;
+    void *msg;
 
-    if (CpvAccess(lastBreakPointMsg) != NULL) {
+    length = CdsFifo_Length((CdsFifo)(CpvAccess(conditionalQueue)));
+    messages = CdsFifo_Enumerate(CpvAccess(conditionalQueue));
+    for (curObj=-length; curObj<0; curObj++) {
+      void *msg = messages[length+curObj];
+      pupSingleMessage(p, curObj-1, msg);
+    }
+    delete[] messages;
+    
+    curObj = 0;
+    length = CdsFifo_Length((CdsFifo)(CkpvAccess(debugQueue)));
+    messages = CdsFifo_Enumerate(CkpvAccess(debugQueue));
+    
+    if (CkpvAccess(lastBreakPointMsg) != NULL) {
       beginItem(p, -1);
-      envelope *env=(envelope *)UsrToEnv(CpvAccess(lastBreakPointMsg));
+      envelope *env=(envelope *)UsrToEnv(CkpvAccess(lastBreakPointMsg));
       p.comment("name");
       char *type=(char*)"Breakpoint";
       p(type,strlen(type));
@@ -465,32 +481,41 @@ public:
     for(curObj=req.lo; curObj<req.hi; curObj++)
       if ((curObj>=0) && (curObj<length))
       {
-        beginItem(p,curObj);
         void *msg=messages[curObj]; /* converse message */
-        int isCharm=0;
-        const char *type="Converse";
-        p.comment("name");
-        char name[128];
-        if (CmiGetHandler(msg)==_charmHandlerIdx) {isCharm=1; type="Local Charm";}
-        if (CmiGetXHandler(msg)==_charmHandlerIdx) {isCharm=1; type="Network Charm";}
-        sprintf(name,"%s %d: %s (%d)","Message",curObj,type,CmiGetHandler(msg));
-        p(name, strlen(name));
-
-        if (isCharm)
-        { /* charm message */
-          p.comment("charmMsg");
-          p.synchronize(PUP::sync_begin_object);
-          envelope *env=(envelope *)msg;
-          CkUnpackMessage(&env);
-          messages[curObj]=env;
-          CpdPupMessage(p, EnvToUsr(env));
-          //CkPupMessage(p, &messages[curObj], 0);
-          p.synchronize(PUP::sync_end_object);
-        }
+        pupSingleMessage(p, curObj, msg);
       }
     delete[] messages;
 
   }
+
+  void pupSingleMessage(PUP::er &p, int curObj, void *msg) {
+    beginItem(p,curObj);
+    int isCharm=0;
+    const char *type="Converse";
+    p.comment("name");
+    char name[128];
+#if ! CMK_BLUEGENE_CHARM
+    if (CmiGetHandler(msg)==_charmHandlerIdx) {isCharm=1; type="Local Charm";}
+    if (CmiGetXHandler(msg)==_charmHandlerIdx) {isCharm=1; type="Network Charm";}
+#else
+    isCharm=1; type="BG";
+#endif
+    if (curObj < 0) type="Conditional";
+    sprintf(name,"%s %d: %s (%d)","Message",curObj,type,CmiGetHandler(msg));
+    p(name, strlen(name));
+
+    if (isCharm)
+    { /* charm message */
+      p.comment("charmMsg");
+      p.synchronize(PUP::sync_begin_object);
+      envelope *env=(envelope *)msg;
+      CkUnpackMessage(&env);
+      //messages[curObj]=env;
+      CpdPupMessage(p, EnvToUsr(env));
+      //CkPupMessage(p, &messages[curObj], 0);
+      p.synchronize(PUP::sync_end_object);
+    }
+  }
 };
 
 class CpdList_message : public CpdListAccessor {
@@ -513,6 +538,142 @@ class CpdList_message : public CpdListAccessor {
   }
 };
 
+static void CpdDeliverMessageInt(int msgNum) {
+  void *m;
+  void *debugQ=CkpvAccess(debugQueue);
+  CdsFifo_Enqueue(debugQ, (void*)(-1)); // Enqueue a guard
+  for (int i=0; i<msgNum; ++i) CdsFifo_Enqueue(debugQ, CdsFifo_Dequeue(debugQ));
+  CkpvAccess(skipBreakpoint) = 1;
+  char *queuedMsg = (char *)CdsFifo_Dequeue(debugQ);
+  if (_conditionalDelivery==1) conditionalShm->msgs[conditionalShm->count++] = msgNum;
+  if (_conditionalDelivery) {
+    CmiReference(queuedMsg);
+    CdsFifo_Enqueue(CpvAccess(conditionalQueue), queuedMsg);
+  }  
+#if CMK_BLUEGENE_CHARM
+  stopVTimer();
+  BgProcessMessageDefault(cta(threadinfo), queuedMsg);
+  startVTimer();
+#else
+  CmiHandleMessage(queuedMsg);
+#endif
+  CkpvAccess(skipBreakpoint) = 0;
+  while ((m=CdsFifo_Dequeue(debugQ)) != (void*)(-1)) CdsFifo_Enqueue(debugQ, m);  
+}
+
+void CpdDeliverMessage(char * msg) {
+  int msgNum;
+  sscanf(msg+CmiMsgHeaderSizeBytes, "%d", &msgNum);
+  //CmiPrintf("received deliver request %d\n",msgNum);
+  CpdDeliverMessageInt(msgNum);
+}
+
+void *CpdGetNextMessageConditional(CsdSchedulerState_t*) {
+  int len;
+  read(conditionalPipe[0], &len, 4);
+  void *msg = CmiAlloc(len);
+  read(conditionalPipe[0], msg, len);
+  return msg;
+}
+
+#include <sys/wait.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+
+extern "C" void CpdDeliverSingleMessage ();
+
+static pid_t CpdConditional_SetupComm() {
+  int pipefd[2][2];
+  pipe(pipefd[0]); // parent to child
+  pipe(pipefd[1]); // child to parent
+  
+  if (conditionalShm == NULL) {
+    struct shmid_ds dummy;
+    int shmemid = shmget(IPC_PRIVATE, 1024*1024, IPC_CREAT | 0666);
+    conditionalShm = (ConditionalList*)shmat(shmemid, NULL, 0);
+    conditionalShm->count = 0;
+    shmctl(shmemid, IPC_RMID, &dummy);
+  }
+  
+  pid_t pid = fork();
+  if (pid > 0) {
+    int bytes;
+    CmiPrintf("parent %d\n",pid);
+    close(pipefd[0][0]);
+    close(pipefd[1][1]);
+    conditionalPipe[0] = pipefd[1][0];
+    conditionalPipe[1] = pipefd[0][1];
+    //CpdConditionalDeliveryScheduler(pipefd[1][0], pipefd[0][1]);
+    read(conditionalPipe[0], &bytes, 4);
+    char *buf = (char*)malloc(bytes);
+    read(conditionalPipe[0], buf, bytes);
+    CcsSendReply(bytes,buf);
+    free(buf);
+    return pid;
+  }
+
+  //int volatile tmp=1;
+  //while (tmp);
+  printf("child\n");
+  _conditionalDelivery = 1;
+  close(pipefd[0][1]);
+  close(pipefd[1][0]);
+  conditionalPipe[0] = pipefd[0][0];
+  conditionalPipe[1] = pipefd[1][1];
+  CpdGetNextMessage = CpdGetNextMessageConditional;
+  return 0;
+}
+
+void CpdEndConditionalDelivery(char *msg) {
+  int msgNum;
+  void *m;
+  sscanf(msg+CmiMsgHeaderSizeBytes, "%d", &msgNum);
+  printf("%d messages:\n",conditionalShm->count);
+  for (int i=0; i<conditionalShm->count; ++i)
+    printf("message delivered %d\n",conditionalShm->msgs[i]);
+  conditionalShm->count = msgNum;
+  shmdt((char*)conditionalShm);
+  _exit(0);
+}
+
+extern "C" void CpdEndConditionalDeliver_master() {
+  close(conditionalPipe[0]);
+  conditionalPipe[0] = 0;
+  close(conditionalPipe[1]);
+  conditionalPipe[1] = 0;
+  wait(NULL);
+  if (conditionalShm->count == 0) {
+    CcsSendReply(0,NULL);
+    shmdt((char*)conditionalShm);
+    conditionalShm = NULL;
+  } else {
+    if (CpdConditional_SetupComm()==0) {
+      // We are in the child, deliver again the messages
+      _conditionalDelivery = 2;
+      printf("new child: redelivering %d messages\n",conditionalShm->count);
+      for (int i=0; i<conditionalShm->count; ++i) {
+        int msgNum = conditionalShm->msgs[i];
+        if (msgNum == -1) CpdDeliverSingleMessage();
+        else CpdDeliverMessageInt(msgNum);
+      }
+      _conditionalDelivery = 1;
+      CcsSendReply(0, NULL);
+    }
+  }
+}
+
+void CpdDeliverMessageConditionally(char * msg) {
+  int msgNum;
+  void *m;
+  sscanf(msg+CmiMsgHeaderSizeBytes, "%d", &msgNum);
+  //CmiPrintf("received deliver request %d\n",msgNum);
+
+  if (CpdConditional_SetupComm()==0) {
+    if (msgNum == -1) CpdDeliverSingleMessage();
+    else CpdDeliverMessageInt(msgNum);
+  }
+}
+
 class CpdList_msgStack : public CpdListAccessor {
   virtual const char * getPath(void) const {return "charm/messageStack";}
   virtual size_t getLength(void) const {
@@ -535,7 +696,6 @@ class CpdList_msgStack : public CpdListAccessor {
 
 typedef CkHashtableTslow<int,EntryInfo *> CpdBpFuncTable_t;
 
-
 extern void CpdFreeze(void);
 extern void CpdUnFreeze(void);
 extern int  CpdIsFrozen(void);
@@ -546,28 +706,26 @@ CpvStaticDeclare(int, _debugChare);
 CpvStaticDeclare(CpdBpFuncTable_t *, breakPointEntryTable);
 
 //CpvStaticDeclare(void *, lastBreakPointMsg);
-CpvStaticDeclare(void *, lastBreakPointObject);
-CpvStaticDeclare(int, lastBreakPointIndex);
+CkpvStaticDeclare(void *, lastBreakPointObject);
+CkpvStaticDeclare(int, lastBreakPointIndex);
 
 void CpdBreakPointInit()
 {
-  CpvInitialize(void *, lastBreakPointMsg);
-  CpvInitialize(void *, lastBreakPointObject);
-  CpvInitialize(int, lastBreakPointIndex);
+  CkpvInitialize(void *, lastBreakPointMsg);
+  CkpvInitialize(void *, lastBreakPointObject);
+  CkpvInitialize(int, lastBreakPointIndex);
   CpvInitialize(int, _debugMsg);
   CpvInitialize(int, _debugChare);
   CpvInitialize(CpdBpFuncTable_t *, breakPointEntryTable);
-  CpvAccess(lastBreakPointMsg) = NULL;
-  CpvAccess(lastBreakPointObject) = NULL;
-  CpvAccess(lastBreakPointIndex) = 0;
+  CkpvAccess(lastBreakPointMsg) = NULL;
+  CkpvAccess(lastBreakPointObject) = NULL;
+  CkpvAccess(lastBreakPointIndex) = 0;
   CpvAccess(_debugMsg) = CkRegisterMsg("debug_msg",0,0,0,0);
   CpvAccess(_debugChare) = CkRegisterChare("debug_Chare",0,TypeChare);
   CkRegisterChareInCharm(CpvAccess(_debugChare));
   CpvAccess(breakPointEntryTable) = new CpdBpFuncTable_t(10,0.5,CkHashFunction_int,CkHashCompare_int );
 }
 
-
-
 static void _call_freeze_on_break_point(void * msg, void * object)
 {
       //Save breakpoint entry point index. This is retrieved from msg.
@@ -575,18 +733,21 @@ static void _call_freeze_on_break_point(void * msg, void * object)
       //of break point function entries, on continue.
 
   // If the counter "skipBreakpoint" is not zero we actually do not freeze and deliver the regular message
-  if (CpvAccess(skipBreakpoint) > 0) {
-    EntryInfo * breakPointEntryInfo = CpvAccess(breakPointEntryTable)->get(CkMessageToEpIdx(msg));
+  EntryInfo * breakPointEntryInfo = CpvAccess(breakPointEntryTable)->get(CkMessageToEpIdx(msg));
+  if (CkpvAccess(skipBreakpoint) > 0 || CkpvAccess(_debugEntryTable)[CkMessageToEpIdx(msg)].isBreakpoint==CmiFalse) {
     CkAssert(breakPointEntryInfo != NULL);
     breakPointEntryInfo->call(msg, object);
-    CpvAccess(skipBreakpoint) --;
+    if (CkpvAccess(skipBreakpoint) > 0) CkpvAccess(skipBreakpoint) --;
   } else {
-      CpvAccess(lastBreakPointMsg) = msg;
-      CpvAccess(lastBreakPointObject) = object;
-      CpvAccess(lastBreakPointIndex) = CkMessageToEpIdx(msg);
-      EntryInfo * breakPointEntryInfo = CpvAccess(breakPointEntryTable)->get(CpvAccess(lastBreakPointIndex));
+      CkpvAccess(lastBreakPointMsg) = msg;
+      CkpvAccess(lastBreakPointObject) = object;
+      CkpvAccess(lastBreakPointIndex) = CkMessageToEpIdx(msg);
       CpdNotify(CPD_BREAKPOINT,breakPointEntryInfo->name);
       CpdFreeze();
+#if CMK_BLUEGENE_CHARM
+      stopVTimer();
+      ((workThreadInfo*)cta(threadinfo))->scheduler(-1);
+#endif
   }
 }
 
@@ -594,21 +755,41 @@ static void _call_freeze_on_break_point(void * msg, void * object)
 extern "C"
 void CpdDeliverSingleMessage () {
   if (!CpdIsFrozen()) return; /* Do something only if we are in freeze mode */
-  if ( (CpvAccess(lastBreakPointMsg) != NULL) && (CpvAccess(lastBreakPointObject) != NULL) ) {
-    EntryInfo * breakPointEntryInfo = CpvAccess(breakPointEntryTable)->get(CpvAccess(lastBreakPointIndex));
+  if ( (CkpvAccess(lastBreakPointMsg) != NULL) && (CkpvAccess(lastBreakPointObject) != NULL) ) {
+    EntryInfo * breakPointEntryInfo = CpvAccess(breakPointEntryTable)->get(CkpvAccess(lastBreakPointIndex));
     if (breakPointEntryInfo != NULL) {
-      breakPointEntryInfo->call(CpvAccess(lastBreakPointMsg), CpvAccess(lastBreakPointObject));
+      if (_conditionalDelivery) {
+        if (_conditionalDelivery==1) conditionalShm->msgs[conditionalShm->count++] = -1;
+        void *env = UsrToEnv(CkpvAccess(lastBreakPointMsg));
+        CmiReference(env);
+        CdsFifo_Enqueue(CpvAccess(conditionalQueue),env);
+      }
+      breakPointEntryInfo->call(CkpvAccess(lastBreakPointMsg), CkpvAccess(lastBreakPointObject));
     }
-    CpvAccess(lastBreakPointMsg) = NULL;
-    CpvAccess(lastBreakPointObject) = NULL;
+    CkpvAccess(lastBreakPointMsg) = NULL;
+    CkpvAccess(lastBreakPointObject) = NULL;
+#if CMK_BLUEGENE_CHARM
+    ((workThreadInfo*)cta(threadinfo))->stopScheduler();
+#endif
   }
   else {
     // we were not stopped at a breakpoint, then deliver the first message in the debug queue
-    if (!CdsFifo_Empty(CpvAccess(debugQueue))) {
-      CpvAccess(skipBreakpoint) = 1;
-      char *queuedMsg = (char *)CdsFifo_Dequeue(CpvAccess(debugQueue));
+    if (!CdsFifo_Empty(CkpvAccess(debugQueue))) {
+      CkpvAccess(skipBreakpoint) = 1;
+      char *queuedMsg = (char *)CdsFifo_Dequeue(CkpvAccess(debugQueue));
+      if (_conditionalDelivery) {
+        if (_conditionalDelivery==1) conditionalShm->msgs[conditionalShm->count++] = 0;
+        CmiReference(queuedMsg);
+        CdsFifo_Enqueue(CpvAccess(conditionalQueue),queuedMsg);
+      }
+#if CMK_BLUEGENE_CHARM
+      stopVTimer();
+      BgProcessMessageDefault(cta(threadinfo), queuedMsg);
+      startVTimer();
+#else
       CmiHandleMessage(queuedMsg);
-      CpvAccess(skipBreakpoint) = 0;
+#endif
+      CkpvAccess(skipBreakpoint) = 0;
     }
   }
 }
@@ -618,18 +799,21 @@ extern "C"
 void CpdContinueFromBreakPoint ()
 {
     CpdUnFreeze();
-    if ( (CpvAccess(lastBreakPointMsg) != NULL) && (CpvAccess(lastBreakPointObject) != NULL) )
+    if ( (CkpvAccess(lastBreakPointMsg) != NULL) && (CkpvAccess(lastBreakPointObject) != NULL) )
     {
-        EntryInfo * breakPointEntryInfo = CpvAccess(breakPointEntryTable)->get(CpvAccess(lastBreakPointIndex));
+        EntryInfo * breakPointEntryInfo = CpvAccess(breakPointEntryTable)->get(CkpvAccess(lastBreakPointIndex));
         if (breakPointEntryInfo != NULL) {
-           breakPointEntryInfo->call(CpvAccess(lastBreakPointMsg), CpvAccess(lastBreakPointObject));
+           breakPointEntryInfo->call(CkpvAccess(lastBreakPointMsg), CkpvAccess(lastBreakPointObject));
+#if CMK_BLUEGENE_CHARM
+           ((workThreadInfo*)cta(threadinfo))->stopScheduler();
+#endif
         } else {
           // This means that the breakpoint got deleted in the meanwhile
           
         }
     }
-    CpvAccess(lastBreakPointMsg) = NULL;
-    CpvAccess(lastBreakPointObject) = NULL;
+    CkpvAccess(lastBreakPointMsg) = NULL;
+    CkpvAccess(lastBreakPointObject) = NULL;
 }
 
 //ccs handler to set a breakpoint with entry function name msg
@@ -638,37 +822,30 @@ void CpdSetBreakPoint (char *msg)
   char functionName[128];
   int tableSize, tableIdx = 0;
   int reply = 0;
-  sscanf(msg+CmiMsgHeaderSizeBytes, "%s", functionName);
+  sscanf(msg+CmiReservedHeaderSize, "%s", functionName);
   if (strlen(functionName) > 0)
   {
     tableSize = _entryTable.size();
     // Replace entry in entry table with _call_freeze_on_break_point
-    // retrieve epIdx for entry method
-    //for (tableIdx=0; tableIdx < tableSize; tableIdx++)
-    //{
-       //if (strstr(_entryTable[tableIdx]->name, functionName) != NULL)
-       //{
     tableIdx = atoi(functionName);
     if (tableIdx >= 0 && tableIdx < tableSize) {
            EntryInfo * breakPointEntryInfo = (EntryInfo *)CpvAccess(breakPointEntryTable)->get(tableIdx);
-           delete breakPointEntryInfo;
-           breakPointEntryInfo = new EntryInfo(_entryTable[tableIdx]->name, _entryTable[tableIdx]->call, _entryTable[tableIdx]->msgIdx, _entryTable[tableIdx]->chareIdx );
-           //CmiPrintf("Breakpoint is set for function %s with an epIdx = %ld\n", _entryTable[tableIdx]->name, tableIdx);
-           CpvAccess(breakPointEntryTable)->put(tableIdx) = breakPointEntryInfo;
-           _entryTable[tableIdx]->name = "debug_breakpoint_ep";
-           _entryTable[tableIdx]->call = (CkCallFnPtr)_call_freeze_on_break_point;
-           //_entryTable[tableIdx]->msgIdx = CpvAccess(_debugMsg);
-           //_entryTable[tableIdx]->chareIdx = CpvAccess(_debugChare);
-           //_debugEntryTable[tableIdx].isBreakpoint = CmiTrue;
-           //break;
+           if (breakPointEntryInfo == 0) {
+             breakPointEntryInfo = new EntryInfo(_entryTable[tableIdx]->name, _entryTable[tableIdx]->call, 1, 0 );
+             //CmiPrintf("Breakpoint is set for function %s with an epIdx = %ld\n", _entryTable[tableIdx]->name, tableIdx);
+             CpvAccess(breakPointEntryTable)->put(tableIdx) = breakPointEntryInfo;
+             _entryTable[tableIdx]->name = "debug_breakpoint_ep";
+             _entryTable[tableIdx]->call = (CkCallFnPtr)_call_freeze_on_break_point;
+           } else {
+             breakPointEntryInfo->msgIdx ++;
+             //CkAssert(breakPointEntryInfo->name == _entryTable[tableIdx]->name);
+             //CkAssert(breakPointEntryInfo->call == _entryTable[tableIdx]->call);
+             //CkAssert(breakPointEntryInfo->msgIdx == _entryTable[tableIdx]->msgIdx);
+             //CkAssert(breakPointEntryInfo->chareIdx == _entryTable[tableIdx]->chareIdx);
+           }
+           CkpvAccess(_debugEntryTable)[tableIdx].isBreakpoint = CmiTrue;
            reply = ~0;
-           //}
     }
-    //if (tableIdx == tableSize)
-    //{
-    //  CmiPrintf("[ERROR]Entrypoint was not found for function %s\n", functionName);
-    //  return;
-    //}
 
   }
   CcsSendReply(sizeof(int), (void*)&reply);
@@ -685,27 +862,21 @@ void CpdRemoveBreakPoint (char *msg)
 {
   char functionName[128];
   int reply = 0;
-  sscanf(msg+CmiMsgHeaderSizeBytes, "%s", functionName);
+  sscanf(msg+CmiReservedHeaderSize, "%s", functionName);
   if (strlen(functionName) > 0) {
     int idx = atoi(functionName);
     if (idx >= 0 && idx < _entryTable.size()) {
-      //CmiPrintf("[ERROR]Entrypoint was not found for function %s\n", functionName);
-      //void *objPointer;
-      //void *keyPointer;
-      //CkHashtableIterator *it = CpvAccess(breakPointEntryTable)->iterator();
-      //while(NULL!=(objPointer = it->next(&keyPointer)))
-      //{
-      //EntryInfo * breakPointEntryInfo = *(EntryInfo **)objPointer;
       EntryInfo * breakPointEntryInfo = CpvAccess(breakPointEntryTable)->get(idx);
       if (breakPointEntryInfo != NULL) {
-        _entryTable[idx]->name =  breakPointEntryInfo->name;
-        _entryTable[idx]->call = (CkCallFnPtr)breakPointEntryInfo->call;
-        _entryTable[idx]->msgIdx = breakPointEntryInfo->msgIdx;
-        _entryTable[idx]->chareIdx = breakPointEntryInfo->chareIdx;
+        if (--breakPointEntryInfo->msgIdx == 0) {
+          // If we are the last to delete the breakpoint, then restore the original name and call function pointer
+          _entryTable[idx]->name =  breakPointEntryInfo->name;
+          _entryTable[idx]->call = (CkCallFnPtr)breakPointEntryInfo->call;
+        }
         reply = ~0 ;
-        //_debugEntryTable[idx].isBreakpoint = CmiFalse;
+        CkpvAccess(_debugEntryTable)[idx].isBreakpoint = CmiFalse;
         //CmiPrintf("Breakpoint is removed for function %s with epIdx %ld\n", _entryTable[idx]->name, idx);
-        //CpvAccess(breakPointEntryTable)->remove(idx);
+        //CkpvAccess(breakPointEntryTable)->remove(idx);
       }
     }
   }
@@ -723,10 +894,12 @@ void CpdRemoveAllBreakPoints ()
   {
     EntryInfo * breakPointEntryInfo = *(EntryInfo **)objPointer;
     int idx = *(int *)keyPointer;
-    _entryTable[idx]->name =  breakPointEntryInfo->name;
-    _entryTable[idx]->call = (CkCallFnPtr)breakPointEntryInfo->call;
-    _entryTable[idx]->msgIdx = breakPointEntryInfo->msgIdx;
-    _entryTable[idx]->chareIdx = breakPointEntryInfo->chareIdx;
+    if (--breakPointEntryInfo->msgIdx == 0) {
+      // If we are the last to delete the breakpoint, then restore the original name and call function pointer
+      _entryTable[idx]->name =  breakPointEntryInfo->name;
+      _entryTable[idx]->call = (CkCallFnPtr)breakPointEntryInfo->call;
+    }
+    CkpvAccess(_debugEntryTable)[idx].isBreakpoint = CmiFalse;
   }
   CcsSendReply(sizeof(int), (void*)&reply);
 }
@@ -738,7 +911,22 @@ extern "C" int CpdIsCharmDebugMessage(void *msg) {
          env->getMsgtype() == FillVidMsg || _entryTable[env->getEpIdx()]->inCharm;
 }
 
-
+#if CMK_BLUEGENE_CHARM
+CpvExtern(int, _bgCcsHandlerIdx);
+extern "C" int CpdIsBgCharmDebugMessage(void *msg) {
+  envelope *env = (envelope*)msg;
+  if (CmiBgMsgFlag(msg) == BG_CLONE) {
+    env=*(envelope**)(((char*)msg)+CmiBlueGeneMsgHeaderSizeBytes);
+  }
+  if  ((((CmiBlueGeneMsgHeader*)env)->hID) == CpvAccess(_bgCcsHandlerIdx)) return 1;
+    // make sure it indeed is a charm message
+  if (CmiBgMsgHandle(env) == _charmHandlerIdx) {
+    return env->getMsgtype() == ForVidMsg || env->getMsgtype() == FillVidMsg ||
+         _entryTable[env->getEpIdx()]->inCharm;
+  }
+  return 1;
+}
+#endif
 
 CpvExtern(char *, displayArgument);
 
@@ -802,7 +990,7 @@ void CpdCharmInit()
   //CpdListRegister(new CpdListAccessor_c("converse/memory/leak",cpd_memory_length,0,cpd_memory_leak,0));
   CpdListRegister(new CpdListAccessor_c("converse/memory/data",cpd_memory_getLength,0,cpd_memory_get,0,false));
 
-  CpdBreakPointInit();
+  //CpdBreakPointInit();
   CcsRegisterHandler("ccs_set_break_point",(CmiHandler)CpdSetBreakPoint);
   CcsSetMergeFn("ccs_set_break_point",CcsMerge_logical_and);
   CcsRegisterHandler("ccs_remove_break_point",(CmiHandler)CpdRemoveBreakPoint);
@@ -815,25 +1003,68 @@ void CpdCharmInit()
   CcsRegisterHandler("ccs_debug_startgdb",(CmiHandler)CpdStartGdb);
   CpdListRegister(new CpdListAccessor_c("hostinfo",hostInfoLength,0,hostInfo,0));
   CpdListRegister(new CpdList_localQ());
+  CcsRegisterHandler("deliverMessage",(CmiHandler)CpdDeliverMessage);
+  CcsRegisterHandler("deliverConditional",(CmiHandler)CpdDeliverMessageConditionally);
+  CcsRegisterHandler("endConditional",(CmiHandler)CpdEndConditionalDelivery);
   CpdListRegister(new CpdList_arrayElementNames());
   CpdListRegister(new CpdList_arrayElements());
   CpdListRegister(new CpdList_objectNames());
   CpdListRegister(new CpdList_object());
   CpdListRegister(new CpdList_message());
   CpdListRegister(new CpdList_msgStack());
+  CpdGetNextMessage = CsdNextMessage;
   CpdIsDebugMessage = CpdIsCharmDebugMessage;
+#if CMK_BLUEGENE_CHARM
+  CpdIsDebugMessage = CpdIsBgCharmDebugMessage;
+#endif
 }
 
+#if CMK_BLUEGENE_CHARM
+CpvExtern(int, _bgCcsHandlerIdx);
+CpvExtern(int, _bgCcsAck);
+extern "C" void req_fw_handler(char*);
+CkpvExtern(void *, debugQueue);
+CkpvExtern(int, freezeModeFlag);
+#include "blue_impl.h"
+extern void BgProcessMessageFreezeMode(threadInfo *, char *);
+
+void CpdBgInit()
+{
+        // Register the BG handler for CCS. Notice that this is put into a variable shared by
+        // the whole real processor. This because converse needs to find it. We check that all
+        // virtual processors register the same index for this handler.
+        int bgCcsHandlerIdx = CkRegisterHandler((CmiHandler)req_fw_handler);
+        if (CpvAccess(_bgCcsHandlerIdx) == 0) CpvAccess(_bgCcsHandlerIdx) = bgCcsHandlerIdx;
+        CkAssert(CpvAccess(_bgCcsHandlerIdx)==bgCcsHandlerIdx);
+        CpvAccess(_bgCcsAck) ++;
+        CcsReleaseMessages();
+        
+        CkpvInitialize(int, freezeModeFlag);
+        CkpvAccess(freezeModeFlag) = 0;
+
+        CkpvInitialize(void *, debugQueue);
+        CkpvAccess(debugQueue) = CdsFifo_Create();
+        
+        BgProcessMessage = BgProcessMessageFreezeMode;
+}
+#endif
+
 #else
 
+void CpdBreakPointInit() {}
 void CpdCharmInit() {}
+#if CMK_BLUEGENE_CHARM
+void CpdBgInit() {}
+#endif
 
 void CpdFinishInitialization() {}
 
 void *CpdGetCurrentObject() {return NULL;}
 void *CpdGetCurrentMsg() {return NULL;}
+extern "C" void CpdEndConditionalDeliver_master() {}
 
 void CpdBeforeEp(int ep, void *obj, void *msg) {}
 void CpdAfterEp(int ep) {}
 
 #endif /*CMK_CCS_AVAILABLE*/
+
index a893767bd2c8fbe02234ee091b0dbe251de261ac..e63803b27d0e8be56ff1181bab6186a3194fe57c 100644 (file)
@@ -14,6 +14,9 @@
 #include "pup.h"
 #include "cklists.h"
 
+#define CHARMDEBUG_MAJOR   10
+#define CHARMDEBUG_MINOR    3
+
 void *CpdGetCurrentObject();
 void *CpdGetCurrentMsg();
 
@@ -48,7 +51,7 @@ public:
   DebugEntryInfo() : isBreakpoint(CmiFalse) { }
 };
 
-extern CkVec<DebugEntryInfo> _debugEntryTable;
+typedef CkVec<DebugEntryInfo> DebugEntryTable;
 
 //These pup functions are useful in CpdLists, as they document the name
 //  of the variable.  Your object must be named "c" (a stupid hack).
index 6a545005a196bd6f08a2ed9aa6913b0d1cf0a1aa..3771e5855afe4c49893e7be4140e0d0d340735b1 100644 (file)
@@ -96,7 +96,19 @@ void envelope::pup(PUP::er &p) {
        //puping converse hdr hopefully not go beyond boundry
        p((char *)core,convHeaderSize);
        p(ref);
-       p((char *)&attribs,sizeof(attribs));
+       //p((char *)&attribs,sizeof(attribs));
+       p(attribs.msgIdx);
+        p(attribs.mtype);
+        int d;
+        if (!p.isUnpacking()) d = attribs.queueing;
+        p|d;
+        if (p.isUnpacking()) attribs.queueing = d;
+        if (!p.isUnpacking()) d = attribs.isPacked;
+        p|d;
+        if (p.isUnpacking()) attribs.isPacked = d;
+        if (!p.isUnpacking()) d = attribs.isUsed;
+        p|d;
+        if (p.isUnpacking()) attribs.isUsed = d; 
        p(epIdx);
        p(pe);
        p(event);
index 44094ea9c73b2d65ea203c23a6656f1968db43cf..0041f805ba6b806dc988bf9bf8a894f885239646 100644 (file)
@@ -15,7 +15,7 @@
 #define CkIntbits (sizeof(int)*8)
 #endif
 
-#ifndef CMK_OPTIMIZE
+#if CMK_ERROR_CHECKING
 #define _SET_USED(env, x) (env)->setUsed((x))
 #define _CHECK_USED(env) do { if(env->isUsed()) \
                            CmiAbort("Message being re-sent. Aborting...\n"); \
@@ -214,10 +214,10 @@ private:
     void   setQueueing(const UChar q) { attribs.queueing=q; }
     UChar  getMsgtype(void) const { return attribs.mtype; }
     void   setMsgtype(const UChar m) { attribs.mtype = m; }
-#ifndef CMK_OPTIMIZE
+#if CMK_ERROR_CHECKING
     UChar  isUsed(void) { return attribs.isUsed; }
     void   setUsed(const UChar u) { attribs.isUsed=u; }
-#else /* CMK_OPTIMIZE */
+#else /* CMK_ERROR_CHECKING */
     inline void setUsed(const UChar u) {}
 #endif
     UChar  getMsgIdx(void) const { return attribs.msgIdx; }
@@ -241,8 +241,10 @@ private:
             CkMsgAlignLength(size)+
            sizeof(int)*CkPriobitsToInts(prio);
       register envelope *env = (envelope *)CmiAlloc(tsize);
-#ifndef CMK_OPTIMIZE
+#if CMK_REPLAYSYSTEM
+      //for record-replay
       memset(env, 0, sizeof(envelope));
+      env->setEvent(++CkpvAccess(envelopeEventID));
 #endif
       env->setMsgtype(type);
       env->totalsize = tsize;
@@ -250,8 +252,6 @@ private:
       env->setPacked(0);
       env->type.group.dep.setZero();
       _SET_USED(env, 0);
-      //for record-replay
-      env->setEvent(++CkpvAccess(envelopeEventID));
       env->setRef(0);
 
 #ifdef USE_CRITICAL_PATH_HEADER_ARRAY
@@ -379,6 +379,10 @@ inline void _resetEnv(envelope *env) {
   env->reset();
 }
 
+inline void setEventID(envelope *env){
+  env->setEvent(++CkpvAccess(envelopeEventID));
+}
+
 /** @} */
 
 extern UChar   _defaultQueueing;
index b1349cf137e778ab4b770b07cf46ab6217b6ed69..e09563a560d14d0eb578856dd1cde94568fdfba2 100644 (file)
@@ -682,7 +682,7 @@ static void _initHandler(void *msg, CkCoreState *ck)
   register envelope *env = (envelope *) msg;
   
   if (ck->watcher!=NULL) {
-    if (!ck->watcher->processMessage(env,ck)) return;
+    if (!ck->watcher->processMessage(&env,ck)) return;
   }
   
   switch (env->getMsgtype()) {
@@ -808,6 +808,7 @@ extern void init_memcheckpt(char **argv);
 extern "C" void initCharmProjections();
 extern "C" void CmiInitCPUTopology(char **argv);
 extern "C" void CmiInitCPUAffinity(char **argv);
+extern "C" void CmiInitMemAffinity(char **argv);
 
 void _registerInitCall(CkInitCallFn fn, int isNodeCall)
 {
@@ -853,6 +854,11 @@ extern "C" void initQd(char **argv)
         }
 }
 
+#if CMK_BLUEGENE_CHARM && CMK_CHARMDEBUG
+void CpdBgInit();
+#endif
+void CpdBreakPointInit();
+
 /**
   This is the main charm setup routine.  It's called
   on all processors after Converse initialization.
@@ -1027,6 +1033,13 @@ void _initCharm(int unused_argc, char **argv)
                
                _registerPathHistory();
 
+               /**
+                 CkRegisterMainModule is generated by the (unique)
+                 "mainmodule" .ci file.  It will include calls to 
+                 register all the .ci files.
+               */
+               CkRegisterMainModule();
+
                /**
                  _registerExternalModules is actually generated by 
                  charmc at link time (as "moduleinit<pid>.C").  
@@ -1039,26 +1052,19 @@ void _initCharm(int unused_argc, char **argv)
                */
                _registerExternalModules(argv);
                
-               /**
-                 CkRegisterMainModule is generated by the (unique)
-                 "mainmodule" .ci file.  It will include calls to 
-                 register all the .ci files.
-               */
-               CkRegisterMainModule();
                _registerDone();
        }
+       /* The following will happen on every virtual processor in BigEmulator, not just on once per real processor */
+       if (CkMyRank() == 0) {
+         CpdBreakPointInit();
+       }
        CmiNodeAllBarrier();
 
     // Execute the initcalls registered in modules
        _initCallTable.enumerateInitCalls();
 
 #ifndef CMK_OPTIMIZE
-#ifdef __BLUEGENE__
-        if(BgNodeRank()==0)
-#else
-        if(CkMyRank()==0)
-#endif
-          CpdFinishInitialization();
+       CpdFinishInitialization();
 #endif
 
        //CmiNodeAllBarrier();
@@ -1127,12 +1133,20 @@ void _initCharm(int unused_argc, char **argv)
         if (faultFunc == NULL) {         // this is not restart
             // these two are blocking calls for non-bigsim
 #if ! CMK_BLUEGENE_CHARM
-          CmiInitCPUAffinity(argv);
+         CmiInitCPUAffinity(argv);
+          CmiInitMemAffinity(argv);
 #endif
         }
         CmiInitCPUTopology(argv);
     }
 
+#if CMK_BLUEGENE_CHARM && CMK_CHARMDEBUG
+      // Register the BG handler for CCS. Notice that this is put into a variable shared by
+      // the whole real processor. This because converse needs to find it. We check that all
+      // virtual processors register the same index for this handler.
+    CpdBgInit();
+#endif
+
        if (faultFunc) {
                if (CkMyPe()==0) _allStats = new Stats*[CkNumPes()];
                if (!inCommThread) {
@@ -1218,7 +1232,8 @@ void _initCharm(int unused_argc, char **argv)
                                         CkpvAccess(_coreState));
         }
 
-#if CMK_CCS_AVAILABLE
+#if CMK_CHARMDEBUG
+        // Should not use CpdFreeze inside a thread (since this processor is really a user-level thread)
        if (CpvAccess(cpdSuspendStartup))
        { 
           //CmiPrintf("In Parallel Debugging mode .....\n");
index da3d0f36b4ad364bd518e73c6d38eca4152468ea..120626d2cb192dbc7074cf984faee64a398ce1ba 100644 (file)
@@ -154,6 +154,8 @@ static inline void CksdScheduler(int ret) { BgScheduler(ret); }
 static inline void CksdExitScheduler() { BgExitScheduler(); }
 static inline void CkDeliverMsgs(int nmsg)     { BgDeliverMsgs(nmsg); }
 
+void CkReduce(void *msg, int size, CmiReduceMergeFn mergeFn);
+
 }  /* end of namespace */
 
 #endif
@@ -178,7 +180,8 @@ static inline void CkDeliverMsgs(int nmsg)  { BgDeliverMsgs(nmsg); }
 #define CmiMultipleSend                        BgMultipleSend
 
 #undef CsdEnqueueLifo
-#define CsdEnqueueLifo(m)  CmiSyncSendAndFree(CkMyPe(),((envelope*)m)->getTotalsize(), (char*)(m));
+//#define CsdEnqueueLifo(m)  CmiSyncSendAndFree(CkMyPe(),((envelope*)m)->getTotalsize(), (char*)(m));
+#define CsdEnqueueLifo(m)              BgEnqueue((char*)m)
 
 #undef CmiNodeAllBarrier
 #define CmiNodeAllBarrier()
index 8a47bbb09de3009842fe47a1b83fc2965e65ed02..f3d85f2b3f359914cc45c57fc67c9f9381762481 100644 (file)
@@ -17,6 +17,8 @@
 #define CksvInitialize            CsvInitialize
 #define CksvAccess        CsvAccess
 
+#define CkReduce    CmiReduce
+
 #undef CkMyPe
 #undef CkNumPes
 
 #define CkVTimer(x)          0
 #define CkElapse(x)   
 
-#if CMK_REPLAYSYSTEM
-int ConverseDeliver();
+#if CMK_CHARMDEBUG
+extern "C" int ConverseDeliver(int pe);
 #else
-#define ConverseDeliver()   1
+#define ConverseDeliver(pe)   1
 #endif
 
 #if ! CMK_NAMESPACES_BROKEN
@@ -57,43 +59,43 @@ static inline int CkNumPes() { return CmiNumPes(); }
 
 static inline void CmiSyncSend(int x, int y, char *z) 
 {
-  if (ConverseDeliver()) CmiSyncSendFn(x, y, z);
+  if (ConverseDeliver(x)) CmiSyncSendFn(x, y, z);
 }
 static inline void CmiSyncSendAndFree(int x, int y, char *z)
 {
-  if (ConverseDeliver()) CmiFreeSendFn(x, y, z);
+  if (ConverseDeliver(x)) CmiFreeSendFn(x, y, z);
 }
 static inline void CmiSyncBroadcast(int x, char *y)
 {
-  if (ConverseDeliver()) CmiSyncBroadcastFn(x, y);
+  if (ConverseDeliver(x)) CmiSyncBroadcastFn(x, y);
 }
 static inline void CmiSyncBroadcastAndFree(int x, char *y)
 {
-  if (ConverseDeliver()) CmiFreeBroadcastFn(x, y);
+  if (ConverseDeliver(x)) CmiFreeBroadcastFn(x, y);
 }
 static inline void CmiSyncBroadcastAll(int x, char *y)
 {
-  if (ConverseDeliver()) CmiSyncBroadcastAllFn(x, y);
+  if (ConverseDeliver(x)) CmiSyncBroadcastAllFn(x, y);
 }
 static inline void CmiSyncBroadcastAllAndFree(int x, char *y)
 {
-  if (ConverseDeliver()) CmiFreeBroadcastAllFn(x, y);
+  if (ConverseDeliver(x)) CmiFreeBroadcastAllFn(x, y);
 }
 static inline void CmiSyncListSend(int x, int *y, int w, char *z)
 {
-  if (ConverseDeliver()) CmiSyncListSendFn(x, y, w, z);
+  if (ConverseDeliver(-1)) CmiSyncListSendFn(x, y, w, z);
 }
 static inline void CmiSyncListSendAndFree(int x, int *y, int w, char *z)
 {
-  if (ConverseDeliver()) CmiFreeListSendFn(x, y, w, z);
+  if (ConverseDeliver(-1)) CmiFreeListSendFn(x, y, w, z);
 }
 static inline void CmiSyncMulticast(CmiGroup x, int y, char *z)
 {
-  if (ConverseDeliver()) CmiSyncMulticastFn(x, y, z);
+  if (ConverseDeliver(-1)) CmiSyncMulticastFn(x, y, z);
 }
 static inline void CmiSyncMulticastAndFree(CmiGroup x, int y, char *z)
 {
-  if (ConverseDeliver()) CmiFreeMulticastFn(x, y, z);
+  if (ConverseDeliver(-1)) CmiFreeMulticastFn(x, y, z);
 }
 
 #if 0
index 353cebd765d86471eef007801c5346bb80146895..d16381d27241bf27d69615302d883f043cc8dcff 100644 (file)
@@ -203,6 +203,7 @@ extern void CpdCharmInit(void);
 
 void _registerDone(void)
 {
+#if CMK_CHARMDEBUG
   CpdListRegister(new CpdSimpleListAccessor("charm/entries",_entryTable.size(),pupEntry));
   CpdListRegister(new CpdSimpleListAccessor("charm/messages",_msgTable.size(),pupMsg));
   CpdListRegister(new CpdSimpleListAccessor("charm/chares",_chareTable.size(),pupChare));
@@ -210,7 +211,6 @@ void _registerDone(void)
   CpdListRegister(new CpdSimpleListAccessor("charm/readonly",_readonlyTable.size(),pupReadonly));
   CpdListRegister(new CpdSimpleListAccessor("charm/readonlyMsg",_readonlyMsgs.size(),pupReadonlyMsg));
 
-#if CMK_CCS_AVAILABLE
   CpdCharmInit();
 #endif
 }
index 975d8370b96487837c4706502353244216444c9d..40d6141ac92db87e3a1d40a2e087c6d310cc98d2 100644 (file)
 #include "trace-projections.h"
 #include <pathHistory.h>
 #include "cp_effects.h"
-
+#include <iostream>
+#include <math.h>
 #include <climits>
+
+#define roundDouble(x)        ((long)(x+0.5))
+
+
 //  A framework for tuning "control points" exposed by an application. Tuning decisions are based upon observed performance measurements.
  
 
@@ -51,7 +56,7 @@ std::map<std::string, int> defaultControlPointValues;
 
 
 
-typedef enum tuningSchemeEnum {RandomSelection, SimulatedAnnealing, ExhaustiveSearch, CriticalPathAutoPrioritization, UseBestKnownTiming, UseSteering, MemoryAware, Simplex, DivideAndConquer, AlwaysDefaults}  tuningScheme;
+typedef enum tuningSchemeEnum {RandomSelection, SimulatedAnnealing, ExhaustiveSearch, CriticalPathAutoPrioritization, UseBestKnownTiming, UseSteering, MemoryAware, Simplex, DivideAndConquer, AlwaysDefaults, LDBPeriod, LDBPeriodLinear, LDBPeriodQuadratic, LDBPeriodOptimal}  tuningScheme;
 
 
 
@@ -87,6 +92,18 @@ void printTuningScheme(){
   case DivideAndConquer:
     CkPrintf("Tuning Scheme: Divide & Conquer Algorithm\n");
     break;
+  case LDBPeriod:
+    CkPrintf("Tuning Scheme: Load Balancing Period Steering (Constant Prediction)\n");
+    break;
+  case LDBPeriodLinear:
+    CkPrintf("Tuning Scheme: Load Balancing Period Steering (Linear Prediction)\n");
+    break;
+  case LDBPeriodQuadratic:
+    CkPrintf("Tuning Scheme: Load Balancing Period Steering (Quadratic Prediction)\n");
+    break;
+  case LDBPeriodOptimal:
+    CkPrintf("Tuning Scheme: Load Balancing Period Steering (Optimal Prediction)\n");
+    break;
   default:
     CkPrintf("Unknown tuning scheme\n");
     break;
@@ -171,7 +188,6 @@ CkReductionMsg *allMeasuresReduction(int nMsg,CkReductionMsg **msgs){
 /// If different seed, name, and random_seed values are provided, the returned values are pseudo-random
 unsigned int randInt(unsigned int num, const char* name, int seed=0){
   CkAssert(num > 0);
-  CkAssert(num < 1000);
 
   unsigned long hash = 0;
   unsigned int c;
@@ -366,6 +382,12 @@ controlPointManager::controlPointManager() {
     haveControlPointChangeCallback = true;
   }
 
+
+/// A user can specify that the framework should advance the phases automatically. Useful for gather performance measurements without modifying a program.
+void controlPointManager::setFrameworkAdvancePhase(bool _frameworkShouldAdvancePhase){
+  frameworkShouldAdvancePhase = _frameworkShouldAdvancePhase;
+}
+
   /// Called periodically by the runtime to handle the control points
   /// Currently called on each PE
   void controlPointManager::processControlPoints(){
@@ -744,7 +766,7 @@ controlPointManager::controlPointManager() {
       prevPhase->idleTime.avg = r[1]/CkNumPes();
       prevPhase->idleTime.max = r[2];
       prevPhase->idleTime.print();
-      CkPrintf("Stored idle time min=%lf in prevPhase=%p\n", prevPhase->idleTime.min, prevPhase);
+      CkPrintf("Stored idle time min=%lf avg=%lf max=%lf in prevPhase=%p\n", prevPhase->idleTime.min, prevPhase->idleTime.avg, prevPhase->idleTime.max, prevPhase);
     } else {
       CkPrintf("There is no previous phase to store the idle time measurements\n");
     }
@@ -831,7 +853,7 @@ controlPointManager::controlPointManager() {
       
       prevPhase->memoryUsageMB = mem[0];
       
-      CkPrintf("Stored idle time min=%lf, mem=%lf in prevPhase=%p\n", (double)prevPhase->idleTime.min, (double)prevPhase->memoryUsageMB, prevPhase);
+      CkPrintf("Stored idle time min=%lf avg=%lf max=%lf  mem=%lf in prevPhase=%p\n", (double)prevPhase->idleTime.min, prevPhase->idleTime.avg, prevPhase->idleTime.max, (double)prevPhase->memoryUsageMB, prevPhase);
 
       double bytesPerInvoke2 = msgBytes[2] / msgBytes[0];
       double bytesPerInvoke3 = msgBytes[3] / msgBytes[1];
@@ -997,6 +1019,11 @@ void gotoNextPhase(){
   controlPointManagerProxy.ckLocalBranch()->gotoNextPhase();
 }
 
+FDECL void FTN_NAME(GOTONEXTPHASE,gotonextphase)()
+{
+  gotoNextPhase();
+}
+
 
 /// A mainchare that is used just to create our controlPointManager group at startup
 class controlPointMain : public CBase_controlPointMain {
@@ -1017,8 +1044,8 @@ public:
     double period;
     bool haveSamplePeriod = CmiGetArgDoubleDesc(args->argv,"+CPSamplePeriod", &period,"The time between Control Point Framework samples (in seconds)");
     if(haveSamplePeriod){
-      CkPrintf("controlPointSamplePeriod = %ld sec\n", period);
-      controlPointSamplePeriod =  period * 1000; /**< A readonly */
+      CkPrintf("controlPointSamplePeriod = %lf sec\n", period);
+      controlPointSamplePeriod =  (int)(period * 1000); /**< A readonly */
     } else {
       controlPointSamplePeriod =  DEFAULT_CONTROL_POINT_SAMPLE_PERIOD;
     }
@@ -1048,6 +1075,14 @@ public:
       whichTuningScheme = Simplex;
     } else if ( CmiGetArgFlagDesc(args->argv,"+CPDivideConquer", "A divide and conquer program specific steering scheme") ){
       whichTuningScheme = DivideAndConquer;
+    } else if ( CmiGetArgFlagDesc(args->argv,"+CPLDBPeriod", "Adjust the load balancing period (Constant Predictor)") ){
+      whichTuningScheme = LDBPeriod;
+    } else if ( CmiGetArgFlagDesc(args->argv,"+CPLDBPeriodLinear", "Adjust the load balancing period (Linear Predictor)") ){
+      whichTuningScheme = LDBPeriodLinear;
+    } else if ( CmiGetArgFlagDesc(args->argv,"+CPLDBPeriodQuadratic", "Adjust the load balancing period (Quadratic Predictor)") ){
+      whichTuningScheme = LDBPeriodQuadratic;
+    } else if ( CmiGetArgFlagDesc(args->argv,"+CPLDBPeriodOptimal", "Adjust the load balancing period (Optimal Predictor)") ){
+      whichTuningScheme = LDBPeriodOptimal;
     }
 
     char *defValStr = NULL;
@@ -1130,6 +1165,14 @@ void registerCPChangeCallback(CkCallback cb, bool frameworkShouldAdvancePhase){
   controlPointManagerProxy.ckLocalBranch()->setCPCallback(cb, frameworkShouldAdvancePhase);
 }
 
+/// An interface callable by the application.
+void setFrameworkAdvancePhase(bool frameworkShouldAdvancePhase){
+  if(CkMyPe() == 0){
+    CkPrintf("Application has specified that framework should %sadvance phase\n", frameworkShouldAdvancePhase?"":"not ");
+    controlPointManagerProxy.ckLocalBranch()->setFrameworkAdvancePhase(frameworkShouldAdvancePhase);
+  }
+}
+
 /// An interface callable by the application.
 void registerControlPointTiming(double time){
   CkAssert(CkMyPe() == 0);
@@ -1154,6 +1197,20 @@ void controlPointTimingStamp() {
   controlPointManagerProxy.ckLocalBranch()->setTiming(duration);
 }
 
+FDECL void FTN_NAME(CONTROLPOINTTIMINGSTAMP,controlpointtimingstamp)()
+{
+  controlPointTimingStamp();
+}
+
+
+FDECL void FTN_NAME(SETFRAMEWORKADVANCEPHASEF,setframeworkadvancephasef)(CMK_TYPEDEF_INT4 *value) 
+{
+  setFrameworkAdvancePhase(*value);
+}
+
+
+
+
 /// Shutdown the control point framework, writing data to disk if necessary
 extern "C" void controlPointShutdown(){
   if(CkMyPe() == 0){
@@ -1314,6 +1371,364 @@ void controlPointManager::generatePlan() {
        newControlPoints[name] =  best->controlPoints[name];
       }
     }
+  } else if( whichTuningScheme == LDBPeriod) {
+    // Assume this is used in this manner:
+    //  1) go to next phase
+    //  2) request control point
+    //  3) load balancing
+    //  4) computation
+    
+    
+    instrumentedPhase *twoAgoPhase = twoAgoPhaseData();
+    instrumentedPhase *prevPhase = previousPhaseData();
+    
+    
+    const std::vector<double> &times = twoAgoPhase->times;
+    const int oldNumTimings = times.size();
+
+
+    const std::vector<double> &timesNew = prevPhase->times;
+    const int newNumTimings = timesNew.size();
+
+
+    if(oldNumTimings > 4 && newNumTimings > 4){
+      
+      // Build model of execution time based on two phases ago
+      // Compute the average times for each 1/3 of the steps, except for the 2 first steps where load balancing occurs
+      
+      double oldSum = 0;
+      
+      for(int i=2; i<oldNumTimings; i++){
+       oldSum += times[i];
+      }
+      
+      const double oldAvg = oldSum / (oldNumTimings-2);
+      
+      
+      
+      
+      // Computed as an integral from 0.5 to the number of bins of the same size as two ago phase + 0.5
+      const double expectedTotalTime = oldAvg * newNumTimings;
+      
+      
+      // Measure actual time
+      double newSum = 0.0;
+      for(int i=2; i<newNumTimings; ++i){
+       newSum += timesNew[i];
+      }
+      
+      const double newAvg = newSum / (newNumTimings-2);
+      const double newTotalTimeExcludingLBSteps = newAvg * ((double)newNumTimings); // excluding the load balancing abnormal steps
+      
+      const double benefit = expectedTotalTime - newTotalTimeExcludingLBSteps;
+      
+      // Determine load balance cost
+      const double lbcost = timesNew[0] + timesNew[1] - 2.0*newAvg;
+      
+      const double benefitAfterLB = benefit - lbcost;
+    
+    
+      // Determine whether LB cost outweights the estimated benefit
+      CkPrintf("Constant Model: lbcost = %f, expected = %f, actual = %f\n", lbcost, expectedTotalTime, newTotalTimeExcludingLBSteps);
+    
+    
+      std::map<std::string, std::pair<int,int> >::const_iterator cpsIter;
+      for(cpsIter=controlPointSpace.begin(); cpsIter != controlPointSpace.end(); ++cpsIter){
+       const std::string &name = cpsIter->first;
+       const std::pair<int,int> &bounds = cpsIter->second;
+       const int lb = bounds.first;
+       const int ub = bounds.second;
+      
+       if(benefitAfterLB > 0){
+         CkPrintf("Constant Model: Beneficial LB\n");
+         int newval = newControlPoints[name] / 2;
+         if(newval > lb)
+           newControlPoints[name] = newval;
+         else 
+           newControlPoints[name] = lb;
+       } else {
+         CkPrintf("Constant Model: Detrimental LB\n");
+         int newval = newControlPoints[name] * 2;
+         if(newval < ub)
+           newControlPoints[name] = newval;
+         else
+           newControlPoints[name] = ub;
+       }
+      }
+    }
+    
+    
+  }  else if( whichTuningScheme == LDBPeriodLinear) {
+    // Assume this is used in this manner:
+    //  1) go to next phase
+    //  2) request control point
+    //  3) load balancing
+    //  4) computation
+
+
+    instrumentedPhase *twoAgoPhase = twoAgoPhaseData();
+    instrumentedPhase *prevPhase = previousPhaseData();
+    
+    const std::vector<double> &times = twoAgoPhase->times;
+    const int oldNumTimings = times.size();
+
+    const std::vector<double> &timesNew = prevPhase->times;
+    const int newNumTimings = timesNew.size();
+    
+
+    if(oldNumTimings > 4 && newNumTimings > 4){
+
+      // Build model of execution time based on two phases ago
+      // Compute the average times for each 1/3 of the steps, except for the 2 first steps where load balancing occurs
+      const int b1 = 2 + (oldNumTimings-2)/2;
+      double s1 = 0;
+      double s2 = 0;
+    
+      const double ldbStepsTime = times[0] + times[1];
+    
+      for(int i=2; i<b1; i++){
+       s1 += times[i];
+      }
+      for(int i=b1; i<oldNumTimings; i++){
+       s2 += times[i];
+      }
+      
+      
+      // Compute the estimated time for the last phase's data
+    
+      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
+      double sum = 0.0;
+      for(int i=2; i<newNumTimings; ++i){
+       sum += timesNew[i];
+      }
+
+      const double avg = sum / ((double)(newNumTimings-2));
+      const double actualTotalTime = avg * ((double)newNumTimings); // excluding the load balancing abnormal steps
+
+      const double benefit = expectedTotalTime - actualTotalTime;
+
+      // Determine load balance cost
+      const double lbcost = timesNew[0] + timesNew[1] - 2.0*avg;
+
+      const double benefitAfterLB = benefit - lbcost;
+
+    
+      // Determine whether LB cost outweights the estimated benefit
+      CkPrintf("Linear Model: lbcost = %f, expected = %f, actual = %f\n", lbcost, expectedTotalTime, actualTotalTime);
+    
+    
+    
+      std::map<std::string, std::pair<int,int> >::const_iterator cpsIter;
+      for(cpsIter=controlPointSpace.begin(); cpsIter != controlPointSpace.end(); ++cpsIter){
+       const std::string &name = cpsIter->first;
+       const std::pair<int,int> &bounds = cpsIter->second;
+       const int lb = bounds.first;
+       const int ub = bounds.second;
+      
+       if(benefitAfterLB > 0){
+         CkPrintf("Linear Model: Beneficial LB\n");
+         int newval = newControlPoints[name] / 2;
+         if(newval > lb)
+           newControlPoints[name] = newval;
+         else 
+           newControlPoints[name] = lb;
+       } else {
+         CkPrintf("Linear Model: Detrimental LB\n");
+         int newval = newControlPoints[name] * 2;
+         if(newval < ub)
+           newControlPoints[name] = newval;
+         else 
+           newControlPoints[name] = ub;
+       }
+      }
+    }
+
+  }
+
+  else if( whichTuningScheme == LDBPeriodQuadratic) {
+    // Assume this is used in this manner:
+    //  1) go to next phase
+    //  2) request control point
+    //  3) load balancing
+    //  4) computation
+
+
+    instrumentedPhase *twoAgoPhase = twoAgoPhaseData();
+    instrumentedPhase *prevPhase = previousPhaseData();
+        
+    const std::vector<double> &times = twoAgoPhase->times;
+    const int oldNumTimings = times.size();
+
+    const std::vector<double> &timesNew = prevPhase->times;
+    const int newNumTimings = timesNew.size();
+
+    
+    if(oldNumTimings > 4 && newNumTimings > 4){
+
+
+      // Build model of execution time based on two phases ago
+      // Compute the average times for each 1/3 of the steps, except for the 2 first steps where load balancing occurs
+      const int b1 = 2 + (oldNumTimings-2)/3;
+      const int b2 = 2 + (2*(oldNumTimings-2))/3;
+      double s1 = 0;
+      double s2 = 0;
+      double s3 = 0;
+
+      const double ldbStepsTime = times[0] + times[1];
+    
+      for(int i=2; i<b1; i++){
+       s1 += times[i];
+      }
+      for(int i=b1; i<b2; i++){
+       s2 += times[i];
+      }
+      for(int i=b2; i<oldNumTimings; i++){
+       s3 += times[i];
+      }
+
+    
+      // Compute the estimated time for the last phase's data
+    
+      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;
+      const double c = a3;
+    
+      // Computed as an integral from 0.5 to the number of bins of the same size as two ago phase + 0.5
+      const double x1 = (double)newNumTimings / (double)oldNumTimings * 3.0 + 0.5;  // should be 3.5 if ratio is same
+      const double x2 = 0.5;
+      const double expectedTotalTime = a*x1*x1*x1/3.0 + b*x1*x1/2.0 + c*x1 - (a*x2*x2*x2/3.0 + b*x2*x2/2.0 + c*x2);
+   
+    
+      // Measure actual time
+      double sum = 0.0;
+      for(int i=2; i<newNumTimings; ++i){
+       sum += timesNew[i];
+      }
+
+      const double avg = sum / ((double)(newNumTimings-2));
+      const double actualTotalTime = avg * ((double)newNumTimings); // excluding the load balancing abnormal steps
+
+      const double benefit = expectedTotalTime - actualTotalTime;
+
+      // Determine load balance cost
+      const double lbcost = timesNew[0] + timesNew[1] - 2.0*avg;
+
+      const double benefitAfterLB = benefit - lbcost;
+
+    
+      // Determine whether LB cost outweights the estimated benefit
+      CkPrintf("Quadratic Model: lbcost = %f, expected = %f, actual = %f, x1=%f, a1=%f, a2=%f, a3=%f, b1=%d, b2=%d, a=%f, b=%f, c=%f\n", lbcost, expectedTotalTime, actualTotalTime, x1, a1, a2, a3, b1, b2, a, b, c);
+    
+    
+    
+      std::map<std::string, std::pair<int,int> >::const_iterator cpsIter;
+      for(cpsIter=controlPointSpace.begin(); cpsIter != controlPointSpace.end(); ++cpsIter){
+       const std::string &name = cpsIter->first;
+       const std::pair<int,int> &bounds = cpsIter->second;
+       const int lb = bounds.first;
+       const int ub = bounds.second;
+      
+       if(benefitAfterLB > 0){
+         CkPrintf("QuadraticModel: Beneficial LB\n");
+         int newval = newControlPoints[name] / 2;
+         if(newval > lb)
+           newControlPoints[name] = newval;
+         else 
+           newControlPoints[name] = lb;
+       } else {
+         CkPrintf("QuadraticModel: Detrimental LB\n");
+         int newval = newControlPoints[name] * 2;
+         if(newval < ub)
+           newControlPoints[name] = newval;
+         else 
+           newControlPoints[name] = ub;
+       }
+      
+      }
+    }
+    
+
+  }  else if( whichTuningScheme == LDBPeriodOptimal) {
+    // Assume this is used in this manner:
+    //  1) go to next phase
+    //  2) request control point
+    //  3) load balancing
+    //  4) computation
+
+
+
+    instrumentedPhase *prevPhase = previousPhaseData();
+    
+    const std::vector<double> &times = prevPhase->times;
+    const int numTimings = times.size();
+    
+    if( numTimings > 4){
+
+      const int b1 = 2 + (numTimings-2)/2;
+      double s1 = 0;
+      double s2 = 0;
+    
+    
+      for(int i=2; i<b1; i++){
+       s1 += times[i];
+      }
+      for(int i=b1; i<numTimings; i++){
+       s2 += times[i];
+      }
+      
+    
+      const double a1 = s1 / (double)(b1-2);
+      const double a2 = s2 / (double)(numTimings-b1);
+      const double avg = (a1+a1) / 2.0;
+
+      const double m = (a2-a1)/((double)(numTimings-2)/2.0); // An approximation of the slope of the execution times    
+
+      const double ldbStepsTime = times[0] + times[1];
+      const double lbcost = ldbStepsTime - 2.0*avg; // An approximation of the 
+      
+
+      int newval = roundDouble(sqrt(2.0*lbcost/m));
+      
+      // We don't really know what to do if m<=0, so we'll just double the period
+      if(m<=0)
+       newval = 2*numTimings;     
+      
+      CkPrintf("Optimal Model (double when negative): lbcost = %f, m = %f, new ldbperiod should be %d\n", lbcost, m, newval);    
+    
+    
+      std::map<std::string, std::pair<int,int> >::const_iterator cpsIter;
+      for(cpsIter=controlPointSpace.begin(); cpsIter != controlPointSpace.end(); ++cpsIter){
+       // TODO: lookup only control points that are relevant instead of all of them
+       const std::string &name = cpsIter->first;
+       const std::pair<int,int> &bounds = cpsIter->second;
+       const int lb = bounds.first;
+       const int ub = bounds.second;
+       
+       if(newval < lb){
+         newControlPoints[name] = lb;
+       } else if(newval > ub){
+         newControlPoints[name] = ub;
+       } else {
+         newControlPoints[name] = newval;
+       } 
+       
+      }
+      
+      
+    }
+    
 
   } else if ( whichTuningScheme == UseSteering ) {
          // -----------------------------------------------------------
@@ -1524,7 +1939,7 @@ void controlPointManager::generatePlan() {
       
       const int before = bestPhase->controlPoints[name];   
   
-      const int range = (maxValue-minValue+1)*(1.0-progress);
+      const int range = (int)((maxValue-minValue+1)*(1.0-progress));
 
       int high = min(before+range, maxValue);
       int low = max(before-range, minValue);
@@ -1790,6 +2205,11 @@ int controlPoint(const char *name, int lb, int ub){
     
   }
 
+  if(!isInRange(result,ub,lb)){
+    std::cerr << "control point = " << result << " is out of range: " << lb << " " << ub << std::endl;
+    fflush(stdout);
+    fflush(stderr);
+  }
   CkAssert(isInRange(result,ub,lb));
   thisPhaseData->controlPoints[std::string(name)] = result; // was insert() 
 
@@ -1802,6 +2222,12 @@ int controlPoint(const char *name, int lb, int ub){
 }
 
 
+FDECL int FTN_NAME(CONTROLPOINT, controlpoint)(CMK_TYPEDEF_INT4 *lb, CMK_TYPEDEF_INT4 *ub){
+  CkAssert(CkMyPe() == 0);
+  return controlPoint("FortranCP", *lb, *ub);
+}
+
+
 
 
 /// Inform the control point framework that a named control point affects the priorities of some array  
@@ -2002,7 +2428,7 @@ void simplexScheme::adapt(std::map<std::string, std::pair<int,int> > & controlPo
 
                                double val = (cPhaseConfig[v] + best[v])/2.0;
 
-                               newControlPoints[name] = keepInRange(val,lb,ub);
+                               newControlPoints[name] = keepInRange((int)val,lb,ub);
                                CkPrintf("Simplex Tuning: v=%d Reflected worst %d %s -> %f (ought to be %f )\n", (int)v, (int)worstPhase, (char*)name.c_str(), (double)newControlPoints[name], (double)P[v]);
                                v++;
                        }
@@ -2117,7 +2543,7 @@ void simplexScheme::doReflection(std::map<std::string, std::pair<int,int> > & co
                const std::pair<int,int> &bounds = cpsIter->second;
                const int lb = bounds.first;
                const int ub = bounds.second;
-               newControlPoints[name] = keepInRange(P[v],lb,ub);
+               newControlPoints[name] = keepInRange((int)P[v],lb,ub);
                CkPrintf("Simplex Tuning: v=%d Reflected worst %d %s -> %f (ought to be %f )\n", (int)v, (int)worstPhase, (char*)name.c_str(), (double)newControlPoints[name], (double)P[v]);
                v++;
        }
@@ -2161,7 +2587,7 @@ void simplexScheme::doExpansion(std::map<std::string, std::pair<int,int> > & con
                const std::pair<int,int> &bounds = cpsIter->second;
                const int lb = bounds.first;
                const int ub = bounds.second;
-               newControlPoints[name] = keepInRange(P2[v],lb,ub);
+               newControlPoints[name] = keepInRange((int)P2[v],lb,ub);
                CkPrintf("Simplex Tuning: v=%d worstPhase=%d Expanding %s -> %f (ought to be %f )\n", (int)v, (int)worstPhase, (char*)name.c_str(), (double)newControlPoints[name], (double)P[v]);
                v++;
        }
@@ -2202,12 +2628,12 @@ void simplexScheme::doContraction(std::map<std::string, std::pair<int,int> > & c
                const std::pair<int,int> &bounds = cpsIter->second;
                const int lb = bounds.first;
                const int ub = bounds.second;
-               newControlPoints[name] = keepInRange(P2[v],lb,ub);
+               newControlPoints[name] = keepInRange((int)P2[v],lb,ub);
                CkPrintf("Simplex Tuning: v=%d worstPhase=%d Contracting %s -> %f (ought to be %f )\n", (int)v, (int)worstPhase, (char*)name.c_str(), (double)newControlPoints[name], (double)P[v]);
                v++;
        }
-
-
+       
+       
        // Transition to "contracting" state
        simplexState = contracting;
        CkPrintf("Simplex Tuning: Switched to state: contracting\n");
index 4ab96fe86bc02956f72d2d644849628527f3268b..ef1cda9f3297cdc6e303b5975aff92e4acc4bf0a 100644 (file)
@@ -35,6 +35,7 @@
 #include <limits>
 #include <algorithm>
 #include <float.h>
+#include <charm-api.h>
 
 #include "LBDatabase.h"
 #include "arrayRedistributor.h"
 
 void registerCPChangeCallback(CkCallback cb, bool frameworkShouldAdvancePhase);
 
+void setFrameworkAdvancePhase(bool frameworkShouldAdvancePhase);
+
 
 void registerControlPointTiming(double time);
 
 /// Called once each application step. Can be used instead of registerControlPointTiming()
 void controlPointTimingStamp();
-
+FDECL void FTN_NAME(CONTROLPOINTTIMINGSTAMP,controlpointtimingstamp)();
 
 
 /// The application specifies that it is ready to proceed to a new set of control point values.
 /// This should be called after registerControlPointTiming()
 /// This should be called before calling controlPoint()
 void gotoNextPhase();
+FDECL void FTN_NAME(GOTONEXTPHASE,gotonextphase)();
 
 /// Return an integral power of 2 between c1 and c2
 /// The value returned will likely change between subsequent invocations
@@ -84,6 +88,11 @@ int controlPoint2Pow(const char *name, int c1, int c2);
 /// The value returned will likely change between subsequent invocations
 int controlPoint(const char *name, int lb, int ub);
 
+/// A fortran callable one. I couldn't figure out how to pass a string from fortran to C++ yet
+/// So far fortran can only have one control point
+FDECL int FTN_NAME(CONTROLPOINT,controlpoint)(CMK_TYPEDEF_INT4 *lb, CMK_TYPEDEF_INT4 *ub);
+
+
 /// Return an integer from the provided vector of values
 /// The value returned will likely change between subsequent invocations
 int controlPoint(const char *name, std::vector<int>& values);
@@ -753,6 +762,8 @@ public:
   /// User can register a callback that is called when application should advance to next phase
   void setCPCallback(CkCallback cb, bool _frameworkShouldAdvancePhase);
 
+  void setFrameworkAdvancePhase(bool _frameworkShouldAdvancePhase);
+
   /// Called periodically by the runtime to handle the control points
   /// Currently called on each PE
   void processControlPoints();
diff --git a/src/ck-cp/controlPointsf.h b/src/ck-cp/controlPointsf.h
new file mode 100644 (file)
index 0000000..03735f5
--- /dev/null
@@ -0,0 +1,25 @@
+
+              
+interface
+
+subroutine controlPointTimingStamp() 
+end subroutine
+
+subroutine gotoNextPhase()
+end subroutine
+
+
+subroutine  setFrameworkAdvancePhaseF(value)
+     integer*4 value
+end subroutine
+
+
+integer function controlPoint(lb, ub)
+     integer*4 :: lb
+integer*4 :: ub
+end function
+
+
+
+end interface
+
index d9ac54b64cce6141257198cc01ff377aef3afd8d..4996c95139e1aa1aa8c5a17a2a7b679778538c18 100644 (file)
@@ -493,7 +493,7 @@ void TurnManualLBOff()
 #endif
 }
 
-void LBTurnInstrumentOn() { 
+extern "C" void LBTurnInstrumentOn() { 
 #if CMK_LBDB_ON
   if (CkpvAccess(lbdatabaseInited))
     LBDatabase::Object()->CollectStatsOn(); 
@@ -502,7 +502,7 @@ void LBTurnInstrumentOn() {
 #endif
 }
 
-void LBTurnInstrumentOff() { 
+extern "C" void LBTurnInstrumentOff() { 
 #if CMK_LBDB_ON
   if (CkpvAccess(lbdatabaseInited))
     LBDatabase::Object()->CollectStatsOff(); 
index eab4d976481c07f3a9730b95325d7b81a33ff7e7..c32082627f5b1b2ad762b2c4e61add6416c07624 100644 (file)
@@ -383,8 +383,8 @@ void LBChangePredictor(LBPredictorFunction *model);
 
 void LBSetPeriod(double second);
 
-void LBTurnInstrumentOn();
-void LBTurnInstrumentOff();
+extern "C" void LBTurnInstrumentOn();
+extern "C" void LBTurnInstrumentOff();
 void LBClearLoads();
 
 inline LBDatabase* LBDatabaseObj() { return LBDatabase::Object(); }
index 83fcdfedf61115b4746dfc69fb3a83806e9214a6..55bc40a47cc4b3a76a352ab9e69b4961419974bf 100644 (file)
@@ -38,7 +38,7 @@ static void migrationDone(envelope *env, CkCoreState *ck)
   // Since migrationsDone will deal with Charm++ messages,
   // the LB must obey to the CkMessageWatcher orders.
   if (ck->watcher!=NULL) {
-    if (!ck->watcher->processMessage(env,ck)) return;
+    if (!ck->watcher->processMessage(&env,ck)) return;
   }
   
   NullLB *lb = (NullLB*)CkLocalBranch(_theNullLB);
index 5ca338906371c72debfa0bb6edc657969b82c26f..79892f8652a53d7743c031d1744ea542e6505f1d 100644 (file)
@@ -7,19 +7,16 @@
 #include "charm-api.h"
 
 
-FDECL {
+#define flbturninstrumentoff  FTN_NAME(FLBTURNINSTRUMENTOFF, flbturninstrumentoff)
+#define flbturninstrumenton   FTN_NAME(FLBTURNINSTRUMENTON, flbturninstrumenton)
 
-#define flbturninstrumentoff   FTN_NAME(FLBTURNINSTRUMENTATIONOFF, flbturninstrumentationoff)
-#define flbturninstrumenton    FTN_NAME(FLBTURNINSTRUMENTATIONON, flbturninstrumentationon)
-
-void flbturninstrumenton()
+FDECL void flbturninstrumenton()
 {
   LBTurnInstrumentOn();
 }
 
-void flbturninstrumentoff()
+FDECL void flbturninstrumentoff()
 {
   LBTurnInstrumentOff();
 }
 
-}  // FDECL
index ceb089efa837333f741e9329036ffc7339db88a6..c3af75bf92213497d72ff564f6ad8fae685105b4 100644 (file)
@@ -135,11 +135,12 @@ void TraceBluegene::bgAmpiBeginExec(char *msg, char *name, void **logs, int coun
   if (msg) curlog->addMsgBackwardDep(tTIMELINEREC, msg);
 }
 
-void TraceBluegene::bgAmpiSetSize(int size)
+void TraceBluegene::bgAmpiLog(unsigned short op, unsigned int dataSize)
 {
     if (!genTimeLog) return;
     BgTimeLog *curlog = BgLastLog(tTIMELINEREC);
-    curlog->setSize(size);
+    curlog->mpiOp = op;
+    curlog->mpiSize = dataSize;
 }
 
 void TraceBluegene::bgEndExec(int commit)
index 13621da171d04cbaa8d6861ad83c5ab61d86bd21..064fad7c8932e038373b481789148a9db2b8fb80 100644 (file)
@@ -15,8 +15,7 @@
 
 #include "trace.h"
 
-// TraceBluegene is subclass of Trace, 
-// it defines Blue Gene specific tracing subroutines.
+// Bigsim emulator specific tracing subroutines.
 class TraceBluegene : public Trace {
 
  private:
@@ -33,7 +32,7 @@ class TraceBluegene : public Trace {
     void bgDummyBeginExec(const char* name,void** parentLogPtr, int split);
     void bgBeginExec(char* msg, char *str);
     void bgAmpiBeginExec(char *msg, char *str, void **logs, int count);
-    void bgAmpiSetSize(int size);
+    void bgAmpiLog(unsigned short op, unsigned int size);
     void bgSetInfo(char *msg, const char *str, void **logs, int count);
     void bgEndExec(int);
     virtual void beginExecute(envelope *);
@@ -53,14 +52,14 @@ class TraceBluegene : public Trace {
 CkpvExtern(TraceBluegene*, _tracebg);
 extern int traceBluegeneLinked;
 
-#if ! CMK_TRACE_DISABLED
+#if CMK_TRACE_ENABLED
 #  define _TRACE_BG_ONLY(code) do{ BgGetTime(); if(traceBluegeneLinked && CpvAccess(traceOn)){ code; } resetVTime(); } while(0)
 #else
 #  define _TRACE_BG_ONLY(code) /*empty*/
 #endif
 
 /* tracing for Blue Gene - before trace projector era */
-#if !CMK_TRACE_DISABLED && CMK_TRACE_IN_CHARM
+#if CMK_TRACE_ENABLED && CMK_TRACE_IN_CHARM
 // for Sdag only
 // fixme - think of better api for tracing sdag code
 #define BgPrint(x)  _TRACE_BG_ONLY(CkpvAccess(_tracebg)->bgPrint(x))
@@ -77,8 +76,8 @@ extern int traceBluegeneLinked;
 #define _TRACE_BGLIST_USER_EVENT_BRACKET(x,bt,et,pLogPtr,bgLogList) _TRACE_BG_ONLY(CkpvAccess(_tracebg)->userBracketEvent(x,bt,et,pLogPtr,bgLogList))
 #define TRACE_BG_ADD_TAG(str)  _TRACE_BG_ONLY(CkpvAccess(_tracebg)->bgAddTag(str))
 
-# define TRACE_BG_AMPI_SET_SIZE(size) \
-    _TRACE_BG_ONLY(CkpvAccess(_tracebg)->bgAmpiSetSize(size))
+# define TRACE_BG_AMPI_LOG(op,size)                                    \
+    _TRACE_BG_ONLY(CkpvAccess(_tracebg)->bgAmpiLog(op,size))
 
 # define TRACE_BG_AMPI_SUSPEND()     \
        _TRACE_BG_END_EXECUTE(1); \
@@ -134,6 +133,7 @@ extern "C" void BgSetStartEvent();
 #define _TRACE_BGLIST_USER_EVENT_BRACKET(x,bt,et,pLogPtr,bgLogList)
 #define _TRACE_BG_ADD_TAG(str)
        
+# define TRACE_BG_AMPI_LOG(op, size)
 # define TRACE_BG_AMPI_SUSPEND()
 # define TRACE_BG_AMPI_RESUME(t, msg, str, log)
 # define TRACE_BG_AMPI_START(t, str)
index 85afa6e961d6140ddc5fc54dbc2c395393f726ed..4a5c1b33b2d997773e5476b33384697b66418afc 100644 (file)
 */
 /*@{*/
 
-#include <stdlib.h>
-#if defined(_WIN32) && !defined(__CYGWIN__)
-#include <direct.h>
-#define CHDIR _chdir
-#define GETCWD _getcwd
-#define PATHSEP '\\'
-#define PATHSEPSTR "\\"
-#else
-#include <unistd.h>
-#define CHDIR chdir
-#define GETCWD getcwd
-#define PATHSEP '/'
-#define PATHSEPSTR "/"
-#endif
-
 // cannot include charm++.h because trace-common.o is part of libconv-core.a
 #include "charm.h"
 #include "middle.h"
@@ -38,9 +23,9 @@
 
 CpvCExtern(int, _traceCoreOn);   // projector
 
-#if CMK_TRACE_DISABLED
+#if ! CMK_TRACE_ENABLED
 static int warned = 0;
-#define OPTIMIZE_WARNING if (!warned) { warned=1;  CmiPrintf("\n\n!!!! Warning: tracing not available with CMK_TRACE_DISABLED!\n");  return;  }
+#define OPTIMIZE_WARNING if (!warned) { warned=1;  CmiPrintf("\n\n!!!! Warning: tracing not available without CMK_TRACE_ENABLED!\n");  return;  }
 #else
 #define OPTIMIZE_WARNING /*empty*/
 #endif
@@ -195,19 +180,19 @@ extern void traceWriteSTS(FILE *stsfp,int nUserEvents) {
 #else  
   fprintf(stsfp, "PROCESSORS %d\n", CkNumPes());
 #endif 
-  fprintf(stsfp, "TOTAL_CHARES %d\n", _chareTable.size());
-  fprintf(stsfp, "TOTAL_EPS %d\n", _entryTable.size());
-  fprintf(stsfp, "TOTAL_MSGS %d\n", _msgTable.size());
-  fprintf(stsfp, "TOTAL_PSEUDOS %d\n", 0);
-  fprintf(stsfp, "TOTAL_EVENTS %d\n", nUserEvents);
+  fprintf(stsfp, "TOTAL_CHARES %d\n", (int)_chareTable.size());
+  fprintf(stsfp, "TOTAL_EPS %d\n", (int)_entryTable.size());
+  fprintf(stsfp, "TOTAL_MSGS %d\n", (int)_msgTable.size());
+  fprintf(stsfp, "TOTAL_PSEUDOS %d\n", (int)0);
+  fprintf(stsfp, "TOTAL_EVENTS %d\n", (int)nUserEvents);
   size_t i;
   for(i=0;i<_chareTable.size();i++)
-    fprintf(stsfp, "CHARE %d %s\n", i, _chareTable[i]->name);
+    fprintf(stsfp, "CHARE %d %s\n", (int)i, _chareTable[i]->name);
   for(i=0;i<_entryTable.size();i++)
-    fprintf(stsfp, "ENTRY CHARE %d %s %d %d\n", i, _entryTable[i]->name,
-                 _entryTable[i]->chareIdx, _entryTable[i]->msgIdx);
+    fprintf(stsfp, "ENTRY CHARE %d %s %d %d\n", (int)i, _entryTable[i]->name,
+                 (int)_entryTable[i]->chareIdx, (int)_entryTable[i]->msgIdx);
   for(i=0;i<_msgTable.size();i++)
-    fprintf(stsfp, "MESSAGE %d %u\n", i, _msgTable[i]->size);
+    fprintf(stsfp, "MESSAGE %d %u\n", (int)i, (int)_msgTable[i]->size);
 }
 
 extern "C"
@@ -265,7 +250,7 @@ void TraceArray::traceEndOnCommThread() {
 
 /*Install the beginIdle/endIdle condition handlers.*/
 extern "C" void traceBegin(void) {
-#if ! CMK_TRACE_DISABLED
+#if CMK_TRACE_ENABLED
   DEBUGF(("[%d] traceBegin called with %d at %f\n", CkMyPe(), CpvAccess(traceOn), TraceTimer()));
   
 #if CMK_SMP_TRACE_COMMTHREAD
@@ -285,7 +270,7 @@ extern "C" void traceBegin(void) {
 
 /*Cancel the beginIdle/endIdle condition handlers.*/
 extern "C" void traceEnd(void) {
-#if ! CMK_TRACE_DISABLED
+#if CMK_TRACE_ENABLED
   DEBUGF(("[%d] traceEnd called with %d at %f\n", CkMyPe(), CpvAccess(traceOn), TraceTimer()));
 
 #if CMK_SMP_TRACE_COMMTHREAD
@@ -301,7 +286,7 @@ if(CmiMyRank()==0){
        
   if (CpvAccess(traceOn)==0) return;
   if (CkpvAccess(_traces) == NULL) {
-    CmiPrintf("Warning: did you mix compilation with and without -DCMK_TRACE_DISABLED? \n");
+    CmiPrintf("Warning: did you mix compilation with and without -DCMK_TRACE_ENABLED? \n");
   }
   CkpvAccess(_traces)->traceEnd();
   CpvAccess(traceOn) = 0;
@@ -392,7 +377,7 @@ extern "C" void traceCharmInit(char **argv)
 #endif
 }
 
-// CMK_TRACE_DISABLED is already guarded in convcore.c
+// CMK_TRACE_ENABLED is already guarded in convcore.c
 extern "C"
 void traceMessageRecv(char *msg, int pe)
 {
@@ -401,7 +386,7 @@ void traceMessageRecv(char *msg, int pe)
 #endif
 }
 
-// CMK_TRACE_DISABLED is already guarded in convcore.c
+// CMK_TRACE_ENABLED is already guarded in convcore.c
 // converse thread tracing is not supported in blue gene simulator
 // in BigSim, threads need to be traced manually (because virtual processors
 // themselves are implemented as threads and we don't want them to be traced
@@ -429,7 +414,7 @@ void traceAwaken(CthThread t)
 extern "C"
 void traceUserEvent(int e)
 {
-#if ! CMK_TRACE_DISABLED
+#if CMK_TRACE_ENABLED
   if (CpvAccess(traceOn))
     CkpvAccess(_traces)->userEvent(e);
 #endif
@@ -438,7 +423,7 @@ void traceUserEvent(int e)
 extern "C"
 void traceUserBracketEvent(int e, double beginT, double endT)
 {
-#if ! CMK_TRACE_DISABLED
+#if CMK_TRACE_ENABLED
   if (CpvAccess(traceOn) && CkpvAccess(_traces))
     CkpvAccess(_traces)->userBracketEvent(e, beginT, endT);
 #endif
@@ -447,7 +432,7 @@ void traceUserBracketEvent(int e, double beginT, double endT)
 extern "C"
 void traceUserSuppliedData(int d)
 {
-#if ! CMK_TRACE_DISABLED
+#if CMK_TRACE_ENABLED
   if (CpvAccess(traceOn) && CkpvAccess(_traces))
     CkpvAccess(_traces)->userSuppliedData(d);
 #endif
@@ -456,7 +441,7 @@ void traceUserSuppliedData(int d)
 extern "C"
 void traceUserSuppliedNote(char * note)
 {
-#if ! CMK_TRACE_DISABLED
+#if CMK_TRACE_ENABLED
   if (CpvAccess(traceOn) && CkpvAccess(_traces))
     CkpvAccess(_traces)->userSuppliedNote(note);
 #endif
@@ -467,7 +452,7 @@ extern "C"
 void traceUserSuppliedBracketedNote(char *note, int eventID, double bt, double et)
 {
   //CkPrintf("traceUserSuppliedBracketedNote(char *note, int eventID, double bt, double et)\n");
-#if ! CMK_TRACE_DISABLED
+#if CMK_TRACE_ENABLED
   if (CpvAccess(traceOn) && CkpvAccess(_traces))
     CkpvAccess(_traces)->userSuppliedBracketedNote(note, eventID, bt, et);
 #endif
@@ -477,7 +462,7 @@ void traceUserSuppliedBracketedNote(char *note, int eventID, double bt, double e
 extern "C"
 void traceMemoryUsage()
 {
-#if ! CMK_TRACE_DISABLED
+#if CMK_TRACE_ENABLED
   double d = CmiMemoryUsage()*1.0;
 
   if (CpvAccess(traceOn) && CkpvAccess(_traces))
@@ -510,7 +495,7 @@ void (*registerMachineUserEvents())() {
 extern "C"
 int traceRegisterUserEvent(const char*x, int e)
 {
-#if ! CMK_TRACE_DISABLED
+#if CMK_TRACE_ENABLED
   return CkpvAccess(_traces)->traceRegisterUserEvent(x, e);
 #else
   return 0;
@@ -594,7 +579,7 @@ int CkIsCharmMessage(char *msg)
 // return 1 if any one of tracing modules is linked.
 int  traceAvailable()
 {
-#if CMK_TRACE_DISABLED
+#if ! CMK_TRACE_ENABLED
   return 0;
 #else
   return CkpvAccess(_traces)->length()>0;
@@ -628,7 +613,7 @@ void registerFunction(char *name){
 
 extern "C"
 int traceRegisterFunction(const char* name, int idx) {
-#if ! CMK_TRACE_DISABLED
+#if CMK_TRACE_ENABLED
   if(idx==-999){
     CkpvAccess(_traces)->regFunc(name, idx);
   } else {
index 884ca11a6b4e08a2a277cf16013bceb148ccc03d..275c63e30d5bec7d366875f4e819572dfb709ba7 100644 (file)
 #ifndef __TRACE_COMMON_H__
 #define __TRACE_COMMON_H__
 
+
+#include <stdlib.h>
+#if defined(_WIN32) && !defined(__CYGWIN__)
+#include <direct.h>
+#define CHDIR _chdir
+#define GETCWD _getcwd
+#define PATHSEP '\\'
+#define PATHSEPSTR "\\"
+#else
+#include <unistd.h>
+#define CHDIR chdir
+#define GETCWD getcwd
+#define PATHSEP '/'
+#define PATHSEPSTR "/"
+#endif
+
+
 #define  CREATION           1
 #define  BEGIN_PROCESSING   2
 #define  END_PROCESSING     3
index 28a4b8f63a7d314761574f697962dbbf504652ea..b7961bb9f85c2a21b3abfba892fd7add88f1e1be 100644 (file)
@@ -18,7 +18,7 @@ int traceBluegeneLinked = 0;
 void traceInit(char **argv) {
   CpvInitialize(int, traceOn);
   CpvAccess(traceOn)=0;
-#if ! CMK_TRACE_DISABLED
+#if CMK_TRACE_ENABLED
   CpvInitialize(int, _traceCoreOn); 
   CpvAccess(_traceCoreOn)=0; 
   /* initTraceCore(argv); */
@@ -51,3 +51,4 @@ void traceUserSuppliedNote(char *note) {}
 /* This routine, included in Charm++ programs from init.C, needs to be present in converse as well.
    Here is a place where it gets included only in converse, and not in Charm++ (thus not generating conflicts). */
 void EmergencyExit(void) {}
+void CpdEndConditionalDeliver_master() {}
index eda872b38fc031a6e9ffbc1fe245068d468dc283..48b4c3caa5035bf920f454256e6ddf29d8538ee7 100644 (file)
@@ -82,14 +82,14 @@ void flushTraceLog()
   CkpvAccess(_trace)->traceFlushLog();
 }
 
-#if CMK_TRACE_DISABLED
+#if ! CMK_TRACE_ENABLED
 static int warned=0;
 #define OPTIMIZED_VERSION      \
        if (!warned) { warned=1;        \
        CmiPrintf("\n\n!!!! Warning: traceUserEvent not available in optimized version!!!!\n\n\n"); }
 #else
 #define OPTIMIZED_VERSION /*empty*/
-#endif // CMK_TRACE_DISABLED
+#endif // CMK_TRACE_ENABLED
 
 /*
 On T3E, we need to have file number control by open/close files only when needed.
@@ -171,7 +171,7 @@ void traceThreadListener_free(struct CthThreadListener *l)
 
 void TraceProjections::traceAddThreadListeners(CthThread tid, envelope *e)
 {
-#if ! CMK_TRACE_DISABLED
+#if CMK_TRACE_ENABLED
   /* strip essential information from the envelope */
   TraceThreadListener *a= new TraceThreadListener;
   
@@ -292,17 +292,33 @@ void LogPool::createFile(const char *fix)
   if (fileCreated) {
     return;
   }
+
+  char* filenameLastPart = strrchr(pgmname, PATHSEP) + 1; // Last occurrence of path separator
+  char *pathPlusFilePrefix = new char[1024];
+
+  if(nSubdirs > 0){
+    int sd = CkMyPe() % nSubdirs;
+    char *subdir = new char[1024];
+    sprintf(subdir, "%s.projdir.%d", pgmname, sd);
+    CmiMkdir(subdir);
+    sprintf(pathPlusFilePrefix, "%s%c%s%s", subdir, PATHSEP, filenameLastPart, fix);
+    delete[] subdir;
+  } else {
+    sprintf(pathPlusFilePrefix, "%s%s", pgmname, fix);
+  }
+
   char pestr[10];
   sprintf(pestr, "%d", CkMyPe());
 #if CMK_PROJECTIONS_USE_ZLIB
   int len;
   if(compressed)
-    len = strlen(pgmname)+strlen(fix)+strlen(".logold")+strlen(pestr)+strlen(".gz")+3;
+    len = strlen(pathPlusFilePrefix)+strlen(".logold")+strlen(pestr)+strlen(".gz")+3;
   else
-    len = strlen(pgmname)+strlen(fix)+strlen(".logold")+strlen(pestr)+3;
+    len = strlen(pathPlusFilePrefix)+strlen(".logold")+strlen(pestr)+3;
 #else
-  int len = strlen(pgmname)+strlen(fix)+strlen(".logold")+strlen(pestr)+3;
+  int len = strlen(pathPlusFilePrefix)+strlen(".logold")+strlen(pestr)+3;
 #endif
+
   if (nonDeltaLog) {
     fname = new char[len];
   }
@@ -312,40 +328,41 @@ void LogPool::createFile(const char *fix)
 #if CMK_PROJECTIONS_USE_ZLIB
   if(compressed) {
     if (deltaLog && nonDeltaLog) {
-      sprintf(fname, "%s%s.%s.logold.gz", pgmname, fix, pestr);
-      sprintf(dfname, "%s%s.%s.log.gz", pgmname, fix, pestr);
+      sprintf(fname, "%s.%s.logold.gz",  pathPlusFilePrefix, pestr);
+      sprintf(dfname, "%s.%s.log.gz", pathPlusFilePrefix, pestr);
     } else {
       if (nonDeltaLog) {
-       sprintf(fname, "%s%s.%s.log.gz", pgmname, fix, pestr);
+       sprintf(fname, "%s.%s.log.gz", pathPlusFilePrefix,pestr);
       } else {
-       sprintf(dfname, "%s%s.%s.log.gz", pgmname, fix, pestr);
+       sprintf(dfname, "%s.%s.log.gz", pathPlusFilePrefix, pestr);
       }
     }
   } else {
     if (deltaLog && nonDeltaLog) {
-      sprintf(fname, "%s%s.%s.logold", pgmname, fix, pestr);
-      sprintf(dfname, "%s%s.%s.log", pgmname, fix, pestr);
+      sprintf(fname, "%s.%s.logold", pathPlusFilePrefix, pestr);
+      sprintf(dfname, "%s.%s.log", pathPlusFilePrefix, pestr);
     } else {
       if (nonDeltaLog) {
-       sprintf(fname, "%s%s.%s.log", pgmname, fix, pestr);
+       sprintf(fname, "%s.%s.log", pathPlusFilePrefix, pestr);
       } else {
-       sprintf(dfname, "%s%s.%s.log", pgmname, fix, pestr);
+       sprintf(dfname, "%s.%s.log", pathPlusFilePrefix, pestr);
       }
     }
   }
 #else
   if (deltaLog && nonDeltaLog) {
-    sprintf(fname, "%s%s.%s.logold", pgmname, fix, pestr);
-    sprintf(dfname, "%s%s.%s.log", pgmname, fix, pestr);
+    sprintf(fname, "%s.%s.logold", pathPlusFilePrefix, pestr);
+    sprintf(dfname, "%s.%s.log", pathPlusFilePrefix, pestr);
   } else {
     if (nonDeltaLog) {
-      sprintf(fname, "%s%s.%s.log", pgmname, fix, pestr);
+      sprintf(fname, "%s.%s.log", pathPlusFilePrefix, pestr);
     } else {
-      sprintf(dfname, "%s%s.%s.log", pgmname, fix, pestr);
+      sprintf(dfname, "%s.%s.log", pathPlusFilePrefix, pestr);
     }
   }
 #endif
   fileCreated = true;
+  delete[] pathPlusFilePrefix;
   openLog("w+");
   CLOSE_LOG 
 }
@@ -971,6 +988,11 @@ TraceProjections::TraceProjections(char **argv):
   int binary = 
     CmiGetArgFlagDesc(argv,"+binary-trace",
                      "Write log files in binary format");
+
+  CmiInt8 nSubdirs = 0;
+  CmiGetArgLongDesc(argv,"+trace-subdirs", &nSubdirs, "Number of subdirectories into which traces will be written");
+
+
 #if CMK_PROJECTIONS_USE_ZLIB
   int compressed = CmiGetArgFlagDesc(argv,"+gz-trace","Write log files pre-compressed with gzip");
 #else
@@ -993,6 +1015,7 @@ TraceProjections::TraceProjections(char **argv):
                                  "Generate Delta encoded and simple timestamped log files");
 
   _logPool = new LogPool(CkpvAccess(traceRoot));
+  _logPool->setNumSubdirs(nSubdirs);
   _logPool->setBinary(binary);
 #if CMK_PROJECTIONS_USE_ZLIB
   _logPool->setCompressed(compressed);
@@ -1667,7 +1690,7 @@ void registerOutlierReduction() {
 // FIXME: WHY extern "C"???
 extern "C" void TraceProjectionsExitHandler()
 {
-#if ! CMK_TRACE_DISABLED
+#if CMK_TRACE_ENABLED
   // CkPrintf("[%d] TraceProjectionsExitHandler called!\n", CkMyPe());
   CProxy_TraceProjectionsBOC bocProxy(traceProjectionsGID);
   bocProxy.traceProjectionsParallelShutdown(CkMyPe());
index 258643bff22a56261f49e8a344133a6f57300780..93ab8a0337d59c5c9a3854f2dc87582a111737a2 100644 (file)
@@ -263,6 +263,7 @@ class LogPool {
     char *dfname;
     char *pgmname;
     int binary;
+    int nSubdirs;
 #if CMK_PROJECTIONS_USE_ZLIB
     gzFile deltazfp;
     gzFile zfp;
@@ -287,6 +288,7 @@ class LogPool {
     LogPool(char *pgm);
     ~LogPool();
     void setBinary(int b) { binary = b; }
+    void setNumSubdirs(int n) { nSubdirs = n; }
 #if CMK_PROJECTIONS_USE_ZLIB
     void setCompressed(int c) { compressed = c; }
 #endif
index 4b41a7f167890de679ef01ec8b56accdf3ea0018..7e3b3be9073686b56a328ffaf36dae6cc890c675 100644 (file)
@@ -17,7 +17,7 @@ typedef CkVec<UsrEvent *>   UsrEventVec;
 CkpvStaticDeclare(UsrEventVec, usrEvents);
 
 
-#if CMK_TRACE_DISABLED
+#if ! CMK_TRACE_ENABLED
 static int warned=0;
 #define OPTIMIZED_VERSION      \
        if (!warned) { warned=1;        \
index 7a9f6b8e8ea55646e88b8f287cdd8d5d8e074a4d..a85802c46e6567be3c52d322d12796e877c23cbf 100644 (file)
@@ -1166,7 +1166,7 @@ void TraceSummaryBOC::write(void)
 
 extern "C" void CombineSummary()
 {
-#if ! CMK_TRACE_DISABLED
+#if CMK_TRACE_ENABLED
   CmiPrintf("[%d] CombineSummary called!\n", CkMyPe());
   if (sumonly) {
     CmiPrintf("[%d] Sum Only start!\n", CkMyPe());
index 50d2fcb4b80ca0e7c563df900d9286209f7f0efb..7ce7114c5b7095a1fa731877d99ced2943915579 100644 (file)
@@ -284,7 +284,7 @@ public:
 
 CkpvExtern(TraceArray*, _traces);
 
-#if ! CMK_TRACE_DISABLED
+#if CMK_TRACE_ENABLED
 #if CMK_BLUEGENE_CHARM
 extern void    resetVTime();
 #  define _TRACE_ONLY(code) do{ BgGetTime(); if(CpvAccess(traceOn) && CkpvAccess(_traces)->length()>0) { code; }  resetVTime(); } while(0)
index c5cf82981bb9fb7293f4741da29ba2571623c8c1..a4f687dd55c9ab5b4c636a1e1d302d34101232af 100644 (file)
 
 #if CMK_CCS_AVAILABLE
 
-/**********************************************
-  "ccs_getinfo"-- takes no data
-    Return the number of parallel nodes, and
-      the number of processors per node as an array
-      of 4-byte big-endian ints.
-*/
-
-static void ccs_getinfo(char *msg)
-{
-  int nNode=CmiNumNodes();
-  int len=(1+nNode)*sizeof(ChMessageInt_t);
-  ChMessageInt_t *table=(ChMessageInt_t *)malloc(len);
-  int n;
-  table[0]=ChMessageInt_new(nNode);
-  for (n=0;n<nNode;n++)
-    table[1+n]=ChMessageInt_new(CmiNodeSize(n));
-  CcsSendReply(len,(const char *)table);
-  free(table);
-  CmiFree(msg);
-}
+void ccs_getinfo(char *msg);
 
 /**********************************************
   "ccs_killport"-- takes one 4-byte big-endian port number
@@ -61,7 +42,7 @@ static killPortStruct *killList=NULL;
 static void ccs_killport(char *msg)
 {
   killPortStruct *oldList=killList;
-  int port=ChMessageInt(*(ChMessageInt_t *)(msg+CmiMsgHeaderSizeBytes));
+  int port=ChMessageInt(*(ChMessageInt_t *)(msg+CmiReservedHeaderSize));
   skt_ip_t ip;
   unsigned int connPort;
   CcsCallerId(&ip,&connPort);
@@ -175,7 +156,7 @@ static CpdListAccessor *CpdListLookup(const ChMessageInt_t *lenAndPath)
 //Get the length of the given list:
 static void CpdList_ccs_list_len(char *msg)
 {
-  const ChMessageInt_t *req=(const ChMessageInt_t *)(msg+CmiMsgHeaderSizeBytes);
+  const ChMessageInt_t *req=(const ChMessageInt_t *)(msg+CmiReservedHeaderSize);
   CpdListAccessor *acc=CpdListLookup(req);
   if (acc!=NULL) {
     ChMessageInt_t reply=ChMessageInt_new(acc->getLength());
@@ -194,9 +175,9 @@ static void CpdList_ccs_list_len(char *msg)
 static CpdListAccessor *CpdListHeader_ccs_list_items(char *msg,
             CpdListItemsRequest &h)
 {
-  int msgLen=CmiSize((void *)msg)-CmiMsgHeaderSizeBytes;
+  int msgLen=CmiSize((void *)msg)-CmiReservedHeaderSize;
   CpdListAccessor *ret=NULL;
-  const ChMessageInt_t *req=(const ChMessageInt_t *)(msg+CmiMsgHeaderSizeBytes);
+  const ChMessageInt_t *req=(const ChMessageInt_t *)(msg+CmiReservedHeaderSize);
   h.lo=ChMessageInt(req[0]); // first item to send
   h.hi=ChMessageInt(req[1]); // last item to send+1
   h.extraLen=ChMessageInt(req[2]); // extra data length
@@ -258,33 +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[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);
 }
 
@@ -454,7 +441,7 @@ CCS Client->CWebHandler->...  (processor 0)
 #define MAXFNS 20 /*Largest number of performance functions to expect*/
 
 typedef struct {
-       char hdr[CmiMsgHeaderSizeBytes];
+       char hdr[CmiReservedHeaderSize];
        int fromPE;/*Source processor*/
        int perfData[MAXFNS];/*Performance numbers*/
 } CWeb_CollectedData;
@@ -582,9 +569,9 @@ static void CWebHandler(void){
       
       /*Start collecting data on each processor*/
       for(i = 0; i < CmiNumPes(); i++){
-        char *msg = (char *)CmiAlloc(CmiMsgHeaderSizeBytes);
+        char *msg = (char *)CmiAlloc(CmiReservedHeaderSize);
         CmiSetHandler(msg, CWeb_CollectIndex);
-        CmiSyncSendAndFree(i, CmiMsgHeaderSizeBytes,msg);
+        CmiSyncSendAndFree(i, CmiReservedHeaderSize,msg);
       }
     }
   }
index ef543a9e5ceaf67dfd1585e841cff96fa273b61e..29bc5540b0ea6722989ffaa0ac7f6b4d4dfb32c2 100644 (file)
@@ -533,29 +533,34 @@ int check_stdio_header(CcsImplHeader *hdr) {
 }
 
 #if ! CMK_CMIPRINTF_IS_A_BUILTIN
+#if CMK_BLUEGENE_CHARM
+#define MAX_PRINT_BUF_SIZE 1024
+#else
+#define MAX_PRINT_BUF_SIZE 8192
+#endif
 int print_fw_handler_idx;
 
 /* Receives messages passed to processor 0 by all other processors as a
  * consequence of prints in debug mode.
  */
 void print_fw_handler(char *msg) {
-  write_stdio_duplicate(msg+CmiMsgHeaderSizeBytes);
+  write_stdio_duplicate(msg+CmiReservedHeaderSize);
 }
 
 /* Forward prints to node0 to be buffered and delivered through CCS */
 void print_node0(const char *format, va_list args) {
-  char buffer[16384];
+  char buffer[MAX_PRINT_BUF_SIZE];
   int len;
-  if ((len=vsnprintf(buffer, 16384, format, args)) >= 16384) CmiAbort("CmiPrintf: printing buffer too long\n");
+  if ((len=vsnprintf(buffer, MAX_PRINT_BUF_SIZE, format, args)) >= MAX_PRINT_BUF_SIZE) CmiAbort("CmiPrintf: printing buffer too long\n");
   if (CmiMyPe() == 0) {
     /* We are the print server, just concatenate the printed string */
     write_stdio_duplicate(buffer);
   } else {
     /* Need to forward the string to processor 0 */
-    char* msg = CmiAlloc(CmiMsgHeaderSizeBytes+len+1);
-    memcpy(msg+CmiMsgHeaderSizeBytes, buffer, len+1);
+    char* msg = CmiAlloc(CmiReservedHeaderSize+len+1);
+    memcpy(msg+CmiReservedHeaderSize, buffer, len+1);
     CmiSetHandler(msg,print_fw_handler_idx);
-    CmiSyncSendAndFree(0,CmiMsgHeaderSizeBytes+len+1,msg);
+    CmiSyncSendAndFree(0,CmiReservedHeaderSize+len+1,msg);
   }
 }
 #endif
index 80a22c5f26fd8564ac1e03e3f45af1e607227812..03e6c6d76877352a7f64a33168383e68de5b93c7 100644 (file)
  *
  *****************************************************************************/
  
-#include "ckhashtable.h"
-
-/* Includes all information stored about a single CCS handler. */
-typedef struct CcsHandlerRec {
-       const char *name; /*Name passed over socket*/
-       CmiHandler fnOld; /*Old converse-style handler, or NULL if new-style*/
-       CcsHandlerFn fn; /*New-style handler function, or NULL if old-style*/
-       void *userPtr;
-       CmiReduceMergeFn mergeFn; /*Merge function used for bcast requests*/
-       int nCalls; /* Number of times handler has been executed*/
-       CmiUInt2 redID; /*Reduction ID to be used with CmiListReduce*/
-} CcsHandlerRec;
-
 static void initHandlerRec(CcsHandlerRec *c,const char *name) {
   if (strlen(name)>=CCS_MAXHANDLER) 
        CmiAbort("CCS handler names cannot exceed 32 characters");
@@ -55,8 +42,8 @@ static void callHandlerRec(CcsHandlerRec *c,int reqLen,const void *reqData) {
            Pack user data into a converse message (cripes! why bother?);
            user will delete the message. 
          */
-               char *cmsg = (char *) CmiAlloc(CmiMsgHeaderSizeBytes+reqLen);
-               memcpy(cmsg+CmiMsgHeaderSizeBytes, reqData, reqLen);
+               char *cmsg = (char *) CmiAlloc(CmiReservedHeaderSize+reqLen);
+               memcpy(cmsg+CmiReservedHeaderSize, reqData, reqLen);
                (c->fnOld)(cmsg);
        }
        else { /* Pass read-only copy of data straight to user */
@@ -65,8 +52,7 @@ static void callHandlerRec(CcsHandlerRec *c,int reqLen,const void *reqData) {
 }
 
 /*Table maps handler name to CcsHandler object*/
-typedef CkHashtable_c CcsHandlerTable;
-CpvStaticDeclare(CcsHandlerTable, ccsTab);
+CpvDeclare(CcsHandlerTable, ccsTab);
 
 CpvStaticDeclare(CcsImplHeader*,ccsReq);/*Identifies CCS requestor (client)*/
 
@@ -83,6 +69,9 @@ void CcsRegisterHandlerFn(const char *name, CcsHandlerFn fn, void *ptr) {
   cp.userPtr=ptr;
   *(CcsHandlerRec *)CkHashtablePut(CpvAccess(ccsTab),(void *)&cp.name)=cp;
 }
+CcsHandlerRec *CcsGetHandler(const char *name) {
+  return CkHashtableGet(CpvAccess(ccsTab),(void *)&name);
+}
 void CcsSetMergeFn(const char *name, CmiReduceMergeFn newMerge) {
   CcsHandlerRec *rec=(CcsHandlerRec *)CkHashtableGet(CpvAccess(ccsTab),(void *)&name);
   if (rec==NULL) {
@@ -99,17 +88,17 @@ void * CcsMerge_concat(int *size,void *local,void **remote,int n) {
   char *ptr;
   int i;
   for (i=0; i<n; ++i) {
-    hdr = (CcsImplHeader*)(((char*)remote[i])+CmiMsgHeaderSizeBytes);
+    hdr = (CcsImplHeader*)(((char*)remote[i])+CmiReservedHeaderSize);
     total += ChMessageInt(hdr->len);
   }
   reply = CmiAlloc(total);
   memcpy(reply, local, *size);
-  ((CcsImplHeader*)(((char*)reply)+CmiMsgHeaderSizeBytes))->len = ChMessageInt_new(total-CmiMsgHeaderSizeBytes-sizeof(CcsImplHeader));
+  ((CcsImplHeader*)(((char*)reply)+CmiReservedHeaderSize))->len = ChMessageInt_new(total-CmiReservedHeaderSize-sizeof(CcsImplHeader));
   CmiFree(local);
   ptr = ((char*)reply)+*size;
   for (i=0; i<n; ++i) {
-    int len = ChMessageInt(((CcsImplHeader*)(((char*)remote[i])+CmiMsgHeaderSizeBytes))->len);
-    memcpy(ptr, ((char*)remote[i])+CmiMsgHeaderSizeBytes+sizeof(CcsImplHeader), len);
+    int len = ChMessageInt(((CcsImplHeader*)(((char*)remote[i])+CmiReservedHeaderSize))->len);
+    memcpy(ptr, ((char*)remote[i])+CmiReservedHeaderSize+sizeof(CcsImplHeader), len);
     ptr += len;
   }
   *size = total;
@@ -119,7 +108,7 @@ void * CcsMerge_concat(int *size,void *local,void **remote,int n) {
 #define SIMPLE_REDUCTION(name, dataType, loop) \
 void * CcsMerge_##name(int *size,void *local,void **remote,int n) { \
   int i, m; \
-  CcsImplHeader *hdrLocal = (CcsImplHeader*)(((char*)local)+CmiMsgHeaderSizeBytes); \
+  CcsImplHeader *hdrLocal = (CcsImplHeader*)(((char*)local)+CmiReservedHeaderSize); \
   int lenLocal = ChMessageInt(hdrLocal->len); \
   int nElem = lenLocal / sizeof(dataType); \
   dataType *ret = (dataType *) (hdrLocal+1); \
@@ -127,7 +116,7 @@ void * CcsMerge_##name(int *size,void *local,void **remote,int n) { \
   for (m=0; m<n; ++m) { \
     int len; \
     dataType *value; \
-    hdr = (CcsImplHeader*)(((char*)remote[m])+CmiMsgHeaderSizeBytes); \
+    hdr = (CcsImplHeader*)(((char*)remote[m])+CmiReservedHeaderSize); \
     len = ChMessageInt(hdr->len); \
     value = (dataType *)(hdr+1); \
     CmiAssert(lenLocal == len); \
@@ -171,39 +160,7 @@ void CcsCallerId(skt_ip_t *pip, unsigned int *pport)
   *pport = ChMessageInt(CpvAccess(ccsReq)->attr.port);
 }
 
-static int rep_fw_handler_idx;
-
-/**
- * Decide if the reply is ready to be forwarded to the waiting client,
- * or if combination is required (for broadcast/multicast CCS requests.
- */
-int CcsReply(CcsImplHeader *rep,int repLen,const void *repData) {
-  int repPE = (int)ChMessageInt(rep->pe);
-  if (repPE <= -1) {
-    /* Reduce the message to get the final reply */
-    CcsHandlerRec *fn;
-    int len=CmiMsgHeaderSizeBytes+sizeof(CcsImplHeader)+repLen;
-    char *msg=CmiAlloc(len);
-    char *r=msg+CmiMsgHeaderSizeBytes;
-    char *handlerStr;
-    rep->len = ChMessageInt_new(repLen);
-    *(CcsImplHeader *)r=*rep; r+=sizeof(CcsImplHeader);
-    memcpy(r,repData,repLen);
-    CmiSetHandler(msg,rep_fw_handler_idx);
-    handlerStr=rep->handler;
-    fn=(CcsHandlerRec *)CkHashtableGet(CpvAccess(ccsTab),(void *)&handlerStr);
-    if (fn->mergeFn == NULL) CmiAbort("Called CCS broadcast with NULL merge function!\n");
-    if (repPE == -1) {
-      /* CCS Broadcast */
-      CmiReduce(msg, len, fn->mergeFn);
-    } else {
-      /* CCS Multicast */
-      CmiListReduce(-repPE, (int*)(rep+1), msg, len, fn->mergeFn, fn->redID);
-    }
-  } else {
-    CcsImpl_reply(rep, repLen, repData);
-  }
-}
+int rep_fw_handler_idx;
 
 CcsDelayedReply CcsDelayReply(void)
 {
@@ -261,7 +218,7 @@ delivery.
   Deliver the given message data to the given
 CCS handler.
 */
-static void CcsHandleRequest(CcsImplHeader *hdr,const char *reqData)
+void CcsHandleRequest(CcsImplHeader *hdr,const char *reqData)
 {
   char *cmsg;
   int reqLen=ChMessageInt(hdr->len);
@@ -279,57 +236,108 @@ static void CcsHandleRequest(CcsImplHeader *hdr,const char *reqData)
 
 /* Call the handler */
   CpvAccess(ccsReq)=hdr;
-  callHandlerRec(fn,reqLen,reqData);
+#if CMK_CHARMDEBUG
+  if (conditionalPipe[1]!=0 && _conditionalDelivery==0) {
+    /* We are conditionally delivering, send the message to the child and wait for its response */
+    int bytes = reqLen+((int)(reqData-((char*)hdr)))+CmiReservedHeaderSize;
+    write(conditionalPipe[1], &bytes, 4);
+    write(conditionalPipe[1], ((char*)hdr)-CmiReservedHeaderSize, bytes);
+    if (4==read(conditionalPipe[0], &bytes, 4)) {
+      char *buf = malloc(bytes);
+      read(conditionalPipe[0], buf, bytes);
+      CcsSendReply(bytes,buf);
+      free(buf);
+    } else {
+      /* the pipe has been closed */
+      CpdEndConditionalDeliver_master();
+   }
+  }
+  else
+#endif
+  {
+    callHandlerRec(fn,reqLen,reqData);
   
 /*Check if a reply was sent*/
-  if (CpvAccess(ccsReq)!=NULL)
-    CcsSendReply(0,NULL);/*Send an empty reply if not*/
-}
-
-/*Unpacks request message to call above routine*/
-int _ccsHandlerIdx = 0;/*Converse handler index of below routine*/
-static void req_fw_handler(char *msg)
-{
-  int offset = CmiMsgHeaderSizeBytes + sizeof(CcsImplHeader);
-  CcsImplHeader *hdr = (CcsImplHeader *)(msg+CmiMsgHeaderSizeBytes);
-  int destPE = (int)ChMessageInt(hdr->pe);
-  if (CmiMyPe() == 0 && destPE == -1) {
-    /* Broadcast message to all other processors */
-    int len=CmiMsgHeaderSizeBytes+sizeof(CcsImplHeader)+ChMessageInt(hdr->len);
-    CmiSyncBroadcast(len, msg);
-  }
-  else if (destPE < -1) {
-    /* Multicast the message to your children */
-    int len=CmiMsgHeaderSizeBytes+sizeof(CcsImplHeader)+ChMessageInt(hdr->len)-destPE*sizeof(ChMessageInt_t);
-    int index, child, i;
-    int *pes = (int*)(msg+CmiMsgHeaderSizeBytes+sizeof(CcsImplHeader));
-    ChMessageInt_t *pes_nbo = (ChMessageInt_t *)pes;
-    offset -= destPE * sizeof(ChMessageInt_t);
-    if (ChMessageInt(pes_nbo[0]) == CmiMyPe()) {
-      for (index=0; index<-destPE; ++index) pes[index] = ChMessageInt(pes_nbo[index]);
-    }
-    for (index=0; index<-destPE; ++index) {
-      if (pes[index] == CmiMyPe()) break;
-    }
-    child = (index << 2) + 1;
-    for (i=0; i<4; ++i) {
-      if (child+i < -destPE) {
-        CmiSyncSend(pes[child+i], len, msg);
-      }
-    }
+    if (CpvAccess(ccsReq)!=NULL)
+      CcsSendReply(0,NULL);/*Send an empty reply if not*/
   }
-  CcsHandleRequest(hdr, msg+offset);
-  CmiFree(msg);
 }
 
-#if ! NODE_0_IS_CONVHOST
+#if ! NODE_0_IS_CONVHOST || CMK_BLUEGENE_CHARM
 /* The followings are necessary to prevent CCS requests to be processed before
  * CCS has been initialized. Really it matters only when NODE_0_IS_CONVHOST=0, but
  * it doesn't hurt having it in the other case as well */
 static char **bufferedMessages = NULL;
 static int CcsNumBufferedMsgs = 0;
 #define CCS_MAX_NUM_BUFFERED_MSGS  100
+
+void CcsBufferMessage(char *msg) {
+  CmiPrintf("Buffering CCS message\n");
+  CmiAssert(CcsNumBufferedMsgs < CCS_MAX_NUM_BUFFERED_MSGS);
+  if (CcsNumBufferedMsgs < 0) CmiAbort("Why is a CCS message being buffered now???");
+  if (bufferedMessages == NULL) bufferedMessages = malloc(sizeof(char*)*CCS_MAX_NUM_BUFFERED_MSGS);
+  bufferedMessages[CcsNumBufferedMsgs] = msg;
+  CcsNumBufferedMsgs ++;
+}
 #endif
+  
+/*Unpacks request message to call above routine*/
+int _ccsHandlerIdx = 0;/*Converse handler index of routine req_fw_handler*/
+
+#if CMK_BLUEGENE_CHARM
+CpvDeclare(int, _bgCcsHandlerIdx);
+CpvDeclare(int, _bgCcsAck);
+/* This routine is needed when the application is built on top of the bigemulator
+ * layer of Charm. In this case, the real CCS handler must be called within a
+ * worker thread. The function of this function is to receive the CCS message in
+ * the bottom converse layer and forward it to the emulated layer. */
+static void bg_req_fw_handler(char *msg) {
+  if (CpvAccess(_bgCcsAck) < BgNodeSize()) {
+    CcsBufferMessage(msg);
+    return;
+  }
+  //CmiPrintf("CCS scheduling message\n");
+  /* Get out of the message who is the destination pe */
+  int offset = CmiReservedHeaderSize + sizeof(CcsImplHeader);
+  CcsImplHeader *hdr = (CcsImplHeader *)(msg+CmiReservedHeaderSize);
+  int destPE = (int)ChMessageInt(hdr->pe);
+  if (destPE == -1) destPE = 0;
+  if (destPE < -1) {
+    ChMessageInt_t *pes_nbo = (ChMessageInt_t *)(msg+CmiReservedHeaderSize+sizeof(CcsImplHeader));
+    destPE = ChMessageInt(pes_nbo[0]);
+  }
+  //CmiAssert(destPE >= 0); // FixME: should cover also broadcast and multicast -> create generic function to extract destpe
+  (((CmiBlueGeneMsgHeader*)msg)->tID) = 0;
+  (((CmiBlueGeneMsgHeader*)msg)->n) = 0;
+  (((CmiBlueGeneMsgHeader*)msg)->flag) = 0;
+  (((CmiBlueGeneMsgHeader*)msg)->t) = 0;
+  (((CmiBlueGeneMsgHeader*)msg)->hID) = CpvAccess(_bgCcsHandlerIdx);
+  /* Get the right thread to deliver to (for now assume it is using CyclicMapInfo) */
+  addBgNodeInbuffer(msg, destPE/CmiNumPes());
+  //CmiPrintf("message CCS added %d to %d\n",((CmiBlueGeneMsgHeader*)msg)->hID, ((CmiBlueGeneMsgHeader*)msg)->tID);
+}
+#define req_fw_handler bg_req_fw_handler
+#endif
+extern void req_fw_handler(char *msg);
+
+void CcsReleaseMessages() {
+#if ! NODE_0_IS_CONVHOST || CMK_BLUEGENE_CHARM
+#if CMK_BLUEGENE_CHARM
+  if (CpvAccess(_bgCcsAck) == 0 || CpvAccess(_bgCcsAck) < BgNodeSize()) return;
+#endif
+  if (CcsNumBufferedMsgs > 0) {
+    int i;
+    //CmiPrintf("CCS: %d messages released\n",CcsNumBufferedMsgs);
+    for (i=0; i<CcsNumBufferedMsgs; ++i) {
+      CmiSetHandler(bufferedMessages[i], _ccsHandlerIdx);
+      CsdEnqueue(bufferedMessages[i]);
+    }
+    free(bufferedMessages);
+    bufferedMessages = NULL;
+    CcsNumBufferedMsgs = -1;
+  }
+#endif
+}
 
 /*Convert CCS header & message data into a converse message 
  addressed to handler*/
@@ -340,10 +348,10 @@ char *CcsImpl_ccs2converse(const CcsImplHeader *hdr,const void *data,int *ret_le
   int len;
   char *msg;
   if (destPE < -1) reqLen -= destPE*sizeof(int);
-  len=CmiMsgHeaderSizeBytes+sizeof(CcsImplHeader)+reqLen;
+  len=CmiReservedHeaderSize+sizeof(CcsImplHeader)+reqLen;
   msg=(char *)CmiAlloc(len);
-  memcpy(msg+CmiMsgHeaderSizeBytes,hdr,sizeof(CcsImplHeader));
-  memcpy(msg+CmiMsgHeaderSizeBytes+sizeof(CcsImplHeader),data,reqLen);
+  memcpy(msg+CmiReservedHeaderSize,hdr,sizeof(CcsImplHeader));
+  memcpy(msg+CmiReservedHeaderSize+sizeof(CcsImplHeader),data,reqLen);
   if (ret_len!=NULL) *ret_len=len;
   if (_ccsHandlerIdx != 0) {
     CmiSetHandler(msg, _ccsHandlerIdx);
@@ -352,12 +360,7 @@ char *CcsImpl_ccs2converse(const CcsImplHeader *hdr,const void *data,int *ret_le
 #if NODE_0_IS_CONVHOST
     CmiAbort("Why do we need to buffer messages when node 0 is Convhost?");
 #else
-    //CmiPrintf("Buffering CCS message\n");
-    CmiAssert(CcsNumBufferedMsgs < CCS_MAX_NUM_BUFFERED_MSGS);
-    if (CcsNumBufferedMsgs < 0) CmiAbort("Why is a CCS message being buffered now???");
-    if (bufferedMessages == NULL) bufferedMessages = malloc(sizeof(char*)*CCS_MAX_NUM_BUFFERED_MSGS);
-    bufferedMessages[CcsNumBufferedMsgs] = msg;
-    CcsNumBufferedMsgs ++;
+    CcsBufferMessage(msg);
     return NULL;
 #endif
   }
@@ -368,7 +371,7 @@ converse to node 0.*/
 static void rep_fw_handler(char *msg)
 {
   int len;
-  char *r=msg+CmiMsgHeaderSizeBytes;
+  char *r=msg+CmiReservedHeaderSize;
   CcsImplHeader *hdr=(CcsImplHeader *)r; 
   r+=sizeof(CcsImplHeader);
   len=ChMessageInt(hdr->len);
@@ -425,10 +428,10 @@ void CcsImpl_reply(CcsImplHeader *rep,int repLen,const void *repData)
     CcsServer_sendReply(rep,repLen,repData);
   } else {
     /*Forward data & socket # to the replyPE*/
-    int len=CmiMsgHeaderSizeBytes+
+    int len=CmiReservedHeaderSize+
            sizeof(CcsImplHeader)+repLen;
     char *msg=CmiAlloc(len);
-    char *r=msg+CmiMsgHeaderSizeBytes;
+    char *r=msg+CmiReservedHeaderSize;
     *(CcsImplHeader *)r=*rep; r+=sizeof(CcsImplHeader);
     memcpy(r,repData,repLen);
     CmiSetHandler(msg,rep_fw_handler_idx);
@@ -454,24 +457,31 @@ void CcsImpl_netRequest(CcsImplHeader *hdr,const void *reqData)
   char *msg;
   int len,repPE=ChMessageInt(hdr->pe);
   if (repPE<=-CmiNumPes() || repPE>=CmiNumPes()) {
+#if ! CMK_BLUEGENE_CHARM
     /*Treat out of bound values as errors. Helps detecting bugs*/
     if (repPE==-CmiNumPes()) CmiPrintf("Invalid processor index in CCS request: are you trying to do a broadcast instead?");
     else CmiPrintf("Invalid processor index in CCS request.");
     CpvAccess(ccsReq)=hdr;
     CcsSendReply(0,NULL); /*Send an empty reply to the possibly waiting client*/
     return;
+#endif
   }
 
   msg=CcsImpl_ccs2converse(hdr,reqData,&len);
   if (repPE >= 0) {
-    CmiSyncSendAndFree(repPE,len,msg);
+    /* The following %CmiNumPes() follows the assumption that in BigSim the mapping is round-robin */
+    //CmiPrintf("CCS message received for %d\n",repPE);
+    CmiSyncSendAndFree(repPE%CmiNumPes(),len,msg);
   } else if (repPE == -1) {
     /* Broadcast to all processors */
-    CmiPushPE(0, msg);
+    //CmiPrintf("CCS broadcast received\n");
+    CmiSyncSendAndFree(0,len,msg);
   } else {
     /* Multicast to -repPE processors, specified right at the beginning of reqData (as a list of pes) */
     int firstPE = ChMessageInt(*(ChMessageInt_t*)reqData);
-    CmiSyncSendAndFree(firstPE,len,msg);
+    /* The following %CmiNumPes() follows the assumption that in BigSim the mapping is round-robin */
+    //CmiPrintf("CCS multicast received\n");
+    CmiSyncSendAndFree(firstPE%CmiNumPes(),len,msg);
   }
 }
 
@@ -524,6 +534,12 @@ void CcsInit(char **argv)
   CpvInitialize(CcsImplHeader *, ccsReq);
   CpvAccess(ccsReq) = NULL;
   _ccsHandlerIdx = CmiRegisterHandler((CmiHandler)req_fw_handler);
+#if CMK_BLUEGENE_CHARM
+  CpvInitialize(int, _bgCcsHandlerIdx);
+  CpvAccess(_bgCcsHandlerIdx) = 0;
+  CpvInitialize(int, _bgCcsAck);
+  CpvAccess(_bgCcsAck) = 0;
+#endif
   CpvInitialize(int, cmiArgDebugFlag);
   CpvInitialize(char *, displayArgument);
   CpvInitialize(int, cpdSuspendStartup);
@@ -572,18 +588,7 @@ void CcsInit(char **argv)
      }
   }
 
-#if ! NODE_0_IS_CONVHOST
-  if (CcsNumBufferedMsgs > 0) {
-    int i;
-    for (i=0; i<CcsNumBufferedMsgs; ++i) {
-      CmiSetHandler(bufferedMessages[i], _ccsHandlerIdx);
-      CmiPushPE(0, bufferedMessages[i]);
-    }
-    free(bufferedMessages);
-    bufferedMessages = NULL;
-    CcsNumBufferedMsgs = -1;
-  }
-#endif
+  CcsReleaseMessages();
 }
 
 #endif /*CMK_CCS_AVAILABLE*/
index dd7815a1478426922920347c01d502f75862109a..e0e64868ca8ebd036d49f99da3d1ccc905af5c4f 100644 (file)
@@ -17,6 +17,8 @@ but it can use the CcsSendReply function.
 #include "sockRoutines.h"
 #include "ccs-server.h" /*for CcsSecAttr*/
 
+#include "ckhashtable.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -29,10 +31,26 @@ extern int _ccsHandlerIdx;
 
 #if CMK_CCS_AVAILABLE
 
+typedef CkHashtable_c CcsHandlerTable;
+CpvExtern(CcsHandlerTable, ccsTab);
+
 typedef struct CcsDelayedReply_struct {
   CcsImplHeader *hdr;
 } CcsDelayedReply;
 
+typedef void (*CcsHandlerFn)(void *userPtr,int reqLen,const void *reqData);
+
+/* Includes all information stored about a single CCS handler. */
+typedef struct CcsHandlerRec {
+    const char *name; /*Name passed over socket*/
+    CmiHandler fnOld; /*Old converse-style handler, or NULL if new-style*/
+    CcsHandlerFn fn; /*New-style handler function, or NULL if old-style*/
+    void *userPtr;
+    CmiReduceMergeFn mergeFn; /*Merge function used for bcast requests*/
+    int nCalls; /* Number of times handler has been executed*/
+    CmiUInt2 redID; /*Reduction ID to be used with CmiListReduce*/
+} CcsHandlerRec;
+
 /**
  * Backward compatability routine: register a regular converse-style handler
  * to receive CCS requests.  The requests will arrive as a Converse message,
@@ -40,11 +58,12 @@ typedef struct CcsDelayedReply_struct {
  */
 void CcsRegisterHandler(const char *ccs_handlername, CmiHandler fn);
 
+CcsHandlerRec *CcsGetHandler(const char *name);
+
 /**
  * Register a real Ccs handler function to receive these CCS requests. 
  * The requests will arrive as a flat, readonly buffer.
  */
-typedef void (*CcsHandlerFn)(void *userPtr,int reqLen,const void *reqData);
 void CcsRegisterHandlerFn(const char *ccs_handlername, CcsHandlerFn fn, void *userPtr);
 
 /**
@@ -69,6 +88,7 @@ SIMPLE_POLYMORPH_REDUCTION(min);
 #undef SIMPLE_REDUCTION
 #undef SIMPLE_POLYMORPH_REDUCTION
 
+void CcsReleaseMessages();
 void CcsInit(char **argv);
 int CcsEnabled(void);
 int CcsIsRemoteRequest(void);
@@ -81,6 +101,7 @@ void CcsNoDelayedReply(CcsDelayedReply d);
 
 #else
 typedef void *CcsDelayedReply;
+#define CcsReleaseMessages() /*empty*/
 #define CcsInit(argv) /*empty*/
 #define CcsRegisterHandler(x,y) 0
 #define CcsRegisterHandlerFn(x,y,p) 0
diff --git a/src/conv-ccs/middle-ccs.C b/src/conv-ccs/middle-ccs.C
new file mode 100644 (file)
index 0000000..f62ffe6
--- /dev/null
@@ -0,0 +1,224 @@
+#include <unistd.h>
+#include "middle.h"
+
+#if CMK_BLUEGENE_CHARM
+#include "bgconverse.h"
+#endif
+#include "ccs-server.h"
+#include "conv-ccs.h"
+
+#if CMK_CCS_AVAILABLE
+extern "C" void CcsHandleRequest(CcsImplHeader *hdr,const char *reqData);
+
+extern "C" void req_fw_handler(char *msg)
+{
+  int offset = CmiReservedHeaderSize + sizeof(CcsImplHeader);
+  CcsImplHeader *hdr = (CcsImplHeader *)(msg+CmiReservedHeaderSize);
+  int destPE = (int)ChMessageInt(hdr->pe);
+  if (CmiMyPe() == 0 && destPE == -1) {
+    /* Broadcast message to all other processors */
+    int len=CmiReservedHeaderSize+sizeof(CcsImplHeader)+ChMessageInt(hdr->len);
+    CmiSyncBroadcast(len, msg);
+  }
+  else if (destPE < -1) {
+    /* Multicast the message to your children */
+    int len=CmiReservedHeaderSize+sizeof(CcsImplHeader)+ChMessageInt(hdr->len)-destPE*sizeof(ChMessageInt_t);
+    int index, child, i;
+    int *pes = (int*)(msg+CmiReservedHeaderSize+sizeof(CcsImplHeader));
+    ChMessageInt_t *pes_nbo = (ChMessageInt_t *)pes;
+    offset -= destPE * sizeof(ChMessageInt_t);
+    if (ChMessageInt(pes_nbo[0]) == CmiMyPe()) {
+      for (index=0; index<-destPE; ++index) pes[index] = ChMessageInt(pes_nbo[index]);
+    }
+    for (index=0; index<-destPE; ++index) {
+      if (pes[index] == CmiMyPe()) break;
+    }
+    child = (index << 2) + 1;
+    for (i=0; i<4; ++i) {
+      if (child+i < -destPE) {
+        CmiSyncSend(pes[child+i], len, msg);
+      }
+    }
+  }
+  CcsHandleRequest(hdr, msg+offset);
+  CmiFree(msg);
+}
+
+#ifdef _MSC_VER
+extern "C" size_t write(int fd, const void *buf, size_t count);
+#endif
+
+extern "C" int rep_fw_handler_idx;
+/**
+ * Decide if the reply is ready to be forwarded to the waiting client,
+ * or if combination is required (for broadcast/multicast CCS requests.
+ */
+extern "C" int CcsReply(CcsImplHeader *rep,int repLen,const void *repData) {
+  int repPE = (int)ChMessageInt(rep->pe);
+  if (repPE <= -1) {
+    /* Reduce the message to get the final reply */
+    CcsHandlerRec *fn;
+    int len=CmiReservedHeaderSize+sizeof(CcsImplHeader)+repLen;
+    char *msg=(char*)CmiAlloc(len);
+    char *r=msg+CmiReservedHeaderSize;
+    char *handlerStr;
+    rep->len = ChMessageInt_new(repLen);
+    *(CcsImplHeader *)r=*rep; r+=sizeof(CcsImplHeader);
+    memcpy(r,repData,repLen);
+    CmiSetHandler(msg,rep_fw_handler_idx);
+    handlerStr=rep->handler;
+    fn=(CcsHandlerRec *)CcsGetHandler(handlerStr);
+    if (fn->mergeFn == NULL) CmiAbort("Called CCS broadcast with NULL merge function!\n");
+    if (repPE == -1) {
+      /* CCS Broadcast */
+      CkReduce(msg, len, fn->mergeFn);
+    } else {
+      /* CCS Multicast */
+      CmiListReduce(-repPE, (int*)(rep+1), msg, len, fn->mergeFn, fn->redID);
+    }
+  } else {
+    if (_conditionalDelivery == 0) CcsImpl_reply(rep, repLen, repData);
+    else {
+      /* We are the child of a conditional delivery, write to the parent the reply */
+      write(conditionalPipe[1], &repLen, 4);
+      write(conditionalPipe[1], repData, repLen);
+    }
+  }
+  return 0;
+}
+
+
+/**********************************************
+  "ccs_getinfo"-- takes no data
+    Return the number of parallel nodes, and
+      the number of processors per node as an array
+      of 4-byte big-endian ints.
+*/
+
+void ccs_getinfo(char *msg)
+{
+  int nNode=CmiNumNodes();
+  int len=(1+nNode)*sizeof(ChMessageInt_t);
+  ChMessageInt_t *table=(ChMessageInt_t *)malloc(len);
+  int n;
+  table[0]=ChMessageInt_new(nNode);
+  for (n=0;n<nNode;n++)
+    table[1+n]=ChMessageInt_new(CmiNodeSize(n));
+  CcsSendReply(len,(const char *)table);
+  free(table);
+  CmiFree(msg);
+}
+
+///////////////////////////////// middle-debug.C
+#endif
+#if ! CMK_HAS_GETPID
+typedef int pid_t;
+#endif
+
+extern "C" {
+
+CpvDeclare(void *, debugQueue);
+CpvDeclare(int, freezeModeFlag);
+
+/*
+ Start the freeze-- call will not return until unfrozen
+ via a CCS request.
+ */
+void CpdFreeze(void)
+{
+  pid_t pid = 0;
+#if CMK_HAS_GETPID
+  pid = getpid();
+#endif
+  CpdNotify(CPD_FREEZE,pid);
+  if (CpvAccess(freezeModeFlag)) return; /*Already frozen*/
+  CpvAccess(freezeModeFlag) = 1;
+#if ! CMK_BLUEGENE_CHARM
+  CpdFreezeModeScheduler();
+#endif
+}
+
+void CpdUnFreeze(void)
+{
+  CpvAccess(freezeModeFlag) = 0;
+}
+
+int CpdIsFrozen(void) {
+  return CpvAccess(freezeModeFlag);
+}
+
+}
+
+#if CMK_BLUEGENE_CHARM
+#include "blue_impl.h"
+void BgProcessMessageFreezeMode(threadInfo *t, char *msg) {
+//  CmiPrintf("BgProcessMessageFreezeMode\n");
+#if CMK_CCS_AVAILABLE
+  void *debugQ=CpvAccess(debugQueue);
+  CmiAssert(msg!=NULL);
+  int processImmediately = CpdIsDebugMessage(msg);
+  if (processImmediately) BgProcessMessageDefault(t, msg);
+  while (!CpvAccess(freezeModeFlag) && !CdsFifo_Empty(debugQ)) {
+    BgProcessMessageDefault(t, (char*)CdsFifo_Dequeue(debugQ));
+  }
+  if (!processImmediately) {
+    if (!CpvAccess(freezeModeFlag)) BgProcessMessageDefault(t, msg); 
+    else CdsFifo_Enqueue(debugQ, msg);
+  }
+#else
+  BgProcessMessageDefault(t, msg);
+#endif
+}
+#endif
+
+void PrintDebugStackTrace(void *);
+extern "C" void * MemoryToSlot(void *ptr);
+extern "C" int Slot_StackTrace(void *s, void ***stack);
+extern "C" int Slot_ChareOwner(void *s);
+
+#include <stdarg.h>
+void CpdNotify(int type, ...) {
+  void *ptr; int integer, i;
+  pid_t pid=0;
+  int levels=64;
+  void *stackPtrs[64];
+  void *sl;
+  va_list list;
+  va_start(list, type);
+  switch (type) {
+  case CPD_ABORT:
+    CmiPrintf("CPD: %d Abort %s\n",CmiMyPe(), va_arg(list, char*));
+    break;
+  case CPD_SIGNAL:
+    CmiPrintf("CPD: %d Signal %d\n",CmiMyPe(), va_arg(list, int));
+    break;
+  case CPD_FREEZE:
+#if CMK_HAS_GETPID
+    pid = getpid();
+#endif
+    CmiPrintf("CPD: %d Freeze %d\n",CmiMyPe(),pid);
+    break;
+  case CPD_BREAKPOINT:
+    CmiPrintf("CPD: %d BP %s\n",CmiMyPe(), va_arg(list, char*));
+    break;
+  case CPD_CROSSCORRUPTION:
+    ptr = va_arg(list, void*);
+    integer = va_arg(list, int);
+    CmiPrintf("CPD: %d Cross %p %d ",CmiMyPe(), ptr, integer);
+    sl = MemoryToSlot(ptr);
+    if (sl != NULL) {
+      int stackLen; void **stackTrace;
+      stackLen = Slot_StackTrace(sl, &stackTrace);
+      CmiPrintf("%d %d ",Slot_ChareOwner(sl),stackLen);
+      for (i=0; i<stackLen; ++i) CmiPrintf("%p ",stackTrace[i]);
+    } else {
+      CmiPrintf("0 ");
+    }
+    CmiBacktraceRecord(stackPtrs,1,&levels);
+    CmiPrintf("%d ",levels);
+    for (i=0; i<levels; ++i) CmiPrintf("%p ",stackPtrs[i]);
+    CmiPrintf("\n");
+    break;
+  }
+  va_end(list);
+}
index 22a0701aa3894a3650941891a21749b8b966702e..a3ba926fd9e24288abdd8d9d8a63195b38878827 100644 (file)
@@ -68,6 +68,7 @@
 #define CMK_64BIT                1
 #endif
 
+
 /* set up what production/non-production means */
 #ifdef CMK_OPTIMIZE
 /*
 #define CMK_REPLAYSYSTEM            0
 #endif
 
-#ifndef CMK_TRACE_DISABLED
-#define CMK_TRACE_DISABLED          0
+#if ! CMK_CCS_AVAILABLE
+#undef CMK_CHARMDEBUG
+#define  CMK_CHARMDEBUG             0
+#endif
+
+#ifndef CMK_TRACE_ENABLED
+#define CMK_TRACE_ENABLED          1
 #endif
 
 #endif
index 2069fdb8e62b625fa4be7c67d42fd1aa0a724d14..bbbb1ac921a50dd9ad1768ac58f9f9997c5316ec 100644 (file)
@@ -53,7 +53,7 @@ void traceEnd(void);
 void traceWriteSts(void);
 void traceFlushLog(void);
 
-#if ! CMK_TRACE_DISABLED
+#if CMK_TRACE_ENABLED
 CpvExtern(int, traceOn);
 #define traceIsOn()  (CpvAccess(traceOn))
 #else 
index 2caa12aec85b858957154104617372395703bfd9..7288d5915c2c80d241e8ed745a49f21799a8265c 100644 (file)
@@ -889,7 +889,7 @@ double CmiWallTimer()
 
   gettimeofday(&tv,0);
   currenttime = (tv.tv_sec * 1.0) + (tv.tv_usec * 0.000001);
-#ifndef CMK_OPTIMIZE
+#if CMK_ERROR_CHECKING
   if (lastT > 0.0 && currenttime < lastT) {
     currenttime = lastT;
   }
@@ -1405,7 +1405,7 @@ void CmiHandleMessage(void *msg)
        CpvAccess(cQdState)->mProcessed++;
 */
        CmiHandlerInfo *h;
-#ifndef CMK_OPTIMIZE
+#if CMK_TRACE_ENABLED
        CmiUInt2 handler=CmiGetHandler(msg); /* Save handler for use after msg is gone */
        _LOG_E_HANDLER_BEGIN(handler); /* projector */
        /* setMemoryStatus(1) */ /* charmdebug */
@@ -1422,7 +1422,7 @@ void CmiHandleMessage(void *msg)
 
        h=&CmiGetHandlerInfo(msg);
        (h->hdlr)(msg,h->userPtr);
-#ifndef CMK_OPTIMIZE
+#if CMK_TRACE_ENABLED
        /* setMemoryStatus(0) */ /* charmdebug */
        _LOG_E_HANDLER_END(handler);    /* projector */
 #endif
@@ -1745,7 +1745,7 @@ void CthResumeNormalThread(CthThreadToken* token)
     free(token);
     return;
   }
-#if ! CMK_TRACE_DISABLED
+#if CMK_TRACE_ENABLED
 #if ! CMK_TRACE_IN_CHARM
   if(CpvAccess(traceOn))
     CthTraceResume(t);
@@ -1773,7 +1773,7 @@ void CthResumeSchedulingThread(CthThreadToken  *token)
     CpvAccess(CthSleepingStandins) = me;
   }
   CpvAccess(CthSchedulingThread) = t;
-#if ! CMK_TRACE_DISABLED
+#if CMK_TRACE_ENABLED
 #if ! CMK_TRACE_IN_CHARM
   if(CpvAccess(traceOn))
     CthTraceResume(t);
@@ -2609,7 +2609,7 @@ void CmiFree(void *blk)
 {
   void *parentBlk=CmiAllocFindEnclosing(blk);
   int refCount=REFFIELD(parentBlk);
-#ifndef CMK_OPTIMIZE
+#if CMK_ERROR_CHECKING
   if(refCount==0) /* Logic error: reference count shouldn't already have been zero */
     CmiAbort("CmiFree reference count was zero-- is this a duplicate free?");
 #endif
@@ -2701,7 +2701,7 @@ void CmiTmpFree(void *t) {
     CmiTmpBuf_t *b=&CpvAccess(CmiTmpBuf);
     /* t should point into our temporary buffer: figure out where */
     int cur=((const char *)t)-b->buf;
-#ifndef CMK_OPTIMIZE
+#if CMK_ERROR_CHECKING
     if (cur<0 || cur>b->max)
       CmiAbort("CmiTmpFree: called with an invalid pointer");
 #endif
@@ -3231,20 +3231,20 @@ void ConverseCommonInit(char **argv)
    }
 #endif
        
-#if ! CMK_TRACE_DISABLED
+#if CMK_TRACE_ENABLED
   traceInit(argv);
 /*initTraceCore(argv);*/ /* projector */
 #endif
   CmiProcessPriority(argv);
 
-#if CMK_CCS_AVAILABLE
-  CcsInit(argv);
-#endif
   CmiPersistentInit();
   CmiIsomallocInit(argv);
-  CpdInit();
   CmiDeliversInit();
   CsdInit(argv);
+#if CMK_CCS_AVAILABLE
+  CcsInit(argv);
+#endif
+  CpdInit();
   CthSchedInit();
   CmiGroupInit();
   CmiMulticastInit();
@@ -3280,7 +3280,7 @@ void ConverseCommonExit(void)
 {
   CcsImpl_kill();
 
-#if ! CMK_TRACE_DISABLED
+#if CMK_TRACE_ENABLED
   traceClose();
 /*closeTraceCore();*/ /* projector */
 #endif
@@ -3462,4 +3462,10 @@ unsigned int CmiLog2(unsigned int val) {
 }
 #endif
 
+/* for bigsim */
+int CmiMyRank_()
+{
+  return CmiMyRank();
+}
+
 /*@}*/
index 170d743cf0a6eb61827e22858dc500b5bf4f8b67..fabc93fadc2652692bd382310a7e11a56a8ea1e1 100644 (file)
@@ -85,7 +85,7 @@ extern "C" {
 
 /* Global variables used by charmdebug to maintain information */
 extern void CpdSetInitializeMemory(int v);
-#ifndef CMK_OPTIMIZE
+#if CMK_ERROR_CHECKING
 extern int memory_status_info;
 extern int memory_chare_id;
 #define setMemoryStatus(p) { \
@@ -122,6 +122,8 @@ void setMemoryOwnedBy(void *p, int id);
 # define CpvInit_Alloc_scalar(t) (t *)calloc(1,sizeof(t))
 #endif
 
+extern int CmiMyRank_();
+
 #if CMK_SHARED_VARS_UNAVAILABLE /* Non-SMP version of shared vars. */
 extern int _Cmi_mype;
 extern int _Cmi_numpes;
@@ -415,7 +417,7 @@ for each processor in the node.
 #ifdef CMK_CPV_IS_SMP
 
 #if CMK_TLS_THREAD && !CMK_NOT_USE_TLS_THREAD
-#define CMK_MAX_PTHREADS     64
+#define CMK_MAX_PTHREADS     128
 #define CpvDeclare(t,v) __thread t* CMK_TAG(Cpv_,v) = NULL;   \
                         int CMK_TAG(Cpv_inited_,v) = 0;  \
                         t * CMK_TAG(Cpv_addr_,v)[CMK_MAX_PTHREADS] = {0}
@@ -437,7 +439,11 @@ for each processor in the node.
        if (CmiMyRank()) { \
                while (!CpvInitialized(v)) CMK_CPV_IS_SMP; \
        } else { \
-               CmiAssert(CMK_MAX_PTHREADS >= CmiMyNodeSize()); \
+               if(CMK_MAX_PTHREADS < CmiMyNodeSize()+1){ \
+                CmiPrintf("Charm++: please increase CMK_MAX_PTHREADS to at least %d in converse.h\n", CmiMyNodeSize()+1); \
+                CmiAssert(CMK_MAX_PTHREADS >= CmiMyNodeSize()+1);\
+                /*CmiAbort("Error in TLS-based Converse Private Variables");*/\
+              } \
               CMK_TAG(Cpv_inited_,v)=1; \
        } \
     } while(0); \
@@ -498,6 +504,8 @@ extern int CmiGetFirstPeOnPhysicalNode(int node);
 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. */
@@ -831,14 +839,15 @@ void  CmiError(const char *format, ...);
 
 #endif
 
-#ifdef CMK_OPTIMIZE
-#define CmiAssert(expr) ((void) 0)
-#else
 #if defined(__STDC__) || defined(__cplusplus)
 #define __CMK_STRING(x) #x
 #else
 #define __CMK_STRING(x) "x"
 #endif
+
+#if ! CMK_ERROR_CHECKING
+#define CmiAssert(expr) ((void) 0)
+#else
 extern void __cmi_assert(const char *, const char *, int);
 #define CmiAssert(expr) \
   ((void) ((expr) ? 0 :                   \
@@ -1228,6 +1237,7 @@ typedef void        (*CthAwkFn)(CthThreadToken *,int,
                                int prioBits,unsigned int *prioptr);
 typedef CthThread   (*CthThFn)();
 
+void       CthSetSerialNo(CthThread t, int no);
 int        CthImplemented(void);
 
 int        CthMigratable();
@@ -1688,9 +1698,6 @@ extern int _immRunning;
 #elif CMK_PPC_ASM
 #define CmiMemoryReadFence()               __asm__ __volatile__("eieio":::"memory")
 #define CmiMemoryWriteFence()              __asm__ __volatile__("eieio":::"memory")
-#define STRINGIFY(x) #x
-#define TOSTRING(x) STRINGIFY(x)
-#define AT TOSTRING(__LINE__)
 #define CmiMemoryAtomicIncrement(someInt)   { int someInt_private; \
      __asm__ __volatile__ (      \
         "loop%=:\n\t"       /* repeat until this succeeds */    \
@@ -1787,7 +1794,7 @@ CpvExtern(char *,_validProcessors);
 
 int CmiEndianness();
 
-#ifndef CMK_OPTIMIZE
+#if CMK_ERROR_CHECKING
 extern void setMemoryTypeChare(void*); /* for memory debugging */
 extern void setMemoryTypeMessage(void*); /* for memory debugging */
 #else
index 199681fe18cbb3f91942a4dfbd2778ef27bb8399..a864b365b446f82909e8c3be90ebd149725414d1 100644 (file)
@@