소스 검색

Fix estimated ends of components, and use average ends by default

Samuel Thibault 8 년 전
부모
커밋
0e0c061054

+ 14 - 0
doc/doxygen/chapters/api/modularized_scheduler.doxy

@@ -239,6 +239,20 @@ The actual scheduler
 @name Flow-control Fifo Component API
 \ingroup API_Modularized_Scheduler
 
+\fn double starpu_sched_component_estimated_load(struct starpu_sched_component * component);
+\ingroup API_Modularized_Scheduler
+default function for the estimated_load component method, just sums up the loads
+of the children of the component.
+
+\fn double starpu_sched_component_estimated_end_min(struct starpu_sched_component * component);
+\ingroup API_Modularized_Scheduler
+function that can be used for the estimated_end component method, which just computes the minimum completion time of the children.
+
+\fn double starpu_sched_component_estimated_end_average(struct starpu_sched_component * component);
+\ingroup API_Modularized_Scheduler
+default function for the estimated_end component method, which just computes the average completion time of the children.
+
+
 \struct starpu_sched_component_fifo_data
 \ingroup API_Modularized_Scheduler
 \var unsigned starpu_sched_component_fifo_data::ntasks_threshold

+ 4 - 0
include/starpu_sched_component.h

@@ -115,6 +115,10 @@ int starpu_sched_component_is_combined_worker(struct starpu_sched_component *com
 void starpu_sched_component_worker_pre_exec_hook(struct starpu_task *task, unsigned sched_ctx_id);
 void starpu_sched_component_worker_post_exec_hook(struct starpu_task *task, unsigned sched_ctx_id);
 
+double starpu_sched_component_estimated_load(struct starpu_sched_component * component);
+double starpu_sched_component_estimated_end_min(struct starpu_sched_component * component);
+double starpu_sched_component_estimated_end_average(struct starpu_sched_component * component);
+
 struct starpu_sched_component_fifo_data
 {
 	unsigned ntasks_threshold;

+ 1 - 0
src/sched_policies/component_composed.c

@@ -229,6 +229,7 @@ struct starpu_sched_component * starpu_sched_component_composed_component_create
 	component->push_task = composed_component_push_task;
 	component->pull_task = composed_component_pull_task;
 	component->estimated_load = composed_component_estimated_load;
+	component->estimated_end = starpu_sched_component_estimated_end_min;
 	component->add_child = composed_component_add_child;
 	component->remove_child = composed_component_remove_child;
 	component->notify_change_workers = composed_component_notify_change_workers;

+ 5 - 10
src/sched_policies/component_fifo.c

@@ -47,9 +47,10 @@ static double fifo_estimated_end(struct starpu_sched_component * component)
 	starpu_pthread_mutex_t * mutex = &data->mutex;
 	int card = starpu_bitmap_cardinal(component->workers_in_ctx);
 	STARPU_ASSERT(card != 0);
+	double estimated_end = starpu_sched_component_estimated_end_average(component);
 	STARPU_PTHREAD_MUTEX_LOCK(mutex);
 	fifo->exp_start = STARPU_MAX(fifo->exp_start, starpu_timing_now());
-	double estimated_end = fifo->exp_start + fifo->exp_len / card;
+	estimated_end += fifo->exp_start + fifo->exp_len / card;
 	STARPU_PTHREAD_MUTEX_UNLOCK(mutex);
 
 	return estimated_end;
@@ -63,13 +64,13 @@ static double fifo_estimated_load(struct starpu_sched_component * component)
 	struct _starpu_fifo_taskq * fifo = data->fifo;
 	starpu_pthread_mutex_t * mutex = &data->mutex;
 	double relative_speedup = 0.0;
-	double load;
+	double load = starpu_sched_component_estimated_load(component);
 	if(STARPU_SCHED_COMPONENT_IS_HOMOGENEOUS(component))
 	{
 		int first_worker = starpu_bitmap_first(component->workers_in_ctx);
 		relative_speedup = starpu_worker_get_relative_speedup(starpu_worker_get_perf_archtype(first_worker, component->tree->sched_ctx_id));
 		STARPU_PTHREAD_MUTEX_LOCK(mutex);
-		load = fifo->ntasks / relative_speedup;
+		load += fifo->ntasks / relative_speedup;
 		STARPU_PTHREAD_MUTEX_UNLOCK(mutex);
 		return load;
 	}
@@ -83,15 +84,9 @@ static double fifo_estimated_load(struct starpu_sched_component * component)
 		relative_speedup /= starpu_bitmap_cardinal(component->workers_in_ctx);
 		STARPU_ASSERT(!_STARPU_IS_ZERO(relative_speedup));
 		STARPU_PTHREAD_MUTEX_LOCK(mutex);
-		load = fifo->ntasks / relative_speedup;
+		load += fifo->ntasks / relative_speedup;
 		STARPU_PTHREAD_MUTEX_UNLOCK(mutex);
 	}
-	int i;
-	for(i = 0; i < component->nchildren; i++)
-	{
-		struct starpu_sched_component * c = component->children[i];
-		load += c->estimated_load(c);
-	}
 	return load;
 }
 

+ 1 - 0
src/sched_policies/component_perfmodel_select.c

@@ -89,6 +89,7 @@ struct starpu_sched_component * starpu_sched_component_perfmodel_select_create(s
 	component->data = data;
 	component->push_task = perfmodel_select_push_task;
 	component->deinit_data = perfmodel_select_component_deinit_data;
+	component->estimated_end = starpu_sched_component_estimated_end_min;
 
 	return component;
 }

+ 5 - 10
src/sched_policies/component_prio.c

@@ -65,9 +65,10 @@ static double prio_estimated_end(struct starpu_sched_component * component)
 	starpu_pthread_mutex_t * mutex = &data->mutex;
 	int card = starpu_bitmap_cardinal(component->workers_in_ctx);
 	STARPU_ASSERT(card != 0);
+	double estimated_end = starpu_sched_component_estimated_end_average(component);
 	STARPU_PTHREAD_MUTEX_LOCK(mutex);
 	prio->exp_start = STARPU_MAX(prio->exp_start, starpu_timing_now());
-	double estimated_end = prio->exp_start + prio->exp_len / card;
+	estimated_end += prio->exp_start + prio->exp_len / card;
 	STARPU_PTHREAD_MUTEX_UNLOCK(mutex);
 
 	return estimated_end;
@@ -81,13 +82,13 @@ static double prio_estimated_load(struct starpu_sched_component * component)
 	struct _starpu_prio_deque * prio = &data->prio;
 	starpu_pthread_mutex_t * mutex = &data->mutex;
 	double relative_speedup = 0.0;
-	double load;
+	double load = starpu_sched_component_estimated_load(component);
 	if(STARPU_SCHED_COMPONENT_IS_HOMOGENEOUS(component))
 	{
 		int first_worker = starpu_bitmap_first(component->workers_in_ctx);
 		relative_speedup = starpu_worker_get_relative_speedup(starpu_worker_get_perf_archtype(first_worker, component->tree->sched_ctx_id));
 		STARPU_PTHREAD_MUTEX_LOCK(mutex);
-		load = prio->ntasks / relative_speedup;
+		load += prio->ntasks / relative_speedup;
 		STARPU_PTHREAD_MUTEX_UNLOCK(mutex);
 		return load;
 	}
@@ -101,15 +102,9 @@ static double prio_estimated_load(struct starpu_sched_component * component)
 		relative_speedup /= starpu_bitmap_cardinal(component->workers_in_ctx);
 		STARPU_ASSERT(!_STARPU_IS_ZERO(relative_speedup));
 		STARPU_PTHREAD_MUTEX_LOCK(mutex);
-		load = prio->ntasks / relative_speedup;
+		load += prio->ntasks / relative_speedup;
 		STARPU_PTHREAD_MUTEX_UNLOCK(mutex);
 	}
-	int i;
-	for(i = 0; i < component->nchildren; i++)
-	{
-		struct starpu_sched_component * c = component->children[i];
-		load += c->estimated_load(c);
-	}
 	return load;
 }
 

+ 0 - 13
src/sched_policies/component_random.c

@@ -96,18 +96,6 @@ static int random_push_task(struct starpu_sched_component * component, struct st
 	return ret_val;
 }
 
-/* taking the min of estimated_end not seems to be a good value to return here
- * as random scheduler balance between childs very poorly
- */
-static double random_estimated_end(struct starpu_sched_component * component)
-{
-	double sum = 0.0;
-	int i;
-	for(i = 0; i < component->nchildren; i++)
-		sum += component->children[i]->estimated_end(component->children[i]);
-	return sum / component->nchildren;
-}
-
 int starpu_sched_component_is_random(struct starpu_sched_component *component)
 {
 	return component->push_task == random_push_task;
@@ -116,7 +104,6 @@ int starpu_sched_component_is_random(struct starpu_sched_component *component)
 struct starpu_sched_component * starpu_sched_component_random_create(struct starpu_sched_tree *tree, void * arg STARPU_ATTRIBUTE_UNUSED)
 {
 	struct starpu_sched_component * component = starpu_sched_component_create(tree, "random");
-	component->estimated_end = random_estimated_end;
 	component->push_task = random_push_task;
 	return component;
 }

+ 13 - 3
src/sched_policies/component_sched.c

@@ -558,7 +558,7 @@ static void starpu_sched_component_can_pull(struct starpu_sched_component * comp
 		component->children[i]->can_pull(component->children[i]);
 }
 
-static double starpu_sched_component_estimated_load(struct starpu_sched_component * component)
+double starpu_sched_component_estimated_load(struct starpu_sched_component * component)
 {
 	double sum = 0.0;
 	int i;
@@ -570,7 +570,7 @@ static double starpu_sched_component_estimated_load(struct starpu_sched_componen
 	return sum;
 }
 
-static double starpu_sched_component_estimated_end_min(struct starpu_sched_component * component)
+double starpu_sched_component_estimated_end_min(struct starpu_sched_component * component)
 {
 	STARPU_ASSERT(component);
 	double min = DBL_MAX;
@@ -584,6 +584,16 @@ static double starpu_sched_component_estimated_end_min(struct starpu_sched_compo
 	return min;
 }
 
+double starpu_sched_component_estimated_end_average(struct starpu_sched_component * component)
+{
+	STARPU_ASSERT(component);
+	double sum = 0.0;
+	int i;
+	for(i = 0; i < component->nchildren; i++)
+		sum += component->children[i]->estimated_end(component->children[i]);
+	return sum / component->nchildren;
+}
+
 static void take_component_and_does_nothing(struct starpu_sched_component * component STARPU_ATTRIBUTE_UNUSED)
 {
 }
@@ -603,7 +613,7 @@ struct starpu_sched_component * starpu_sched_component_create(struct starpu_sche
 	component->can_push = starpu_sched_component_can_push;
 	component->can_pull = starpu_sched_component_can_pull;
 	component->estimated_load = starpu_sched_component_estimated_load;
-	component->estimated_end = starpu_sched_component_estimated_end_min;
+	component->estimated_end = starpu_sched_component_estimated_end_average;
 	component->deinit_data = take_component_and_does_nothing;
 	component->notify_change_workers = take_component_and_does_nothing;
 	component->name = strdup(name);

+ 3 - 3
src/sched_policies/component_worker.c

@@ -1,6 +1,6 @@
 /* StarPU --- Runtime system for heterogeneous multicore architectures.
  *
- * Copyright (C) 2010-2016  Université de Bordeaux
+ * Copyright (C) 2010-2017  Université de Bordeaux
  * Copyright (C) 2010, 2011, 2012, 2014, 2015, 2016, 2017  CNRS
  * Copyright (C) 2011  Télécom-SudParis
  * Copyright (C) 2011-2013  INRIA
@@ -93,7 +93,7 @@ struct _starpu_task_grid
  */
 struct _starpu_worker_task_list
 {
-	double exp_start, exp_len, exp_end;
+	double exp_start, exp_len, exp_end, pipeline_len;
 	struct _starpu_task_grid *first, *last;
 	unsigned ntasks;
 	starpu_pthread_mutex_t mutex;
@@ -136,7 +136,7 @@ static struct _starpu_worker_task_list * _starpu_worker_task_list_create(void)
 	struct _starpu_worker_task_list *l;
 	_STARPU_MALLOC(l, sizeof(*l));
 	memset(l, 0, sizeof(*l));
-	l->exp_len = 0.0;
+	l->exp_len = l->pipeline_len = 0.0;
 	l->exp_start = l->exp_end = starpu_timing_now();
 	STARPU_PTHREAD_MUTEX_INIT(&l->mutex,NULL);
 	return l;