From a243be6b0e0af216b0bd53bc82d6cd315d43b181 Mon Sep 17 00:00:00 2001 From: Aberrahmane Sider Date: Mon, 2 May 2011 15:12:17 +0100 Subject: [PATCH] Added Least Load Neighbors and another bulk algorithm --- loba_bulk.cpp | 78 +++++++++++++++++++++++++++++++++++++++++++++++++-- options.cpp | 5 +++- 2 files changed, 80 insertions(+), 3 deletions(-) diff --git a/loba_bulk.cpp b/loba_bulk.cpp index 9af50cf..f5ec64e 100644 --- a/loba_bulk.cpp +++ b/loba_bulk.cpp @@ -1,4 +1,5 @@ #include +#include XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(loba); @@ -6,8 +7,81 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(loba); void loba_bulk::load_balance() { - // write code here... - xbt_die("Load-balancing algorithm \"bulk\" not implemented!"); + float myLoad = get_load(); + + unsigned NbNwMinLoad = 0; + unsigned NbNwLowerLoad = 0; + unsigned NbNeighbours = pneigh.size(); + + double *S = new double[NbNeighbours]; + for (unsigned i = 0; i < NbNeighbours; i++) + S[i] = 0.0; + //What is the minimum and maximum load under myLoad? + float minLoad = myLoad; + for (unsigned i = 0; i < NbNeighbours; i++) { + if (pneigh[i]->get_load() < minLoad) { + minLoad = pneigh[i]->get_load(); + } + if (pneigh[i]->get_load() < myLoad) { + NbNwLowerLoad++; + } + } + for (unsigned i = 0; i < NbNeighbours; i++) + if (pneigh[i]->get_load() == minLoad) + NbNwMinLoad++; + + float maxLoad = minLoad; + for (unsigned i = 0; i < NbNeighbours; i++) { + if (pneigh[i]->get_load() > minLoad && pneigh[i]->get_load() < myLoad) + if (maxLoad < pneigh[i]->get_load()) + maxLoad = pneigh[i]->get_load(); + } + + double alpha = 0.0; + + if (NbNwLowerLoad && NbNwMinLoad < NbNwLowerLoad) //There is one or many neighbors with minimum load but not all neighbors have minimum load + alpha = (1. / ((double) NbNwMinLoad + 2)); + if (NbNwMinLoad == NbNwLowerLoad) //All neighbors have minimum load + alpha = (1. / ((double) NbNwMinLoad + 1)); + float myS = 0.; + //There exist underloaded neighbors + if (NbNwMinLoad && myLoad != 0.0) { + for (unsigned i = 0; i < NbNeighbours; i++) { + if (pneigh[i]->get_load() == minLoad) { + S[i] = floor(alpha * (myLoad - minLoad)); + myS += S[i]; + } else { + if (pneigh[i]->get_load() < myLoad) { + S[i] = floor(alpha * (myLoad - pneigh[i]->get_load())); + myS += S[i]; + } + } + } + //Check assumption 4.2 (b) page 520 + bool HaveToCorrectS = false; + for (unsigned i = 0; i < NbNeighbours; i++) { + if (pneigh[i]->get_load() < myLoad) { // + //Condition 4.6 + if ((myLoad - myS) < (pneigh[i]->get_load() + S[i])) { + HaveToCorrectS = true; + } + } + } + if (HaveToCorrectS) { + for (unsigned i = 0; i < NbNeighbours; i++) { + while (((myLoad - myS) < pneigh[i]->get_load() + S[i]) && (S[i] > 0)) { + myS -= 1.0; + S[i] -= 1.0; + } + } + } + }//End there are underloaded neighbors; + for (unsigned i = 0 ; i < NbNeighbours ; i++) { + send(pneigh[i], S[i]); + XBT_DEBUG("sent to %s", pneigh[i]->get_name()); + } + + delete[] S; } // Local variables: diff --git a/options.cpp b/options.cpp index 9b1344a..3e0f92d 100644 --- a/options.cpp +++ b/options.cpp @@ -13,6 +13,7 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(main); #include "loba_besteffort.h" #include "loba_bulk.h" #include "loba_fairstrategy.h" +#include "loba_lln.h" #include "loba_makhoul.h" #include "loba_makhoul2.h" #include "loba_simple.h" @@ -80,10 +81,12 @@ namespace opt { { NOL_INSERT("besteffort", "balance with best effort strategy", loba_besteffort); - NOL_INSERT("bulk", "describe your algorithm here...", + NOL_INSERT("bulk", "A multi-load-units assignation rule without ordering...", loba_bulk); NOL_INSERT("fairstrategy", "balance with fair strategy", loba_fairstrategy); + NOL_INSERT("lln", "Balance with less loaded neighbors without ordering-bulk method", + loba_lln); NOL_INSERT("makhoul", "balance with Makhoul's PhD algorithm", loba_makhoul); NOL_INSERT("makhoul2", "balance with Makhoul's source code", -- 2.39.5