]> AND Private Git Repository - loba.git/blob - loba_bulk.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
Use static instead of volatile for variables that may be clobbered by a TRY..CATCH.
[loba.git] / loba_bulk.cpp
1 #include <cmath>
2 #include <xbt/log.h>
3
4 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(loba);
5
6 #include "loba_bulk.h"
7
8 void loba_bulk::load_balance()
9 {
10     float myLoad = get_load();
11
12     unsigned NbNwMinLoad = 0;
13     unsigned NbNwLowerLoad = 0;
14     unsigned NbNeighbours = pneigh.size();
15
16     double *S = new double[NbNeighbours];
17     for (unsigned i = 0; i < NbNeighbours; i++)
18         S[i] = 0.0;
19
20     // What is the minimum and maximum load under myLoad?
21     float minLoad = myLoad;
22     for (unsigned i = 0; i < NbNeighbours; i++) {
23         if (pneigh[i]->get_load() < minLoad) {
24             minLoad = pneigh[i]->get_load();
25         }
26         if (pneigh[i]->get_load() < myLoad) {
27             NbNwLowerLoad++;
28         }
29     }
30     for (unsigned i = 0; i < NbNeighbours; i++)
31         if (pneigh[i]->get_load() == minLoad)
32             NbNwMinLoad++;
33
34     float maxLoad = minLoad;
35     for (unsigned i = 0; i < NbNeighbours; i++) {
36         if (pneigh[i]->get_load() > minLoad && pneigh[i]->get_load() < myLoad)
37             if (maxLoad < pneigh[i]->get_load())
38                 maxLoad = pneigh[i]->get_load();
39     }
40
41     double alpha = 0.0;
42
43     if (NbNwLowerLoad && NbNwMinLoad < NbNwLowerLoad) {
44         // There is one or many neighbors with minimum load but not
45         // all neighbors have minimum load
46         alpha = (1. / ((double) NbNwMinLoad + 2));
47     }
48     if (NbNwMinLoad == NbNwLowerLoad) {
49         // All neighbors have minimum load
50         alpha = (1. / ((double) NbNwMinLoad + 1));
51     }
52     float myS = 0.;
53     // There exist underloaded neighbors
54     if (NbNwMinLoad && myLoad != 0.0) {
55         for (unsigned i = 0; i < NbNeighbours; i++) {
56             if (pneigh[i]->get_load() == minLoad) {
57                 S[i] = std::floor(alpha * (myLoad - minLoad));
58                 myS += S[i];
59             } else {
60                 if (pneigh[i]->get_load() < myLoad) {
61                     S[i] = std::floor(alpha * (myLoad - pneigh[i]->get_load()));
62                     myS += S[i];
63                 }
64             }
65         }
66         // Check assumption 4.2 (b) page 520
67         bool HaveToCorrectS = false;
68         for (unsigned i = 0; i < NbNeighbours; i++) {
69             if (pneigh[i]->get_load() < myLoad) {
70                 // Condition 4.6
71                 if ((myLoad - myS) < (pneigh[i]->get_load() + S[i])) {
72                     HaveToCorrectS = true;
73                 }
74             }
75         }
76         if (HaveToCorrectS) {
77             for (unsigned i = 0; i < NbNeighbours; i++) {
78                 while (((myLoad - myS) < pneigh[i]->get_load() + S[i])
79                        && (S[i] > 0)) {
80                     myS -= 1.0;
81                     S[i] -= 1.0;
82                 }
83             }
84         }
85     } // End there are underloaded neighbors;
86     for (unsigned i = 0; i < NbNeighbours; i++) {
87         send(pneigh[i], S[i]);
88         XBT_DEBUG("sent to %s", pneigh[i]->get_name());
89     }
90
91     delete[] S;
92 }
93
94 // Local variables:
95 // mode: c++
96 // End: