I Rearranged the load balancer, so WSLB->NeighborLB, NeighborLB->NborBaseLB,
[charm.git] / src / ck-ldb / NeighborLB.h
index 045c31a2b16528f3c0ef41343498084eceea7d22..0214ce9b5901a65f8301c6b1fceaa124e42b28ca 100644 (file)
-#ifndef NEIGHBORLB_H
-#define NEIGHBORLB_H
+#ifndef _NEIGHBORLB_H_
+#define _NEIGHBORLB_H_
 
-#include <LBDatabase.h>
-#include "NeighborLB.decl.h"
+#include <math.h>
 
+#include "NborBaseLB.h"
+#include "NeighborLB.decl.h"
 
 void CreateNeighborLB();
 
-class NLBStatsMsg;
-class NLBMigrateMsg;
-
-class NeighborLB : public Group
-{
+class NeighborLB : public NborBaseLB {
 public:
   NeighborLB();
-  ~NeighborLB();
-  static void staticAtSync(void*);
-  void AtSync(void); // Everything is at the PE barrier
-
-  void ReceiveStats(NLBStatsMsg *);            // Receive stats on PE 0
-  void ResumeClients();
-  void ReceiveMigration(NLBMigrateMsg *);      // Receive migration data
-
-  // Migrated-element callback
-  static void staticMigrated(void* me, LDObjHandle h);
-  void Migrated(LDObjHandle h);
-
-  void MigrationDone(void);  // Call when migration is complete
-  int step() { return mystep; };
-
-  struct MigrateInfo {  // Used in NLBMigrateMsg
-    LDObjHandle obj;
-    int from_pe;
-    int to_pe;
-  };
-
-  struct LDStats {  // Passed to Strategy
-    int from_pe;
-    double total_walltime;
-    double total_cputime;
-    double idletime;
-    double bg_walltime;
-    double bg_cputime;
-    double obj_walltime;
-    double obj_cputime;
-    int proc_speed;
-  };
-
-protected:
-  virtual CmiBool QueryBalanceNow(int) { return CmiTrue; };  
-  virtual NLBMigrateMsg* Strategy(LDStats* stats,int count);
-
+private:
+  CmiBool QueryBalanceNow(int step) { return CmiTrue; };
   virtual int num_neighbors() {
-    if (CmiNumPes() > 2) return 2;
-    else return (CmiNumPes()-1);
+    return (CkNumPes() > 5) ? 4 : (CkNumPes()-1);
   };
-
   virtual void neighbors(int* _n) {
-    _n[0] = (CmiMyPe() + CmiNumPes() -1) % CmiNumPes();
-    _n[1] = (CmiMyPe() + 1) % CmiNumPes();
+    const int me = CkMyPe();
+    const int npe = CkNumPes();
+    if (npe > 1)
+      _n[0] = (me + npe - 1) % npe;
+    if (npe > 2)
+      _n[1] = (me + 1) % npe;
+
+    int bigstep = (npe - 1) / 3 + 1;
+    if (bigstep == 1) bigstep++;
+
+    if (npe > 3)
+      _n[2] = (me + bigstep) % npe;
+    if (npe > 4)
+      _n[3] = (me + npe - bigstep) % npe;
   };
 
-  LBDatabase* theLbdb;
-  struct {
-    int proc_speed;
-    double total_walltime;
-    double total_cputime;
-    double idletime;
-    double bg_walltime;
-    double bg_cputime;
-    int obj_data_sz;
-    LDObjData* objData;
-    int comm_data_sz;
-    LDCommData* commData;
-    double obj_walltime;
-    double obj_cputime;
-  } myStats;
-
-private:
-  void FindNeighbors();
-  NLBStatsMsg* AssembleStats();
-
-  int mystep;
-  int stats_msg_count;
-  NLBStatsMsg** statsMsgsList;
-  LDStats* statsDataList;
-  int migrates_completed;
-  int migrates_expected;
-  NLBMigrateMsg** mig_msgs;
-  int mig_msgs_received;
-  int mig_msgs_expected;
-  int* neighbor_pes;
-  int receive_stats_ready;
-  double start_lb_time;
+  NLBMigrateMsg* Strategy(NborBaseLB::LDStats* stats, int count);
 };
 
-class NLBStatsMsg : public CMessage_NLBStatsMsg {
-public:
-  int from_pe;
-  int serial;
-  int proc_speed;
-  double total_walltime;
-  double total_cputime;
-  double idletime;
-  double bg_walltime;
-  double bg_cputime;
-  double obj_walltime;
-  double obj_cputime;
-}; 
-
-class NLBMigrateMsg : public CMessage_NLBMigrateMsg {
-public:
-  int n_moves;
-  NeighborLB::MigrateInfo* moves;
-
-  // Other methods & data members 
-  
-  static void* alloc(int msgnum, size_t size, int* array, int priobits); 
-  static void* pack(NLBMigrateMsg* in); 
-  static NLBMigrateMsg* unpack(void* in); 
-}; 
-
-#endif /* NEIGHBORLB_H */
+#endif /* _NeighborLB_H_ */