|
@@ -215,7 +215,7 @@ static void compute_all_performance_predictions(struct starpu_task *task,
|
|
|
double *best_exp_endp,
|
|
|
double local_data_penalty[STARPU_NMAXWORKERS][STARPU_MAXIMPLEMENTATIONS],
|
|
|
double local_power[STARPU_NMAXWORKERS][STARPU_MAXIMPLEMENTATIONS],
|
|
|
- int *forced_best,
|
|
|
+ int *forced_worker, unsigned int *forced_impl,
|
|
|
struct starpu_task_bundle *bundle,
|
|
|
unsigned int *nimpls)
|
|
|
{
|
|
@@ -223,6 +223,7 @@ static void compute_all_performance_predictions(struct starpu_task *task,
|
|
|
double max_exp_end = DBL_MIN;
|
|
|
double best_exp_end = DBL_MAX;
|
|
|
int ntasks_best = -1;
|
|
|
+ unsigned int nimpl_best = 0;
|
|
|
double ntasks_best_end = 0.0;
|
|
|
|
|
|
/* A priori, we know all estimations */
|
|
@@ -274,6 +275,7 @@ static void compute_all_performance_predictions(struct starpu_task *task,
|
|
|
) {
|
|
|
ntasks_best_end = ntasks_end;
|
|
|
ntasks_best = worker;
|
|
|
+ nimpl_best = nimpl;
|
|
|
}
|
|
|
|
|
|
if (local_task_length[worker][nimpl] == -1.0)
|
|
@@ -305,7 +307,8 @@ static void compute_all_performance_predictions(struct starpu_task *task,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- *forced_best = unknown?ntasks_best:-1;
|
|
|
+ *forced_worker = unknown?ntasks_best:-1;
|
|
|
+ *forced_impl = unknown?nimpl_best:-1;
|
|
|
|
|
|
*best_exp_endp = best_exp_end;
|
|
|
*max_exp_endp = max_exp_end;
|
|
@@ -319,7 +322,8 @@ static int _heft_push_task(struct starpu_task *task, unsigned prio)
|
|
|
|
|
|
/* this flag is set if the corresponding worker is selected because
|
|
|
there is no performance prediction available yet */
|
|
|
- int forced_best;
|
|
|
+ int forced_worker;
|
|
|
+ unsigned int forced_impl;
|
|
|
|
|
|
double local_task_length[nworkers][STARPU_MAXIMPLEMENTATIONS];
|
|
|
double local_data_penalty[nworkers][STARPU_MAXIMPLEMENTATIONS];
|
|
@@ -340,13 +344,15 @@ static int _heft_push_task(struct starpu_task *task, unsigned prio)
|
|
|
compute_all_performance_predictions(task, local_task_length, exp_end,
|
|
|
&max_exp_end, &best_exp_end,
|
|
|
local_data_penalty,
|
|
|
- local_power, &forced_best, bundle,
|
|
|
- nimpls);
|
|
|
+ local_power, &forced_worker, &forced_impl,
|
|
|
+ bundle, nimpls);
|
|
|
|
|
|
/* If there is no prediction available for that task with that arch we
|
|
|
* want to speed-up calibration time so we force this measurement */
|
|
|
- if (forced_best != -1)
|
|
|
- return push_task_on_best_worker(task, forced_best, 0.0, 0.0, prio);
|
|
|
+ if (forced_worker != -1) {
|
|
|
+ _starpu_get_job_associated_to_task(task)->nimpl = forced_impl;
|
|
|
+ return push_task_on_best_worker(task, forced_worker, 0.0, 0.0, prio);
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* Determine which worker optimizes the fitness metric which is a
|