00001
00002 #include "BlockLB.decl.h"
00003 #include "BlockLB.h"
00004
00005
00006 CreateLBFunc_Def (BlockLB, "Allocate objects in blocks to the remaining valid PE")
00007
00008
00009
00010
00011 BlockLB::BlockLB (const CkLBOptions &opt) : CentralLB (opt)
00012 {
00013 lbname = "BlockLB";
00014
00015 if (CkMyPe () == 0) {
00016 CkPrintf ("[%d] BlockLB created\n", CkMyPe ());
00017 }
00018 }
00019
00020
00021
00022
00023
00024 CmiBool BlockLB::QueryBalanceNow (int _step)
00025 {
00026 return CmiTrue;
00027 }
00028
00029
00030
00031
00032
00033 void BlockLB::work (LDStats *stats)
00034 {
00035 int proc;
00036 int obj;
00037 int dest;
00038 LDObjData *odata;
00039
00040
00041
00042 int validProcs=0;
00043 int *mapValidToAbsolute = new int[stats->nprocs()];
00044 for (proc = 0; proc < stats->nprocs(); proc++) {
00045 if (stats->procs[proc].available) {
00046 mapValidToAbsolute[validProcs] = proc;
00047 validProcs++;
00048 }
00049 }
00050 if (validProcs == 0) {
00051 CmiAbort ("BlockLB: no available processors!");
00052 }
00053
00054 int objsPerProcessor = stats->n_objs/validProcs;
00055
00056 for (obj = 0; obj < stats->n_objs; obj++) {
00057 odata = &(stats->objData[obj]);
00058 const LDObjid& objID = odata->objID();
00059 if (odata->migratable) {
00060 int idx = objID.id[0];
00061 int validDest = idx/objsPerProcessor;
00062 validDest = validDest % validProcs;
00063 dest = mapValidToAbsolute[validDest];
00064 stats->to_proc[obj] = dest;
00065
00066 }
00067 }
00068
00069 delete [] mapValidToAbsolute;
00070 }
00071
00072
00073 #include "BlockLB.def.h"