Browse Source

The _starpu_worker_get_relative_speedup function now takes a starpu_perf_arch
type instead of the worker id: this makes it possible to only use the
starpu_perf_arch to predict execution time (we don't have to compute it
multiple time for the same starpu_perf_arch anymore).

Cédric Augonnet 14 years ago
parent
commit
3096ff03f4

+ 24 - 23
src/core/perfmodel/perfmodel.c

@@ -82,38 +82,39 @@ static double per_arch_task_expected_length(struct starpu_perfmodel_t *model, en
  * Common model
  */
 
-double _starpu_worker_get_relative_speedup(int workerid)
+double _starpu_worker_get_relative_speedup(enum starpu_perf_archtype perf_archtype)
 {
-	double alpha;
-	enum starpu_archtype arch = starpu_worker_get_type(workerid);
-
-	switch (arch) {
-		case STARPU_CPU_WORKER:
-			alpha = STARPU_CPU_ALPHA;
-			break;
-		case STARPU_CUDA_WORKER:
-			alpha = STARPU_CUDA_ALPHA;
-			break;
-	        case STARPU_OPENCL_WORKER:
-                        alpha = STARPU_OPENCL_ALPHA;
-                        break;
-		default:
-			/* perhaps there are various worker types on that queue */
-			alpha = 1.0; // this value is not significant ...
-			break;
+	if (perf_archtype < STARPU_CUDA_DEFAULT)
+	{
+		return STARPU_CPU_ALPHA;
+	}
+	else if (perf_archtype < STARPU_OPENCL_DEFAULT)
+	{
+		return STARPU_CUDA_ALPHA;
+	}
+	else if (perf_archtype < STARPU_GORDON_DEFAULT)
+	{
+		return STARPU_OPENCL_ALPHA;
+	}
+	else if (perf_archtype < STARPU_NARCH_VARIATIONS) {
+		/* Gordon value */
+		return 1.0;
 	}
 
-	return alpha;
+	STARPU_ABORT();
+
+	/* Never reached ! */
+	return -1.0;
 }
 
-static double common_task_expected_length(struct starpu_perfmodel_t *model, int workerid, struct starpu_task *task)
+static double common_task_expected_length(struct starpu_perfmodel_t *model, enum starpu_perf_archtype arch, struct starpu_task *task)
 {
 	double exp;
 	double alpha;
 
 	if (model->cost_model) {
 		exp = model->cost_model(task->buffers);
-		alpha = _starpu_worker_get_relative_speedup(workerid);
+		alpha = _starpu_worker_get_relative_speedup(arch);
 
 		STARPU_ASSERT(alpha != 0.0f);
 
@@ -123,7 +124,7 @@ static double common_task_expected_length(struct starpu_perfmodel_t *model, int
 	return -1.0;
 }
 
-double _starpu_task_expected_length(int workerid, struct starpu_task *task, enum starpu_perf_archtype arch)
+double _starpu_task_expected_length(struct starpu_task *task, enum starpu_perf_archtype arch)
 {
 	starpu_job_t j = _starpu_get_job_associated_to_task(task);
 	struct starpu_perfmodel_t *model = task->cl->model;
@@ -134,7 +135,7 @@ double _starpu_task_expected_length(int workerid, struct starpu_task *task, enum
 				return per_arch_task_expected_length(model, arch, task);
 
 			case STARPU_COMMON:
-				return common_task_expected_length(model, workerid, task);
+				return common_task_expected_length(model, arch, task);
 
 			case STARPU_HISTORY_BASED:
 				return _starpu_history_based_job_expected_length(model, arch, j);

+ 2 - 2
src/core/perfmodel/perfmodel.h

@@ -95,7 +95,7 @@ void _starpu_register_model(struct starpu_perfmodel_t *model);
 void _starpu_initialize_registered_performance_models(void);
 void _starpu_deinitialize_registered_performance_models(void);
 
-double _starpu_task_expected_length(int workerid, struct starpu_task *task, enum starpu_perf_archtype arch);
+double _starpu_task_expected_length(struct starpu_task *task, enum starpu_perf_archtype arch);
 double _starpu_regression_based_job_expected_length(struct starpu_perfmodel_t *model,
 					enum starpu_perf_archtype arch, struct starpu_job_s *j);
 void _starpu_update_perfmodel_history(struct starpu_job_s *j, enum starpu_perf_archtype arch,
@@ -111,7 +111,7 @@ double _starpu_predict_transfer_time(unsigned src_node, unsigned dst_node, size_
 void _starpu_set_calibrate_flag(unsigned val);
 unsigned _starpu_get_calibrate_flag(void);
 
-double _starpu_worker_get_relative_speedup(int workerid);
+double _starpu_worker_get_relative_speedup(enum starpu_perf_archtype perf_archtype);
 
 enum starpu_perf_archtype starpu_worker_get_perf_archtype(int workerid);
 

+ 2 - 2
src/sched_policies/deque_modeling_policy_data_aware.c

@@ -320,7 +320,7 @@ static int _dm_push_task(struct starpu_task *task, unsigned prio)
 		}
 
 		enum starpu_perf_archtype perf_arch = starpu_worker_get_perf_archtype(worker);
-		double local_length = _starpu_task_expected_length(worker, task, perf_arch);
+		double local_length = _starpu_task_expected_length(task, perf_arch);
 
 		if (local_length == -1.0) 
 		{
@@ -385,7 +385,7 @@ static int _dmda_push_task(struct starpu_task *task, unsigned prio)
 		}
 
 		enum starpu_perf_archtype perf_arch = starpu_worker_get_perf_archtype(worker);
-		local_task_length[worker] = _starpu_task_expected_length(worker, task, perf_arch);
+		local_task_length[worker] = _starpu_task_expected_length(task, perf_arch);
 
 		unsigned memory_node = starpu_worker_get_memory_node(worker);
 		local_data_penalty[worker] = _starpu_data_expected_penalty(memory_node, task);

+ 3 - 1
src/sched_policies/random_policy.c

@@ -47,7 +47,8 @@ static int _random_push_task(struct starpu_task *task, unsigned prio)
 
 	for (worker = 0; worker < nworkers; worker++)
 	{
-		alpha_sum += _starpu_worker_get_relative_speedup(worker);
+		enum starpu_perf_archtype perf_arch = starpu_worker_get_perf_archtype(worker);
+		alpha_sum += _starpu_worker_get_relative_speedup(perf_arch);
 	}
 
 	double random = starpu_drand48()*alpha_sum;
@@ -56,6 +57,7 @@ static int _random_push_task(struct starpu_task *task, unsigned prio)
 	double alpha = 0.0;
 	for (worker = 0; worker < nworkers; worker++)
 	{
+		enum starpu_perf_archtype perf_arch = starpu_worker_get_perf_archtype(perf_arch);
 		double worker_alpha = _starpu_worker_get_relative_speedup(worker);
 
 		if (alpha + worker_alpha > random) {