mirror of https://github.com/BOINC/boinc.git
- scheduler: finished support for job size matching.
Let x be the host speed (expressed in stdevs from mean) Let y be the job size (expressed in stdevs from mean) Decrement score by (x-y)^2 svn path=/trunk/boinc/; revision=15137
This commit is contained in:
parent
05f703559f
commit
418cce805c
|
@ -3649,3 +3649,12 @@ David May 6 2008
|
||||||
single_job_assimilator.C
|
single_job_assimilator.C
|
||||||
validate_util2.h
|
validate_util2.h
|
||||||
validator.h
|
validator.h
|
||||||
|
|
||||||
|
David May 6 2008
|
||||||
|
- scheduler: finished support for job size matching.
|
||||||
|
Let x be the host speed (expressed in stdevs from mean)
|
||||||
|
Let y be the job size (expressed in stdevs from mean)
|
||||||
|
Decrement score by (x-y)^2
|
||||||
|
|
||||||
|
sched/
|
||||||
|
sched_send.C
|
||||||
|
|
|
@ -1343,7 +1343,7 @@ struct JOB{
|
||||||
APP* app;
|
APP* app;
|
||||||
BEST_APP_VERSION* bavp;
|
BEST_APP_VERSION* bavp;
|
||||||
|
|
||||||
void get_score(SCHEDULER_REQUEST&, SCHEDULER_REPLY&);
|
bool get_score(SCHEDULER_REQUEST&, SCHEDULER_REPLY&);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct JOB_SET {
|
struct JOB_SET {
|
||||||
|
@ -1386,9 +1386,9 @@ int read_sendable_result(DB_RESULT& result) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// compute a "score" for sending this job to this host.
|
// compute a "score" for sending this job to this host.
|
||||||
// return score=0 if the WU is infeasible
|
// return false if the WU is infeasible
|
||||||
//
|
//
|
||||||
void JOB::get_score(SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply) {
|
bool JOB::get_score(SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply) {
|
||||||
bool found;
|
bool found;
|
||||||
WORKUNIT wu;
|
WORKUNIT wu;
|
||||||
int retval;
|
int retval;
|
||||||
|
@ -1402,7 +1402,7 @@ void JOB::get_score(SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply) {
|
||||||
// Find the app_version for the client's platform.
|
// Find the app_version for the client's platform.
|
||||||
//
|
//
|
||||||
bavp = get_app_version(sreq, reply, wu);
|
bavp = get_app_version(sreq, reply, wu);
|
||||||
if (!bavp) return;
|
if (!bavp) return false;
|
||||||
|
|
||||||
retval = wu_is_infeasible_fast(wu, sreq, reply, *app);
|
retval = wu_is_infeasible_fast(wu, sreq, reply, *app);
|
||||||
if (retval) {
|
if (retval) {
|
||||||
|
@ -1412,7 +1412,7 @@ void JOB::get_score(SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply) {
|
||||||
reply.host.id, wu.id, wu.name, infeasible_string(retval)
|
reply.host.id, wu.id, wu.name, infeasible_string(retval)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
score = 1;
|
score = 1;
|
||||||
|
@ -1422,8 +1422,7 @@ void JOB::get_score(SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply) {
|
||||||
if (!reply.wreq.host_info.allow_beta_work || config.distinct_beta_apps) {
|
if (!reply.wreq.host_info.allow_beta_work || config.distinct_beta_apps) {
|
||||||
if (app_not_selected(wu, sreq, reply)) {
|
if (app_not_selected(wu, sreq, reply)) {
|
||||||
if (!reply.wreq.host_info.allow_non_preferred_apps) {
|
if (!reply.wreq.host_info.allow_non_preferred_apps) {
|
||||||
score = 0;
|
return false;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (reply.wreq.host_info.allow_non_preferred_apps) {
|
if (reply.wreq.host_info.allow_non_preferred_apps) {
|
||||||
|
@ -1438,8 +1437,7 @@ void JOB::get_score(SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply) {
|
||||||
if (reply.wreq.host_info.allow_beta_work) {
|
if (reply.wreq.host_info.allow_beta_work) {
|
||||||
score += 1;
|
score += 1;
|
||||||
} else {
|
} else {
|
||||||
score = 0;
|
return false;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1460,9 +1458,19 @@ void JOB::get_score(SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply) {
|
||||||
//
|
//
|
||||||
score += bavp->host_usage.flops/1e9;
|
score += bavp->host_usage.flops/1e9;
|
||||||
|
|
||||||
|
// match large jobs to fast hosts
|
||||||
|
//
|
||||||
|
if (config.job_size_matching) {
|
||||||
|
double host_stdev = (reply.host.p_fpops - ssp->perf_info.host_fpops_mean)/ ssp->perf_info.host_fpops_stdev;
|
||||||
|
double diff = host_stdev - wu_result.fpops_size;
|
||||||
|
score -= diff*diff;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: If user has selected some apps but will accept jobs from others,
|
// TODO: If user has selected some apps but will accept jobs from others,
|
||||||
// try to send them jobs from the selected apps
|
// try to send them jobs from the selected apps
|
||||||
//
|
//
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wu_is_infeasible_slow(
|
bool wu_is_infeasible_slow(
|
||||||
|
@ -1649,7 +1657,9 @@ void send_work_matchmaker(SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply) {
|
||||||
|
|
||||||
JOB job;
|
JOB job;
|
||||||
job.index = i;
|
job.index = i;
|
||||||
job.get_score(sreq, reply);
|
if (!job.get_score(sreq, reply)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (config.debug_send) {
|
if (config.debug_send) {
|
||||||
log_messages.printf(MSG_DEBUG,
|
log_messages.printf(MSG_DEBUG,
|
||||||
"score for %s: %f\n", wu_result.workunit.name, job.score
|
"score for %s: %f\n", wu_result.workunit.name, job.score
|
||||||
|
|
Loading…
Reference in New Issue