GreenCloud Simulator
herosscheduler.cc
Go to the documentation of this file.
1 /*
2  * herosscheduler.cc
3  *
4  * Created on: Jan 23, 2014
5  * Author: Guzek:Mateusz
6  */
7 
8 #include "herosscheduler.h"
9 #include "dcrack.h"
10 
12 
13 
14 }
15 
17 
18 }
19 
20 
22  double result = 0;
23 
24  result = herosTransformation(rp,110,0.90,1.2);
25 // std::cerr << "Heros transformation result" << result << "\n";
26  result *= pow(linkLoadFactor(rp->getRootHost()->rack_->link_load),2);
27 // std::cerr << "Final result" << result << "\n";
28  return result;
29 }
30 
31 
32 double HerosScheduler::densLoadFactor(double load,double epsilon){
33  return 1/(1+exp(-10*(load-0.5))) - 1/(1+exp((-10/epsilon)*(load-(1-(epsilon/2)))));
34 }
35 
37  if(rp->getRootHost()->eCurrentConsumption_==0)
38  {
39  return 0;
40  }
42 }
43 
45 
46  double result = rp->getTotalCap(Computing) / rp->getRootHost()->powerModel->getMaxPower();
47  // std::cerr << "Ppw max: " <<result << "\n";
48  return result;
49 }
50 
51 double HerosScheduler::herosTransformation(ResourceProvider* rp,double alpha, double beta, double gamma){
52 
53  double maxl = rp->getTotalCap(Computing);
54  // std::cerr << "Ppw current: " <<performancePerWatt(rp) << "\n";
55  double result = performancePerWatt(rp);
56  if(rp->getResTypeUtil(Computing) > beta/2){
57  result -= gamma * performancePerWatt(rp) *
58  1/
59  (
60  1+exp
61  (
62  -(alpha/maxl)*(rp->getResTypeUtil(Computing)*maxl - (beta * maxl ) )
63  )
64  );
65  }
66 
67  return result;
68 }
69 
70 double HerosScheduler::linkLoadFactor(double load){
71  return exp(-(pow(2*load,2)));
72 }
73 
74 
75 
76 TskComAgent* HerosScheduler::scheduleTask(CloudTask* task, std::vector<ResourceProvider* > providers){
77  // std::cerr<< "HEROS is making decision:\n";
78  vector<ProviderScore> scored_providers_;
79  vector <ResourceProvider*>::iterator iter;
80  for (iter = providers.begin(); iter!=providers.end(); iter++)
81  {
82  if ((*iter)->testSchedulingPossibility(task)){
83  scored_providers_.push_back(ProviderScore((*iter),calculateScore((*iter)),linkLoadFactor((*iter)->getRootHost()->rack_->link_load)));
84  }
85  }
86  if(scored_providers_.empty()){
87  return NULL;
88  } else {
89  vector <ProviderScore>::iterator sp;
90  sort(scored_providers_.begin(),scored_providers_.end(),herosComparator);
91  vector<ProviderScore>::reverse_iterator rsp = scored_providers_.rbegin();
92  ProviderScore best = *rsp;
93  int max_n = 0;
94  for (; rsp != scored_providers_.rend(); rsp++ ) {
95  if(!herosComparator((*rsp),best)){
96  ++max_n;
97  } else {
98  break;
99  }
100  }
101  if(max_n!=1){
102  int selected = (double)rand() / (double)RAND_MAX * max_n +1;
103  best = scored_providers_.at(scored_providers_.size()-selected);
104  }
105 
106  scored_providers_.clear();
107 // std::cerr<< "Selected prov: " << best.provider_->id_ << "\tScore:" << best.score_ <<"\tSelected task:" << task->id_ << "\n";
108 
109  return best.provider_->getTskComAgent();
110  }
111 }
112 
113 bool herosComparator (const ProviderScore &first,const ProviderScore &second){
114  if(first.score_ != second.score_){
115  return first.score_ < second.score_;
116  } else {
118  }
119 }
120 
double comm_potential_
Definition: providerscore.h:18
virtual double calculateScore(ResourceProvider *rp)
static double densLoadFactor(double load, double epsilon)
virtual ~HerosScheduler()
double getResTypeUtil(res_type type)
double getTotalCap(res_type type)
virtual double getMaxPower()=0
TskComAgent * getTskComAgent()
static double performancePerWatt(ResourceProvider *rp)
DcRack * rack_
Definition: dchost.h:33
static double performancePerWattMax(ResourceProvider *rp)
static double herosTransformation(ResourceProvider *rp, double alpha, double beta, double gamma)
static double linkLoadFactor(double load)
virtual TskComAgent * scheduleTask(CloudTask *task, std::vector< ResourceProvider * > providers)
double link_load
Definition: dcrack.h:17
double eCurrentConsumption_
Definition: dchost.h:41
PowerModel * powerModel
Definition: dchost.h:34
bool herosComparator(const ProviderScore &first, const ProviderScore &second)
ResourceProvider * provider_
Definition: providerscore.h:16