00001
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef LDBCOORDINATOR_H
00015 #define LDBCOORDINATOR_H
00016
00017 #include <stdio.h>
00018
00019 #include <charm++.h>
00020 #include <LBDatabase.h>
00021
00022 #include "NamdTypes.h"
00023 #include "BOCgroup.h"
00024 #include "LdbCoordinator.decl.h"
00025
00026 class PatchMap;
00027 class ComputeMap;
00028 class Controller;
00029 class Sequencer;
00030 class computeInfo;
00031 class patchInfo;
00032 class processorInfo;
00033
00034 enum {LDB_PATCHES = 4096};
00035 enum {LDB_COMPUTES = 16384};
00036 enum {COMPUTEMAX = 16384};
00037 enum {PATCHMAX = 4096};
00038 enum {PROCESSORMAX = 512};
00039
00040 void LdbCoordinator_initproc();
00041
00042 class LdbCoordinator : public BOCclass
00043 {
00044 public:
00045 LdbCoordinator();
00046 ~LdbCoordinator(void);
00047 static LdbCoordinator *Object() {
00048 return CkpvAccess(LdbCoordinator_instance);
00049 }
00050
00051 void initialize(PatchMap *pmap, ComputeMap *cmap, int reinit=0);
00052 void createLoadBalancer();
00053 void patchLoad(PatchID id, int nAtoms, int timestep);
00054
00055 void startWork(const LDObjHandle &handle) {
00056 theLbdb->ObjectStart(handle);
00057 }
00058 void pauseWork(const LDObjHandle &handle) {
00059 theLbdb->ObjectStop(handle);
00060 }
00061 void skipWork(const LDObjHandle &handle) {
00062 nComputesReported++;
00063 }
00064 void endWork(const LDObjHandle &handle) {
00065 theLbdb->ObjectStop(handle);
00066 nComputesReported++;
00067 }
00068
00069 void rebalance(Sequencer *seq, PatchID id);
00070 void rebalance(Controller *seq);
00071 void nodeDone(CkReductionMsg *);
00072 void updateComputesReady();
00073 void barrier(void);
00074 void resume(void);
00075 void resumeReady(CkQdMsg *msg);
00076 void resume2(void);
00077 int getNumStepsToRun(void) { return numStepsToRun; }
00078 static void staticMigrateFn(LDObjHandle handle, int dest);
00079 static void staticStatsFn(LDOMHandle h, int state);
00080 static void staticQueryEstLoadFn(LDOMHandle h);
00081 static void staticReceiveAtSync(void* data);
00082 static void staticResumeFromSync(void* data);
00083 void ReceiveAtSync(void);
00084 void Migrate(LDObjHandle handle, int dest);
00085 void RecvMigrate(LdbMigrateMsg*);
00086 void ExpectMigrate(LdbMigrateMsg*);
00087 void ResumeFromSync(void);
00088
00089 public:
00090 void ExecuteMigrations(void);
00091 void awakenSequencers(void);
00092 int requiredProxies(PatchID id, int []);
00093 void printRequiredProxies(PatchID id, FILE *fp);
00094 void printLocalLdbReport(void);
00095
00096 int stepsPerLdbCycle;
00097 int nLocalComputes;
00098 int nLocalPatches;
00099 int nPatchesReported;
00100 int nPatchesExpected;
00101 int nComputesReported;
00102 int nComputesExpected;
00103 int controllerReported;
00104 int controllerExpected;
00105 int nStatsMessagesReceived;
00106 int nStatsMessagesExpected;
00107 ComputeMap *computeMap;
00108 PatchMap *patchMap;
00109 int *patchNAtoms;
00110 int nPatches;
00111 Controller *controllerThread;
00112 Sequencer **sequencerThreads;
00113
00114 int ldbCycleNum;
00115 int numStepsToRun;
00116
00117 int firstLdbStep;
00118 int totalStepsDone;
00119
00120 int takingLdbData;
00121
00122 FILE *ldbStatsFP;
00123 computeInfo *computeArray;
00124 patchInfo *patchArray;
00125 processorInfo *processorArray;
00126 LBDatabase *theLbdb;
00127 LDOMid myOMid;
00128 LDOMHandle myHandle;
00129 LdbMigrateMsg *migrateMsgs;
00130 int numComputes;
00131 int nRegisteredObjs;
00132 LDBarrierClient ldBarrierHandle;
00133 int reg_all_objs;
00134 LDObjHandle* patchHandles;
00135 };
00136
00137 class LdbMigrateMsg : public CMessage_LdbMigrateMsg
00138 {
00139 public:
00140 LDObjHandle handle;
00141 int from;
00142 int to;
00143 LdbMigrateMsg *next;
00144 };
00145
00146
00147 #endif // LDBCOORDINATOR_H
00148