*** empty log message ***

svn path=/trunk/boinc/; revision=9337
This commit is contained in:
David Anderson 2006-01-27 23:01:21 +00:00
parent ba6a479fb4
commit ea28080a3e
1 changed files with 59 additions and 19 deletions

View File

@ -321,7 +321,7 @@ int CLIENT_STATE::schedule_result(RESULT* rp) {
// among those that have a runnable result. // among those that have a runnable result.
// Return true iff a task was scheduled. // Return true iff a task was scheduled.
// //
bool CLIENT_STATE::schedule_largest_debt_project(double expected_pay_off) { bool CLIENT_STATE::schedule_largest_debt_project(double expected_pay_off, int cpu_index) {
PROJECT *best_project = NULL; PROJECT *best_project = NULL;
double best_debt = -MAX_DEBT; double best_debt = -MAX_DEBT;
bool first = true; bool first = true;
@ -340,6 +340,7 @@ bool CLIENT_STATE::schedule_largest_debt_project(double expected_pay_off) {
if (!best_project) return false; if (!best_project) return false;
schedule_result(best_project->next_runnable_result); schedule_result(best_project->next_runnable_result);
cpus[cpu_index].schedule_result(best_project->next_runnable_result);
best_project->anticipated_debt -= expected_pay_off; best_project->anticipated_debt -= expected_pay_off;
best_project->next_runnable_result = 0; best_project->next_runnable_result = 0;
return true; return true;
@ -348,7 +349,7 @@ bool CLIENT_STATE::schedule_largest_debt_project(double expected_pay_off) {
// Schedule the active task with the earliest deadline // Schedule the active task with the earliest deadline
// Return true iff a task was scheduled. // Return true iff a task was scheduled.
// //
bool CLIENT_STATE::schedule_earliest_deadline_result() { bool CLIENT_STATE::schedule_earliest_deadline_result(int cpu_index) {
PROJECT *best_project = NULL; PROJECT *best_project = NULL;
RESULT *best_result = NULL; RESULT *best_result = NULL;
double earliest_deadline=0; double earliest_deadline=0;
@ -360,6 +361,7 @@ bool CLIENT_STATE::schedule_earliest_deadline_result() {
if (!rp->runnable()) continue; if (!rp->runnable()) continue;
if (rp->project->non_cpu_intensive) continue; if (rp->project->non_cpu_intensive) continue;
if (rp->already_selected) continue; if (rp->already_selected) continue;
if (!rp->project->deadline_problem_count) continue;
if (first || rp->report_deadline < earliest_deadline) { if (first || rp->report_deadline < earliest_deadline) {
first = false; first = false;
best_project = rp->project; best_project = rp->project;
@ -371,7 +373,9 @@ bool CLIENT_STATE::schedule_earliest_deadline_result() {
// msg_printf(0, MSG_INFO, "earliest deadline: %f %s", earliest_deadline, best_result->name); // msg_printf(0, MSG_INFO, "earliest deadline: %f %s", earliest_deadline, best_result->name);
schedule_result(best_result); schedule_result(best_result);
cpus[cpu_index].schedule_result(best_result);
best_result->already_selected = true; best_result->already_selected = true;
--best_result->project->deadline_problem_count;
return true; return true;
} }
@ -499,7 +503,7 @@ void CLIENT_STATE::adjust_debts() {
double avg_long_term_debt = total_long_term_debt / nprojects; double avg_long_term_debt = total_long_term_debt / nprojects;
double avg_short_term_debt = 0; double avg_short_term_debt = 0;
if (nrprojects) { if (nrprojects) {
total_short_term_debt / nrprojects; avg_short_term_debt = total_short_term_debt / nrprojects;
} }
for (i=0; i<projects.size(); i++) { for (i=0; i<projects.size(); i++) {
p = projects[i]; p = projects[i];
@ -538,21 +542,46 @@ bool CLIENT_STATE::schedule_cpus() {
if (projects.size() == 0) return false; if (projects.size() == 0) return false;
if (results.size() == 0) return false; if (results.size() == 0) return false;
// the results mark must be removed before the CPUs are checked.
for (i=0; i<results.size(); i++) {
results[i]->already_selected = false;
}
// Reschedule every cpu_sched_period seconds, // Reschedule every cpu_sched_period seconds,
// or if must_schedule_cpus is set // or if must_schedule_cpus is set
// (meaning a new result is available, or a CPU has been freed). // (meaning a new result is available, or a CPU has been freed).
// //
elapsed_time = gstate.now - cpu_sched_last_time; for (i = 0; i < cpus.size(); ++i)
if (must_schedule_cpus) { {
must_schedule_cpus = false; if (cpus[i].must_schedule)
scope_messages.printf("CLIENT_STATE::schedule_cpus(): must schedule\n"); {
} else { must_schedule_cpus = true;
if (elapsed_time < (global_prefs.cpu_scheduling_period_minutes*60)) { scope_messages.printf("CLIENT_STATE::schedule_cpus(): must schedule CPU %d\n", i);
return false; }
else
{
try {
cpus[i].result->already_selected = true;
elapsed_time = gstate.now - cpus[i].sched_last_time;
if ((elapsed_time < (global_prefs.cpu_scheduling_period_minutes * 60)) && (cpus[i].result->state < RESULT_COMPUTE_ERROR)) continue;
}
catch (...) {// if there is a cpu object with a null or deleted result, we need to re-schedule.
}
scope_messages.printf("CLIENT_STATE::schedule_cpus(): time %f CPU %d\n", elapsed_time, i);
// TODO test for projects that have not recently had a checkpoint and do not let them switch.
cpus[i].must_schedule = true;
must_schedule_cpus = true;
try {
cpus[i].result->already_selected = false;
}
catch(...)
{}
} }
scope_messages.printf("CLIENT_STATE::schedule_cpus(): time %f\n", elapsed_time);
} }
if (!must_schedule_cpus)
return false;
must_schedule_cpus = false;
// mark file xfer results as completed; // mark file xfer results as completed;
// TODO: why do this here?? // TODO: why do this here??
// //
@ -564,9 +593,6 @@ bool CLIENT_STATE::schedule_cpus() {
projects[i]->next_runnable_result = NULL; projects[i]->next_runnable_result = NULL;
projects[i]->nactive_uploads = 0; projects[i]->nactive_uploads = 0;
} }
for (i=0; i<results.size(); i++) {
results[i]->already_selected = false;
}
for (i=0; i<file_xfers->file_xfers.size(); i++) { for (i=0; i<file_xfers->file_xfers.size(); i++) {
FILE_XFER* fxp = file_xfers->file_xfers[i]; FILE_XFER* fxp = file_xfers->file_xfers[i];
if (fxp->is_upload) { if (fxp->is_upload) {
@ -591,12 +617,23 @@ bool CLIENT_STATE::schedule_cpus() {
expected_pay_off = total_wall_cpu_time_this_period / ncpus; expected_pay_off = total_wall_cpu_time_this_period / ncpus;
for (j=0; j<ncpus; j++) { for (j=0; j<ncpus; j++) {
if (cpu_earliest_deadline_first) { if (cpus[j].must_schedule)
if (!schedule_earliest_deadline_result()) break; {
} else { if (cpu_earliest_deadline_first) {
assign_results_to_projects(); if (!schedule_earliest_deadline_result(j)) {
if (!schedule_largest_debt_project(expected_pay_off)) break; assign_results_to_projects();
if (!schedule_largest_debt_project(expected_pay_off, j)) break;
}
} else {
assign_results_to_projects();
if (!schedule_largest_debt_project(expected_pay_off, j)) break;
}
} }
else
{
schedule_result(cpus[j].result);
}
cpus[j].must_schedule = false;
} }
// schedule new non CPU intensive tasks // schedule new non CPU intensive tasks
@ -664,12 +701,15 @@ int CLIENT_STATE::restart_tasks() {
} }
void CLIENT_STATE::set_ncpus() { void CLIENT_STATE::set_ncpus() {
// int ncpus;
if (host_info.p_ncpus > 0) { if (host_info.p_ncpus > 0) {
ncpus = host_info.p_ncpus; ncpus = host_info.p_ncpus;
} else { } else {
ncpus = 1; ncpus = 1;
} }
if (ncpus > global_prefs.max_cpus) ncpus = global_prefs.max_cpus; if (ncpus > global_prefs.max_cpus) ncpus = global_prefs.max_cpus;
if (ncpus != cpus.size())
cpus.resize(ncpus);
} }
inline double force_fraction(double f) { inline double force_fraction(double f) {