fixed bugs in cleanup, topleveltree construction and idepth parameter acceptance...
authorPritish Jetley <pjetley2@illinois.edu>
Thu, 17 Sep 2009 22:18:25 +0000 (22:18 +0000)
committerPritish Jetley <pjetley2@illinois.edu>
Thu, 17 Sep 2009 22:18:25 +0000 (22:18 +0000)
examples/charm++/barnes-charm/Main.cpp
examples/charm++/barnes-charm/Makefile
examples/charm++/barnes-charm/ParticleChunk.cpp
examples/charm++/barnes-charm/TreePiece.cpp

index 7e0873873f91aa0335ae981406003ce8878401b9..47d943e76825b7131ace1955d5bc618b2aa17ac7 100644 (file)
@@ -82,10 +82,18 @@ Main::Main(CkArgMsg *m){
     iterations = DEFAULT_NUM_ITERATIONS;
   }
 
+  /*
   numTreePieces = getiparam("pieces");
   if(numTreePieces < 0){
     numTreePieces = 8*numParticleChunks; 
   }
+  */
+  int depth = getiparam("depth");
+  if(depth < 0){
+    depth = 1;
+  }
+
+  numTreePieces = 1 << (3*depth);
   ckout << "pieces: " << numTreePieces << endl;
   // various maximum count parameters are:
   // nbody, maxmybody, maxcell, maxmycell, maxleaf, maxmyleaf
@@ -99,7 +107,7 @@ Main::Main(CkArgMsg *m){
   CProxy_BlockMap myMap=CProxy_BlockMap::ckNew(); 
   CkArrayOptions opts(numTreePieces); 
   opts.setMap(myMap);
-  int depth = log8floor(numTreePieces);
+  //int depth = log8floor(numTreePieces);
   ckout << "top-level pieces depth: " << (depth+1) << ", " << (IMAX >> (depth+1)) << endl;
   CProxy_TreePiece treeProxy = CProxy_TreePiece::ckNew((CmiUInt8)0,-1,(IMAX >> (depth+1)), CkArrayIndex1D(0), opts);
   pieces = treeProxy;
@@ -680,6 +688,10 @@ void Main::updateTopLevelMoments(){
   CkPrintf("[main]: updateTopLevelMoments(%d)\n", depth);
 #endif
   moments((nodeptr)G_root, depth);
+#ifdef MEMCHECK
+  CkPrintf("[main] check after moments\n");
+  CmiMemoryCheck();
+#endif
 }
 
 nodeptr Main::moments(nodeptr node, int depth){
@@ -704,6 +716,7 @@ nodeptr Main::moments(nodeptr node, int depth){
 #ifdef VERBOSE_MAIN
   CkPrintf("Pos(node): (%f,%f,%f)\n", Pos(node)[0], Pos(node)[1], Pos(node)[2]);
 #endif
+  return node;
 }
 
 #ifdef PRINT_TREE
index 956e800f2893efe55051d8ca24c90352c9eded2b..fb02258c4941df2491e28f68c4aafb52ca772521 100644 (file)
 #
 # to disable timing 
 # -DNO_TIME
+#
+# to enable heap memory corruption checks
+# -DMEMCHECK
 
-OPTS= -O3 -DNO_TIME #-DOUTPUT_ACC #-DPRINT_TREE #-DNO_LB #-DVERBOSE_CHUNKS -DVERBOSE_PIECES -DVERBOSE_MAIN
+OPTS= -g -O3 #-DVERBOSE_PIECES -DVERBOSE_MAIN -DPRINT_TREE -DOUTPUT_ACC -DMEMCHECK  -DNO_LB #-DVERBOSE_CHUNKS -DVERBOSE_PIECES -DVERBOSE_MAIN
 CHARM_DIR=../../../multicore-linux64
 CHARMC=$(CHARM_DIR)/bin/charmc $(OPTS)
 
@@ -33,7 +36,7 @@ $(TARGET).%: $(TARGET)
        mv charmrun charmrun.$*
 
 run: $(TARGET)
-       ./$(TARGET) +LBPeriod 0.0001 +balancer NullLB -in=input_100000 -pieces=8 -fat=100 -tstop=0.225 -NPROC=$(NPROC) $(BARNES_OPTS) +p$(P) ++ppn$(P) 
+       ./$(TARGET) +LBPeriod 0.0001 +balancer NullLB -in=input_100000 -idepth=2 -fat=100 -tstop=0.225 -NPROC=$(NPROC) $(BARNES_OPTS) +p$(P) ++ppn$(P) 
 
 grav.o: grav.C barnes.decl.h
        $(CHARMC) -c grav.C
index f6b8382f475fe59df8fd0a55dbd4359dcd4d9dfe..dbb253ae3bd6b27d8325357433ecc3d5c24efa29 100644 (file)
@@ -161,6 +161,10 @@ void ParticleChunk::partition(CkCallback &cb){
   CkPrintf("[%d] mynbody: %d\n", thisIndex, mynbody);
 #endif
   contribute(0,0,CkReduction::concat,cb);
+#ifdef MEMCHECK
+  CkPrintf("[%d] memcheck after partition\n", thisIndex);
+  CmiMemoryCheck();
+#endif
 }
 
 void ParticleChunk::HouseKeep(){
@@ -232,6 +236,10 @@ void ParticleChunk::ComputeForces (CkCallback &cb)
    }
 
    contribute(0,0,CkReduction::concat,cb);
+#ifdef MEMCHECK
+  CkPrintf("[%d] memcheck after calcforces\n", thisIndex);
+  CmiMemoryCheck();
+#endif
 }
 
 void ParticleChunk::stepsystemPartII(CkReductionMsg *msg){
@@ -291,14 +299,14 @@ ParticleChunk::loadtree(bodyptr p, cellptr root, unsigned ProcessId)
 
    int depth = log8floor(numTreePieces);
    int lowestLevel = Level(mynode) >> depth;
-   int fact = NSUB/2;
+   int fact = NDIM;
    int whichTp = 0;
-   int d = depth;
+   int d = depth-1;
 
    for(int level = Level(mynode); level > lowestLevel; level >>= 1){
      kidIndex = subindex(xp, Level(mynode));
      mynode = Subp(mynode)[kidIndex];
-     whichTp += kidIndex*(1<<(fact*(d-1)));
+     whichTp += kidIndex*(1<<(fact*(d)));
      d--;     
    }
 
@@ -368,8 +376,13 @@ void ParticleChunk::advance(CkCallback &cb_){
     }
   }
 
+  //CkPrintf("chunk %d minmax: (%f,%f,%f) (%f,%f,%f)\n", thisIndex, minmax[0], minmax[1], minmax[2], minmax[3], minmax[4], minmax[5]);
   CkCallback cb(CkIndex_Main::recvGlobalSizes(NULL), mainChare);
   contribute(NDIM*2*sizeof(real), minmax, minmax_RealVectorType, cb);
+#ifdef MEMCHECK
+  CkPrintf("[%d] memcheck after advance\n", thisIndex);
+  CmiMemoryCheck();
+#endif
 }
 
 void ParticleChunk::cleanup(){
index de43deee3b4c9706329c5cd6449311aad2c7c64d..4378e8e5b77c329a43f195c68a7357ac8e199b9d 100644 (file)
@@ -60,7 +60,7 @@ TreePiece::TreePiece(CmiUInt8 p_, int which, int level_, CkArrayIndex1D parentId
   myLevel = level_;
   // don't save parent if top-level tp. parent will be set by
   // acceptroots
-  whichChildAmI = thisIndex;
+  whichChildAmI = thisIndex%NSUB;
 
   usesAtSync = CmiFalse;
   setMigratable(false);
@@ -239,7 +239,7 @@ void TreePiece::acceptRoots(CmiUInt8 roots_, real rsize_, real rmx, real rmy, re
 #endif
 
 #ifdef VERBOSE_PIECES
-    CkPrintf("piece [%d] acceptRoot parent 0x%x\n", thisIndex, parent);
+    CkPrintf("piece [%d] acceptRoot parent 0x%x (%ld)\n", thisIndex, parent, NodeKey(parent));
 #endif
   }
   contribute(0,0,CkReduction::concat,cb);
@@ -876,5 +876,9 @@ void TreePiece::cleanup(CkCallback &cb_){
   wantToSplit = false;
 
   contribute(0,0,CkReduction::concat,cb_);
+#ifdef MEMCHECK
+  CkPrintf("piece %d after cleanup\n", thisIndex);
+  CmiMemoryCheck();
+#endif
 }