00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "RotateLB.decl.h"
00013 #include "RotateLB.h"
00014
00015 extern int quietModeRequested;
00016
00017 CreateLBFunc_Def (RotateLB, "Rotate each object to the next higher PE")
00018
00019
00020
00021
00022 RotateLB::RotateLB (const CkLBOptions &opt) : CBase_RotateLB (opt)
00023 {
00024 lbname = "RotateLB";
00025
00026 if (CkMyPe () == 0 && !quietModeRequested) {
00027 CkPrintf ("CharmLB> RotateLB created.\n");
00028 }
00029 }
00030
00031
00032
00033
00034
00035 bool RotateLB::QueryBalanceNow (int _step)
00036 {
00037 return true;
00038 }
00039
00040
00041
00042
00043
00044 void RotateLB::work(LDStats *stats)
00045 {
00046 int proc;
00047 int obj;
00048 int dest;
00049 LDObjData *odata;
00050 int n_pes = stats->nprocs();
00051
00052
00053 for (proc = 0; proc < n_pes; proc++) {
00054 if (stats->procs[proc].available) {
00055 break;
00056 }
00057 }
00058 if (proc == n_pes) {
00059 CmiAbort ("RotateLB: no available processors!");
00060 }
00061
00062
00063 for (obj = 0; obj < stats->n_objs; obj++) {
00064 odata = &(stats->objData[obj]);
00065 if (odata->migratable) {
00066 dest = ((stats->from_proc[obj] + 1) % n_pes);
00067 while ((!stats->procs[dest].available) &&
00068 (dest != stats->from_proc[obj])) {
00069 dest = ((dest + 1) % n_pes);
00070 }
00071 if (dest != stats->from_proc[obj]) {
00072 stats->to_proc[obj] = dest;
00073
00074 }
00075 }
00076 }
00077 }
00078
00079
00080 #include "RotateLB.def.h"