00001
00002 #include "BlockLB.decl.h"
00003 #include "BlockLB.h"
00004 #include <math.h>
00005
00006 extern int quietModeRequested;
00007
00008 CreateLBFunc_Def (BlockLB, "Allocate objects in blocks to the remaining valid PE")
00009
00010
00011
00012
00013 BlockLB::BlockLB (const CkLBOptions &opt) : CBase_BlockLB (opt)
00014 {
00015 lbname = "BlockLB";
00016
00017 if (CkMyPe () == 0 && !quietModeRequested) {
00018 CkPrintf("CharmLB> BlockLB created.\n");
00019 }
00020 }
00021
00022
00023
00024
00025
00026 bool BlockLB::QueryBalanceNow (int _step)
00027 {
00028 return true;
00029 }
00030
00031
00032
00033
00034
00035 void BlockLB::work (LDStats *stats)
00036 {
00037 int proc;
00038 int obj;
00039 int dest;
00040 LDObjData *odata;
00041
00042
00043
00044 int validProcs=0;
00045 int *mapValidToAbsolute = new int[stats->nprocs()];
00046 for (proc = 0; proc < stats->nprocs(); proc++) {
00047 if (stats->procs[proc].available) {
00048 mapValidToAbsolute[validProcs] = proc;
00049 validProcs++;
00050 }
00051 }
00052 if (validProcs == 0) {
00053 CmiAbort ("BlockLB: no available processors!");
00054 }
00055
00056 int objsPerProcessor_floor = stats->n_objs/validProcs;
00057 int remainder = stats->n_objs % validProcs;
00058 int markidx = remainder * (objsPerProcessor_floor + 1);
00059
00060
00061 int validDest;
00062
00063 for (obj = 0; obj < stats->n_objs; obj++) {
00064 odata = &(stats->objData[obj]);
00065 const CmiUInt8& objID = odata->objID();
00066 if (odata->migratable) {
00067 CkGroupID locMgrGid;
00068 locMgrGid.idx = odata->omHandle().id.id.idx;
00069 CkLocMgr *localLocMgr = (CkLocMgr *) CkLocalBranch(locMgrGid);
00070 CkArrayIndex arr_idx = localLocMgr->lookupIdx(objID);
00071 int idx = arr_idx.data()[0];
00072 if (idx < markidx) {
00073 validDest = idx / (objsPerProcessor_floor + 1);
00074 } else {
00075 validDest = ((idx - markidx) / objsPerProcessor_floor) + remainder;
00076 }
00077 dest = mapValidToAbsolute[validDest];
00078 stats->to_proc[obj] = dest;
00079
00080 }
00081 }
00082
00083 delete [] mapValidToAbsolute;
00084 }
00085
00086
00087 #include "BlockLB.def.h"