Added lookahead scheduler.
Most scheduler now use estimated finish time instead of predicted execution time.
This commit is contained in:
@@ -24,39 +24,6 @@ namespace scheduling {
|
||||
|
||||
|
||||
|
||||
|
||||
double SufferageScheduler::_getResourceEstimatedAvailableTime(resource::ComputingResource* resource) {
|
||||
if (resource->getFreeSlotCount() > 0) {
|
||||
return 0.0;
|
||||
} else {
|
||||
// Calculating the estimated available time for resources with more than 1 slot is not trivial
|
||||
// Here we are employing a heuristic that partitions the scheduled tasks into chunks the size of the maximal slot count,
|
||||
// takes the minimum time of each chunk and adds them together.
|
||||
unsigned i = 0;
|
||||
double eat = 0;
|
||||
double minTime = -1;
|
||||
auto& tasks = scheduledTasks[resource];
|
||||
for (auto t : tasks) {
|
||||
i++;
|
||||
if (minTime < 0) {
|
||||
minTime = t->getPrediction().getExecutionTime().getValue();
|
||||
} else {
|
||||
if (i > resource->getMaxSlotCount()) {
|
||||
eat += minTime;
|
||||
i = 0;
|
||||
minTime = t->getPrediction().getExecutionTime().getValue();
|
||||
} else {
|
||||
if (t->getPrediction().getExecutionTime().getValue() < minTime) {
|
||||
minTime = t->getPrediction().getExecutionTime().getValue();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return eat;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
std::pair<wep::AtomicWepNode*, SufferageScheduler::ECTEntry> SufferageScheduler::_getNextTaskToSchedule(std::map<wep::AtomicWepNode*, ECTEntry>& estimatedTaskCompletionTimes) {
|
||||
wep::AtomicWepNode* selectedNode = nullptr;
|
||||
ECTEntry selectedEntry;
|
||||
@@ -155,22 +122,13 @@ void SufferageScheduler::_notifyWEPUpdate(SchedulerBase::WepMapEntry& wepe, std:
|
||||
auto sd = std::make_shared<SchedulingDecision>(&selectedTask.first->activity, std::get<1>(selectedTask.second), wepe.wep, reservation);
|
||||
sd->setPrediction(std::get<3>(selectedTask.second));
|
||||
selectedTask.first->activity.setInstanceStatus(wfs::ActivityInstanceStatus::Scheduled);
|
||||
scheduledTasks[sd->resource].push_back(sd);
|
||||
executeSchedulingDecision(wepe, sd, schedulerLock);
|
||||
readyToExecute.erase(selectedTask.first);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SufferageScheduler::_notifySchedulingDecisionStatusUpdate(WepMapEntry& wepe, std::shared_ptr<SchedulingDecision> sd, std::unique_lock<std::mutex>& schedulerLock) {
|
||||
auto& innerMap = scheduledTasks[sd->resource];
|
||||
for (auto i = innerMap.begin(); i != innerMap.end(); i++) {
|
||||
if (*i == sd) {
|
||||
innerMap.erase(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
void SufferageScheduler::_notifySchedulingDecisionStatusUpdate(WepMapEntry& wepe, std::shared_ptr<SchedulingDecision> sd, std::unique_lock<std::mutex>& schedulerLock) {}
|
||||
|
||||
} /* namespace scheduling */
|
||||
} /* namespace wfr */
|
||||
|
||||
Reference in New Issue
Block a user