changed CentralLB and BaseLB from irreduciable group to normal group.
authorGengbin Zheng <gzheng@illinois.edu>
Mon, 1 Mar 2004 07:21:55 +0000 (07:21 +0000)
committerGengbin Zheng <gzheng@illinois.edu>
Mon, 1 Mar 2004 07:21:55 +0000 (07:21 +0000)
Collected all command line options flags into a class instead of individual flags flying around.
Implemented a true barrier after load balancing and migrations of objects
finish on *all* processors. This can be turned on by +LBSynResume command line option. The default behavior is still that each processor waits only for objects that will migrate on it.

18 files changed:
src/ck-ldb/BaseLB.h
src/ck-ldb/CentralLB.C
src/ck-ldb/CentralLB.ci
src/ck-ldb/CentralLB.h
src/ck-ldb/Comm1LB.C
src/ck-ldb/GreedyCommLB.C
src/ck-ldb/GreedyLB.C
src/ck-ldb/LBDBManager.C
src/ck-ldb/LBDatabase.C
src/ck-ldb/LBDatabase.h
src/ck-ldb/LBObj.h
src/ck-ldb/NborBaseLB.C
src/ck-ldb/NeighborLB.C
src/ck-ldb/ObjGraph.C
src/ck-ldb/OrbLB.C
src/ck-ldb/Refiner.C
src/ck-ldb/RefinerComm.C
src/ck-ldb/WSLB.C

index db3a53ff8f873fbb2d653ced30dcd131f47535c1..6dc2f327cc4d2fff64f3e93a6ac9c4f3220d132c 100644 (file)
@@ -21,7 +21,7 @@
   it does some tracking about how many lb strategies are created.
   it also defines some common functions.
 */
-class BaseLB: public IrrGroup
+class BaseLB: public CBase_BaseLB
 {
 protected:
   int  seqno;
@@ -34,7 +34,7 @@ private:
   void initLB(const CkLBOptions &);
 public:
   BaseLB(const CkLBOptions &opt)  { initLB(opt); }
-  BaseLB(CkMigrateMessage *m):IrrGroup(m) {}
+  BaseLB(CkMigrateMessage *m):CBase_BaseLB(m) {}
   virtual ~BaseLB();
 
   void unregister(); 
index 565dd67cb0823075db4caa440c5d184de56892e3..341ffe37df5121d88c12c20b955910ff4a924931 100644 (file)
@@ -237,7 +237,7 @@ void CentralLB::buildStats()
        statsMsgsList[pe]=0;
     }
     statsData->n_migrateobjs = nmigobj;
-    if (_lb_debug) {
+    if (_lb_args.debug()) {
       CmiPrintf("n_obj:%d migratable:%d ncom:%d\n", nobj, nmigobj, ncom);
     }
 }
@@ -264,7 +264,7 @@ void CentralLB::ReceiveStats(CkMarshalledCLBStatsMessage &msg)
     struct ProcStats &procStat = statsData->procs[pe];
     procStat.total_walltime = m->total_walltime;
     procStat.total_cputime = m->total_cputime;
-    if (_lb_ignoreBgLoad) {
+    if (_lb_args.ignoreBgLoad()) {
       procStat.idletime = 0.0;
       procStat.bg_walltime = 0.0;
       procStat.bg_cputime = 0.0;
@@ -287,7 +287,7 @@ void CentralLB::ReceiveStats(CkMarshalledCLBStatsMessage &msg)
   DEBUGF(("[0] ReceiveStats from %d step: %d count: %d\n", pe, step(), stats_msg_count));
   const int clients = CkNumPes();
   if (stats_msg_count == clients) {
-    if (_lb_debug
+    if (_lb_args.debug()
       CmiPrintf("[%s] Load balancing step %d starting at %f in PE%d\n",
                  lbName(), step(),start_lb_time, cur_ld_balancer);
 //    double strat_start_time = CmiWallTimer();
@@ -317,7 +317,7 @@ void CentralLB::ReceiveStats(CkMarshalledCLBStatsMessage &msg)
 
 //  calculate predicted load
 //  very time consuming though, so only happen when debugging is on
-    if (_lb_debug) {
+    if (_lb_args.debug()) {
       double minObjLoad, maxObjLoad;
       getPredictedLoad(statsData, clients, migrateMsg, migrateMsg->expectedLoad, minObjLoad, maxObjLoad, 1);
     }
@@ -449,29 +449,43 @@ void CentralLB::ReceiveMigration(LBMigrateMsg *m)
 void CentralLB::MigrationDone(int balancing)
 {
 #if CMK_LBDB_ON
-  if (balancing && _lb_debug && CkMyPe() == cur_ld_balancer) {
-    double end_lb_time = CmiWallTimer();
-      CkPrintf("[%s] Load balancing step %d finished at %f\n",
-               lbName(), step(),end_lb_time);
-      double lbdbMemsize = LBDatabase::Object()->useMem()/1000;
-      CkPrintf("[%s] duration %fs memUsage: LBManager:%dKB CentralLB:%dKB\n", 
-               lbName(), end_lb_time - start_lb_time,
-               (int)lbdbMemsize, (int)(useMem()/1000));
-  }
   migrates_completed = 0;
   migrates_expected = -1;
   // clear load stats
   if (balancing) theLbdb->ClearLoads();
   // Increment to next step
   theLbdb->incStep();
-  thisProxy [CkMyPe()].ResumeClients(balancing);
+  // if sync resume, invoke a barrier
+  if (balancing && _lb_args.syncResume()) {
+    CkCallback cb(CkIndex_CentralLB::ResumeClients((CkReductionMsg*)NULL), 
+                  thisProxy);
+    contribute(0, NULL, CkReduction::sum_int, cb);
+  }
+  else 
+    thisProxy [CkMyPe()].ResumeClients(balancing);
 #endif
 }
 
+void CentralLB::ResumeClients(CkReductionMsg *msg)
+{
+  ResumeClients(1);
+  delete msg;
+}
+
 void CentralLB::ResumeClients(int balancing)
 {
 #if CMK_LBDB_ON
   DEBUGF(("Resuming clients on PE %d\n",CkMyPe()));
+  if (balancing && _lb_args.debug() && CkMyPe() == cur_ld_balancer) {
+    double end_lb_time = CmiWallTimer();
+    CkPrintf("[%s] Load balancing step %d finished at %f\n",
+             lbName(), step(),end_lb_time);
+    double lbdbMemsize = LBDatabase::Object()->useMem()/1000;
+    CkPrintf("[%s] duration %fs memUsage: LBManager:%dKB CentralLB:%dKB\n", 
+             lbName(), end_lb_time - start_lb_time,
+             (int)lbdbMemsize, (int)(useMem()/1000));
+  }
+
   theLbdb->ResumeClients();
   // switch to the next load balancer in the list
   if (balancing) theLbdb->nextLoadbalancer(seqno);
@@ -571,7 +585,7 @@ LBMigrateMsg * CentralLB::createMigrateMsg(LDStats* stats,int count)
     delete item;
     migrateInfo[i] = 0;
   }
-  if (_lb_debug)
+  if (_lb_args.debug())
     CkPrintf("%s: %d objects migrating.\n", lbname, migrate_count);
   return msg;
 }
index 841d6f4b8adba068279ea9233b4d0ecf91b3f26b..937bb41c482977ab753343cef056f9e9f4499b89 100644 (file)
@@ -16,6 +16,7 @@ group [migratable] CentralLB : BaseLB {
   entry void ProcessAtSync(void);
   entry void ReceiveStats(CkMarshalledCLBStatsMessage data);
   entry void ResumeClients(int);
+  entry void ResumeClients(CkReductionMsg *);
   entry void ReceiveMigration(LBMigrateMsg*);  
 };
 
index 33a8cf752f083dcade28987a5904410d7eec61e9..386ffdc16758b54fd9d104d0738acdb449faeb6a 100644 (file)
@@ -53,8 +53,9 @@ public:
                             // making projections output look funny
 
   void ReceiveStats(CkMarshalledCLBStatsMessage &msg); // Receive stats on PE 0
-  void ResumeClients(int);                     // Resuming clients needs
+  void ResumeClients(int);                      // Resuming clients needs
                                                // to be resumed via message
+  void ResumeClients(CkReductionMsg *);
   void ReceiveMigration(LBMigrateMsg *);       // Receive migration data
 
   // manual predictor start/stop
index cf6486913bc330f1a922ef3dbd5cba136d7f3d92..2a8c5e20eee10d5c5c28f43db32435bb32fe7ad0 100644 (file)
@@ -195,7 +195,7 @@ void Comm1LB::work(CentralLB::LDStats* stats, int count)
        xcoord = stats->getHash(commData.sender); 
        ycoord = stats->getHash(commData.receiver.get_destObj());
        if((xcoord == -1)||(ycoord == -1))
-         if (_lb_ignoreBgLoad) continue;
+         if (_lb_args.ignoreBgLoad()) continue;
          else CkAbort("Error in search\n");
        add_graph(xcoord,ycoord,commData.bytes, commData.messages);     
       }
index e533c545d4feb9c2b8393eaf525af7859bc2eeb8..848a3078af1d5cc812710b7a512d59f72e16a192 100644 (file)
@@ -206,7 +206,7 @@ void GreedyCommLB::work(CentralLB::LDStats* _stats, int count)
                xcoord = stats->getHash(commData.sender);
                ycoord = stats->getHash(commData.receiver.get_destObj());
                if((xcoord == -1)||(ycoord == -1))
-                   if (_lb_ignoreBgLoad) continue;
+                   if (_lb_args.ignoreBgLoad()) continue;
                    else CkAbort("Error in search\n");
                add_graph(xcoord,ycoord,commData.bytes, commData.messages);
         }
index ca6418895a82a5a307da6a6559019963fd4afdd4..35eeed6da668551ce7e75e114b4d5f6c7d28d17c 100644 (file)
@@ -198,7 +198,7 @@ void GreedyLB::work(CentralLB::LDStats* stats, int count)
   HeapData *cpuData = BuildCpuArray(stats, count, &heapSize);
   HeapData *objData = BuildObjectArray(stats, count, &objCount);
 
-  if (_lb_debug) CkPrintf("In GreedyLB strategy\n",CkMyPe());
+  if (_lb_args.debug()) CkPrintf("In GreedyLB strategy\n",CkMyPe());
 
   heapSize--;
   for (obj=0; obj < objCount; obj++) {
index ef51268c9c2e558742546956ffc4cd975b1948ed..89b33ffa096346c47068d0c9411f3d07416baf3d 100644 (file)
@@ -62,7 +62,7 @@ LBDB::LBDB(): useBarrier(CmiTrue)
     obj_walltime = obj_cputime = 0;
     startLBFn_count = 0;
     predictCBFn = NULL;
-    batsync.init(this, _autoLbPeriod);         // original 1.0 second
+    batsync.init(this, _lb_args.lbperiod());           // original 1.0 second
 }
 
 LDOMHandle LBDB::AddOM(LDOMid _userID, void* _userData, 
@@ -192,7 +192,7 @@ int LBDB::ObjDataCount()
 {
   int nitems=0;
   int i;
-  if (_lb_ignoreBgLoad) {
+  if (_lb_args.ignoreBgLoad()) {
   for(i=0; i < objCount; i++)
     if (objs[i] && (objs[i])->data.migratable)
       nitems++;
@@ -207,7 +207,7 @@ int LBDB::ObjDataCount()
 
 void LBDB::GetObjData(LDObjData *dp)
 {
-  if (_lb_ignoreBgLoad) {
+  if (_lb_args.ignoreBgLoad()) {
   for(int i = 0; i < objs.length(); i++) {
     LBObj* obj = objs[i];
     if ( obj && obj->data.migratable)
index cd22acb9ade36462b476b41a04e81af658adff7a..5d076a1d38b05a588c2cff4024f22b943da2fb9c 100644 (file)
@@ -30,9 +30,7 @@ CkpvDeclare(int, hasNullLB);         /**< true if NullLB is created */
 CkpvDeclare(int, lbdatabaseInited);  /**< true if lbdatabase is inited */
 
 // command line options
-double _autoLbPeriod = 1.0;            // in seconds
-int _lb_debug=0;
-int _lb_ignoreBgLoad=0;
+CkLBArgs _lb_args;
 int _lb_predict=0;
 int _lb_predict_delay=10;
 int _lb_predict_window=20;
@@ -174,7 +172,7 @@ void _loadbalancerInit()
 
   // set up init value for LBPeriod time in seconds
   // it can also be set calling LDSetLBPeriod()
-  CmiGetArgDoubleDesc(argv,"+LBPeriod", &_autoLbPeriod,"specify the period for automatic load balancing in seconds (for non atSync mode)");
+  CmiGetArgDoubleDesc(argv,"+LBPeriod", &_lb_args.lbperiod(),"specify the period for automatic load balancing in seconds (for non atSync mode)");
 
   // now called in cldb.c: CldModuleGeneralInit()
   // registerLBTopos();
@@ -216,14 +214,15 @@ void _loadbalancerInit()
   LBSimulation::simProcs = 0;
   CmiGetArgIntDesc(argv, "+LBSimProcs", &LBSimulation::simProcs, "Number of target processors.");
 
-  _lb_debug = CmiGetArgFlagDesc(argv, "+LBDebug", "Turn on LB debugging printouts");
-  _lb_ignoreBgLoad = CmiGetArgFlagDesc(argv, "+LBObjOnly", "Load balancer only balance migratable object without considering the background load, etc");
+  _lb_args.syncResume() = CmiGetArgFlagDesc(argv, "+LBSyncResume", "LB performs a barrier after migration is finished globally");
+  _lb_args.debug() = CmiGetArgFlagDesc(argv, "+LBDebug", "Turn on LB debugging printouts");
+  _lb_args.ignoreBgLoad() = CmiGetArgFlagDesc(argv, "+LBObjOnly", "Load balancer only balance migratable object without considering the background load, etc");
   if (CkMyPe() == 0) {
-    if (_lb_debug) {
-      CmiPrintf("LB> Load balancer running with verbose mode, period time: %gs.\n", _autoLbPeriod);
+    if (_lb_args.debug()) {
+      CmiPrintf("LB> Load balancer running with verbose mode, period time: %gs.\n", _lb_args.lbperiod());
       CkPrintf("LB> Topology %s\n", _lbtopo);
     }
-    if (_lb_ignoreBgLoad)
+    if (_lb_args.ignoreBgLoad())
       CmiPrintf("LB> Load balancer only balance migratable object.\n");
     if (LBSimulation::doSimulation)
       CmiPrintf("LB> Load balancer running in simulation mode.\n");
index 224606f490e042d44555b8462286b2b33db2b867..83a9b0544a8704e8bf0c2263c6cf4467d93cba0e 100644 (file)
 #include "lbdb.h"
 
 // command line options
-extern double _autoLbPeriod;           // in seconds
-extern int _lb_debug;
-extern int _lb_ignoreBgLoad;
+class CkLBArgs
+{
+private:
+  double _autoLbPeriod;                // in seconds
+  int _lb_debug;
+  int _lb_ignoreBgLoad;
+  int _lb_syncResume;
+public:
+  CkLBArgs() {
+    _autoLbPeriod = 1.0;
+    _lb_debug = _lb_ignoreBgLoad = _lb_syncResume = 0;
+  }
+  double & lbperiod() { return _autoLbPeriod; }
+  int & debug() { return _lb_debug; }
+  int & ignoreBgLoad() { return _lb_ignoreBgLoad; }
+  int & syncResume() { return _lb_syncResume; }
+};
+extern CkLBArgs _lb_args;
+
 extern int _lb_predict;
 extern int _lb_predict_delay;
 extern int _lb_predict_window;
@@ -51,10 +67,7 @@ CkpvExtern(int, hasNullLB);
 CkpvExtern(int, lbdatabaseInited);
 
 // LB options, mostly controled by user parameter
-extern double _autoLbPeriod;
 extern "C" char * _lbtopo;
-extern int _lb_debug;
-extern int _lb_ignoreBgLoad;
 
 typedef void (*LBCreateFn)();
 typedef BaseLB * (*LBAllocFn)();
index e6e8dd6152ebe504422785d0b28bd8edaecd35e7..27b729265e37cc5ffdb578d266ccb1b36a23690b 100644 (file)
@@ -22,10 +22,10 @@ class LBObj
 friend class LBDB;
 
 public:
-  LBObj(LBDB *_parentDB, const LDObjHandle &_h, void *usr_ptr = NULL, CmiBool _migratable=CmiTrue) {
+  LBObj(LBDB *_parentDB, const LDObjHandle &_h, void *usr_ptr = NULL, CmiBool _migratable=CmiTrue, CmiBool _ignoreArrival = CmiFalse) {
     data.handle = _h;
     data.migratable = _migratable;
-    data.ignoreArrival = CmiFalse;
+    data.ignoreArrival = _ignoreArrival;
     data.cpuTime = 0.;
     data.wallTime = 0.;
     userData = usr_ptr;
index 63e72751bd21c39a9cee5ce06aeec7f2234f51b6..bac6108fd2d8836cbecc0d55fa5249f6e377db19 100644 (file)
@@ -121,7 +121,7 @@ void NborBaseLB::AtSync()
 
   if (CkMyPe() == 0) {
     start_lb_time = CmiWallTimer();
-    if (_lb_debug)
+    if (_lb_args.debug())
       CkPrintf("Load balancing step %d starting at %f\n",
               step(),start_lb_time);
   }
@@ -280,7 +280,7 @@ void NborBaseLB::ReceiveStats(CkMarshalledNLBStatsMessage &data)
     theLbdb->ClearLoads();
     if (CkMyPe() == 0) {
       double strat_end_time = CmiWallTimer();
-      if (_lb_debug)
+      if (_lb_args.debug())
         CkPrintf("Strat elapsed time %f\n",strat_end_time-strat_start_time);
     }
   }
@@ -335,7 +335,7 @@ void NborBaseLB::MigrationDone()
 #if CMK_LBDB_ON
   if (CkMyPe() == 0 && start_lb_time != 0.0) {
     double end_lb_time = CmiWallTimer();
-    if (_lb_debug)
+    if (_lb_args.debug())
       CkPrintf("Load balancing step %d finished at %f duration %f\n",
                step(),end_lb_time,end_lb_time - start_lb_time);
   }
index 5b7f4dd7e4689b16c28ba44ba9ca41f53184370b..e9564c7b59638618cc6015e7b4e12a72d7300023 100644 (file)
@@ -60,7 +60,7 @@ LBMigrateMsg* NeighborLB::Strategy(NborBaseLB::LDStats* stats, int count)
   CkVec<MigrateInfo*> migrateInfo;
 
   if (myload > avgload) {
-    if (_lb_debug
+    if (_lb_args.debug()
       CkPrintf("[%d] OVERLOAD My load is %f, average load is %f\n", CkMyPe(),myload,avgload);
 
     // First, build heaps of other processors and my objects
index 3535f87864addf3fab03f409f7c866928c6e57f4..19afed117d6ca9c79600d1f01d74e5d1700572f5 100644 (file)
@@ -100,14 +100,14 @@ ObjGraph::ObjGraph(int count, CentralLB::LDStats* _stats)
 
     Node* from_node = find_node(newedgedata.sender);
     if (from_node == 0) {
-      if (!_lb_ignoreBgLoad
+      if (!_lb_args.ignoreBgLoad()
        CkPrintf("ObjGraph::find_node: Didn't locate from node match!\n");
       continue;
     }
 
     Node* to_node = find_node(newedgedata.receiver.get_destObj());
     if (to_node == 0) {
-      if (!_lb_ignoreBgLoad
+      if (!_lb_args.ignoreBgLoad()
         CkPrintf("ObjGraph::find_node: Didn't locate to node match!\n");
       continue;
     }
index 637757323ba4e1c33737322cc9331bae2307f5e1..9fa0ea5ac64c9bc6d7c55fdf820497e49dd0bfcd 100644 (file)
@@ -254,7 +254,7 @@ void OrbLB::mapPartitionsToNodes()
   delete [] pool;
 #endif
 
-  if (_lb_debug) {
+  if (_lb_args.debug()) {
     CmiPrintf("partitions to nodes mapping: ");
     for (i=0; i<P; i++) CmiPrintf("%d ", partitions[i].node);
     CmiPrintf("\n");
@@ -344,7 +344,7 @@ void OrbLB::work(CentralLB::LDStats* stats, int count)
   // recursively divide
   rec_divide(npartition, top_partition);
 
-  if (_lb_debug) {
+  if (_lb_args.debug()) {
     CmiPrintf("After partitioning: \n");
     for (i=0; i<P; i++) {
       CmiPrintf("[%d] (%d,%d,%d) (%d,%d,%d) load:%f count:%d\n", i, partitions[i].origin[0], partitions[i].origin[1], partitions[i].origin[2], partitions[i].corner[0], partitions[i].corner[1], partitions[i].corner[2], partitions[i].load, partitions[i].count);
index 68707d633d1ef0bea75d0d7c9f57b9e9366826de..c6dc3180da400b85b6ca9dd13d4b070d6d84a02a 100644 (file)
@@ -281,7 +281,7 @@ int Refiner::multirefine()
   double dMaxOverload = maxOverload * overloadStep + overloadStart;
   int curOverload;
   int refineDone = 0;
-  if (_lb_debug)
+  if (_lb_args.debug())
     CmiPrintf("dMinOverload: %f dMaxOverload: %f\n", dMinOverload, dMaxOverload);
                                                                                 
   overLoad = dMinOverload;
@@ -303,7 +303,7 @@ int Refiner::multirefine()
       curOverload = (maxOverload + minOverload ) / 2;
                                                                                 
       overLoad = curOverload * overloadStep + overloadStart;
-      if (_lb_debug)
+      if (_lb_args.debug())
       CmiPrintf("Testing curOverload %d = %f [min,max]= %d, %d\n", curOverload, overLoad, minOverload, maxOverload);
       if (refine())
         maxOverload = curOverload;
@@ -353,7 +353,7 @@ void Refiner::Refine(int count, CentralLB::LDStats* stats,
                     next((Iterator *)&nextCompute);
     }
   }
-  if (_lb_debug) CkPrintf("Refiner: moving %d obejcts. \n", nmoves);
+  if (_lb_args.debug()) CkPrintf("Refiner: moving %d obejcts. \n", nmoves);
   delete [] computes;
   delete [] processors;
 };
index 310ce65302b2e0882c6ad7521494b91d5e5341ae..6dd68d01c39fdaf734a3b03f8c059df812bda70a 100644 (file)
@@ -335,7 +335,7 @@ int RefinerComm::refine()
     }
 
     if (bestCompute) {
-      if (_lb_debug)
+      if (_lb_args.debug())
         CkPrintf("Assign: [%d] with load: %f from %d to %d \n",
               bestCompute->Id, bestCompute->load, 
                donor->Id, bestP->Id);
@@ -343,7 +343,7 @@ int RefinerComm::refine()
       assign(bestCompute, bestP);
 
       // show the load
-      if (_lb_debug)  printLoad();
+      if (_lb_args.debug())  printLoad();
 
       // update commnication
       computeAverage();
@@ -360,7 +360,7 @@ int RefinerComm::refine()
           lightProcessors->insert((InfoRecord *) &(processors[i]));
         }
       }
-      if (_lb_debug) CmiPrintf("averageLoad after assignment: %f\n", averageLoad);
+      if (_lb_args.debug()) CmiPrintf("averageLoad after assignment: %f\n", averageLoad);
     } else {
       finish = 0;
       break;
@@ -411,10 +411,10 @@ void RefinerComm::Refine(int count, CentralLB::LDStats* stats,
   processorCommCost();
 
   removeComputes();
-  if (_lb_debug)  printLoad();
+  if (_lb_args.debug())  printLoad();
 
   computeAverage();
-  if (_lb_debug) CmiPrintf("averageLoad: %f\n", averageLoad);
+  if (_lb_args.debug()) CmiPrintf("averageLoad: %f\n", averageLoad);
 
   multirefine();
 
index a81cd10a12ae12871ea4de2fb54b677fe0c6ae49..ce36ea8cacd7d6aed390f7d0b78d155a31dbe909 100644 (file)
@@ -217,7 +217,7 @@ WSLBStatsMsg* WSLB::AssembleStats()
   msg->vacate_me = vacate;
   msg->usage = usage;
 
-  if (_lb_debug) {
+  if (_lb_args.debug()) {
     CkPrintf(
       "Proc %d speed=%d Total(wall,cpu)=%f %f Idle=%f Bg=%f %f Obj=%f %f\n",
       CkMyPe(),msg->proc_speed,msg->total_walltime,msg->total_cputime,
@@ -529,7 +529,7 @@ LBMigrateMsg* WSLB::Strategy(WSLB::LDStats* stats, int count)
 
       const int me = CkMyPe();
       // Apparently we can give this object to this processor
-      if (_lb_debug)
+      if (_lb_args.debug())
       CkPrintf("[%d] Obj %d of %d migrating from %d to %d\n",
               CkMyPe(),obj->Id,myStats.obj_data_sz,me,p->Id);