// Decide what jobs to include in the simulation; // build the "pending" lists for each (project, processor type) pair. // NOTE: "results" is sorted by increasing arrival time. // void RR_SIM::init_pending_lists() { for (unsigned int i=0; i<gstate.projects.size(); i++) { PROJECT* p = gstate.projects[i]; for (int j=0; j<coprocs.n_rsc; j++) { p->rsc_pwf[j].pending.clear(); p->rsc_pwf[j].queue_est = 0; } } for (unsigned int i=0; i<gstate.results.size(); i++) { RESULT* rp = gstate.results[i]; rp->rr_sim_misses_deadline = false; rp->already_selected = false; if (!rp->nearly_runnable()) continue; if (rp->some_download_stalled()) continue; if (rp->project->non_cpu_intensive) continue; rp->rrsim_flops_left = rp->estimated_flops_remaining(); //if (rp->rrsim_flops_left <= 0) continue; // job may have fraction_done=1 but not be done; // if it's past its deadline, we need to mark it as such PROJECT* p = rp->project; p->pwf.n_runnable_jobs++; p->rsc_pwf[0].nused_total += rp->avp->avg_ncpus; set_rrsim_flops(rp); int rt = rp->avp->gpu_usage.rsc_type; if (rt) { p->rsc_pwf[rt].nused_total += rp->avp->gpu_usage.usage; p->rsc_pwf[rt].n_runnable_jobs++; p->rsc_pwf[rt].queue_est += rp->rrsim_flops_left/rp->rrsim_flops; } p->rsc_pwf[rt].pending.push_back(rp); rp->rrsim_done = false; } }
// choose a project to fetch work from, // and set the request fields of resource objects. // PROJECT* WORK_FETCH::choose_project( bool strict_hyst, PROJECT* backoff_exempt_project ) { PROJECT* p; if (log_flags.work_fetch_debug) { msg_printf(0, MSG_INFO, "[work_fetch] work fetch start"); } p = non_cpu_intensive_project_needing_work(); if (p) return p; gstate.compute_nuploading_results(); rr_simulation(); compute_shares(); project_priority_init(true); // Decrement the priority of projects that have a lot of work queued. // Specifically, subtract // (FLOPs queued for P)/(FLOPs of max queue) // which will generally be between 0 and 1. // This is a little arbitrary but I can't think of anything better. // double max_queued_flops = gstate.work_buf_total()*total_peak_flops(); for (unsigned int i=0; i<gstate.results.size(); i++) { RESULT* rp = gstate.results[i]; p = rp->project; p->sched_priority -= rp->estimated_flops_remaining()/max_queued_flops; } p = 0; if (gpus_usable) { for (int i=1; i<coprocs.n_rsc; i++) { p = rsc_work_fetch[i].choose_project_hyst(strict_hyst, backoff_exempt_project); if (p) break; } } if (!p) { p = rsc_work_fetch[0].choose_project_hyst(strict_hyst, backoff_exempt_project); } if (log_flags.work_fetch_debug) { print_state(); if (!p) { msg_printf(0, MSG_INFO, "[work_fetch] No project chosen for work fetch"); } } return p; }