浏览代码

port r15746 from 1.2: Introduce starpu_sched_component_push_task and starpu_sched_component_pull_task helpers

Samuel Thibault 10 年之前
父节点
当前提交
320c4f9e03

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

@@ -162,6 +162,10 @@ The actual scheduler
 \ingroup API_Modularized_Scheduler
 	 compatibility with starpu_sched_policy interface
 
+\fn void starpu_sched_component_connect(struct starpu_sched_component *parent, struct starpu_sched_component *child)
+\ingroup API_Modularized_Scheduler
+	 Attaches component \p child to parent \p parent. Some component may accept only one child, others accept several (e.g. MCT)
+
 @name Generic Scheduling Component API
 \ingroup API_Modularized_Scheduler
 
@@ -437,4 +441,10 @@ todo
 \ingroup API_Modularized_Scheduler
 	 this function build a scheduler for \p sched_ctx_id according to \p s and the hwloc topology of the machine.
 
+\fn int starpu_sched_component_push_task(struct starpu_sched_component *component, struct starpu_task *task);
+	Push a task to a component. This is a helper for <c>component->push_task(component, task)</c> plus tracing.
+
+\fn struct starpu_task *starpu_sched_component_pull_task(struct starpu_sched_component *component);
+	Pull a task from a component. This is a helper for <c>component->pull_task(component)</c> plus tracing.
+
 */

+ 2 - 0
include/starpu_sched_component.h

@@ -90,7 +90,9 @@ struct starpu_sched_tree *starpu_sched_tree_get(unsigned sched_ctx_id);
 void starpu_sched_tree_update_workers(struct starpu_sched_tree *t);
 void starpu_sched_tree_update_workers_in_ctx(struct starpu_sched_tree *t);
 int starpu_sched_tree_push_task(struct starpu_task *task);
+int starpu_sched_component_push_task(struct starpu_sched_component *component, struct starpu_task *task);
 struct starpu_task *starpu_sched_tree_pop_task(unsigned sched_ctx);
+struct starpu_task *starpu_sched_component_pull_task(struct starpu_sched_component * component);
 void starpu_sched_tree_add_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers);
 void starpu_sched_tree_remove_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers);
 

+ 2 - 2
src/sched_policies/component_best_implementation.c

@@ -75,7 +75,7 @@ static int best_implementation_push_task(struct starpu_sched_component * compone
 {
 	STARPU_ASSERT(component->nchildren == 1);
 	select_best_implementation_and_set_preds(component->tree->sched_ctx_id, component->workers_in_ctx, task);
-	return component->children[0]->push_task(component->children[0],task);
+	return starpu_sched_component_push_task(component->children[0],task);
 }
 
 int starpu_sched_component_is_best_implementation(struct starpu_sched_component * component)
@@ -93,7 +93,7 @@ static struct starpu_task * best_implementation_pull_task(struct starpu_sched_co
 			continue;
 		else
 		{
-			task = component->parents[i]->pull_task(component->parents[i]);
+			task = starpu_sched_component_pull_task(component->parents[i]);
 			if(task)
 				break;
 		}

+ 3 - 3
src/sched_policies/component_composed.c

@@ -120,14 +120,14 @@ struct composed_component create_composed_component(struct starpu_sched_tree *tr
 static int composed_component_push_task(struct starpu_sched_component * component, struct starpu_task * task)
 {
 	struct composed_component *c = component->data;
-	return c->top->push_task(c->top,task);
+	return starpu_sched_component_push_task(c->top,task);
 }
 struct starpu_task * composed_component_pull_task(struct starpu_sched_component *component)
 {
 	struct composed_component *c = component->data;
 	struct starpu_task * task = NULL;
 	
-	task = c->bottom->pull_task(c->bottom);
+	task = starpu_sched_component_pull_task(c->bottom);
 	if(task)
 		return task;
 
@@ -138,7 +138,7 @@ struct starpu_task * composed_component_pull_task(struct starpu_sched_component
 			continue;
 		else
 		{
-			task = component->parents[i]->pull_task(component->parents[i]);
+			task = starpu_sched_component_pull_task(component->parents[i]);
 			if(task)
 				break;
 		}

+ 1 - 1
src/sched_policies/component_eager.c

@@ -49,7 +49,7 @@ static int eager_push_task(struct starpu_sched_component * component, struct sta
 								return 1;
 							}
 							else
-								return component->children[i]->push_task(component->children[i],task);
+								return starpu_sched_component_push_task(component->children[i],task);
 						}
 					}
 				}

+ 1 - 1
src/sched_policies/component_eager_calibration.c

@@ -61,7 +61,7 @@ static int eager_calibration_push_task(struct starpu_sched_component * component
 									return 1;
 								}
 								else
-									return component->children[i]->push_task(component->children[i],task);
+									return starpu_sched_component_push_task(component->children[i],task);
 							}
 						}
 					}

+ 4 - 4
src/sched_policies/component_fifo.c

@@ -214,17 +214,17 @@ static int fifo_can_push(struct starpu_sched_component * component)
 	STARPU_ASSERT(component->nchildren == 1);
 	struct starpu_sched_component * child = component->children[0];
 
-	struct starpu_task * task = component->pull_task(component);
+	struct starpu_task * task = starpu_sched_component_pull_task(component);
 	if(task)
-		ret = child->push_task(child,task);	
+		ret = starpu_sched_component_push_task(child,task);	
 	while(task && !ret) 
 	{
 		if(!res)
 			res = 1;
 
-		task = component->pull_task(component);
+		task = starpu_sched_component_pull_task(component);
 		if(task)
-			ret = child->push_task(child,task);	
+			ret = starpu_sched_component_push_task(child,task);	
 	}
 	if(task && ret)
 		fifo_push_local_task(component,task,1); 

+ 1 - 1
src/sched_policies/component_heft.c

@@ -153,7 +153,7 @@ static int heft_progress_one(struct starpu_sched_component *component)
 			return 1;
 		}
 
-		int ret = best_component->push_task(best_component, tasks[best_task]);
+		int ret = starpu_sched_component_push_task(best_component, tasks[best_task]);
 
 		if (ret)
 		{

+ 1 - 1
src/sched_policies/component_mct.c

@@ -99,7 +99,7 @@ static int mct_push_task(struct starpu_sched_component * component, struct starp
 		return 1;
 	}
 
-	int ret = best_component->push_task(best_component, task);
+	int ret = starpu_sched_component_push_task(best_component, task);
 	return ret;
 }
 

+ 3 - 3
src/sched_policies/component_perfmodel_select.c

@@ -44,10 +44,10 @@ static int perfmodel_select_push_task(struct starpu_sched_component * component,
 	if(can_execute)
 	{
 		if(isnan(length))
-			return data->calibrator_component->push_task(data->calibrator_component,task);
+			return starpu_sched_component_push_task(data->calibrator_component,task);
 		if(_STARPU_IS_ZERO(length))
-			return data->no_perfmodel_component->push_task(data->no_perfmodel_component,task);
-		return data->perfmodel_component->push_task(data->perfmodel_component,task);
+			return starpu_sched_component_push_task(data->no_perfmodel_component,task);
+		return starpu_sched_component_push_task(data->perfmodel_component,task);
 	}
 	else
 		return 1;

+ 4 - 4
src/sched_policies/component_prio.c

@@ -236,17 +236,17 @@ static int prio_can_push(struct starpu_sched_component * component)
 	STARPU_ASSERT(component->nchildren == 1);
 	struct starpu_sched_component * child = component->children[0];
 
-	struct starpu_task * task = component->pull_task(component);
+	struct starpu_task * task = starpu_sched_component_pull_task(component);
 	if(task)
-		ret = child->push_task(child,task);	
+		ret = starpu_sched_component_push_task(child,task);	
 	while(task && !ret) 
 	{
 		if(!res)
 			res = 1;
 
-		task = component->pull_task(component);
+		task = starpu_sched_component_pull_task(component);
 		if(task)
-			ret = child->push_task(child,task);	
+			ret = starpu_sched_component_push_task(child,task);	
 	}
 	if(task && ret)
 		prio_push_local_task(component,task,1); 

+ 1 - 1
src/sched_policies/component_random.c

@@ -90,7 +90,7 @@ static int random_push_task(struct starpu_sched_component * component, struct st
 		return 1;
 	}
 
-	int ret_val = select->push_task(select,task);
+	int ret_val = starpu_sched_component_push_task(select,task);
 	return ret_val;
 }
 

+ 15 - 5
src/sched_policies/component_sched.c

@@ -330,11 +330,16 @@ int starpu_sched_tree_push_task(struct starpu_task * task)
 	unsigned sched_ctx_id = task->sched_ctx;
 	struct starpu_sched_tree *tree = starpu_sched_ctx_get_policy_data(sched_ctx_id);
 
-	int ret_val = tree->root->push_task(tree->root,task);
+	int ret_val = starpu_sched_component_push_task(tree->root,task);
 	
 	return ret_val;
 }
 
+int starpu_sched_component_push_task(struct starpu_sched_component *component, struct starpu_task *task)
+{
+	return component->push_task(component, task);
+}
+
 struct starpu_task * starpu_sched_tree_pop_task(unsigned sched_ctx)
 {
 	int workerid = starpu_worker_get_id();
@@ -342,10 +347,15 @@ struct starpu_task * starpu_sched_tree_pop_task(unsigned sched_ctx)
 
 	/* _starpu_sched_component_lock_worker(workerid) is called by component->pull_task()
 	 */
-	struct starpu_task * task = component->pull_task(component);
+	struct starpu_task * task = starpu_sched_component_pull_task(component);
 	return task;
 }
 
+struct starpu_task * starpu_sched_component_pull_task(struct starpu_sched_component *component)
+{
+	return component->pull_task(component);
+}
+
 void starpu_sched_tree_add_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers)
 {
 	STARPU_ASSERT(sched_ctx_id < STARPU_NMAX_SCHED_CTXS);
@@ -480,7 +490,7 @@ static void starpu_sched_component_remove_parent(struct starpu_sched_component *
 /* default implementation for component->pull_task()
  * just perform a recursive call on parent
  */
-static struct starpu_task * starpu_sched_component_pull_task(struct starpu_sched_component * component)
+static struct starpu_task * starpu_sched_component_parents_pull_task(struct starpu_sched_component * component)
 {
 	STARPU_ASSERT(component);
 	struct starpu_task * task = NULL;
@@ -491,7 +501,7 @@ static struct starpu_task * starpu_sched_component_pull_task(struct starpu_sched
 			continue;
 		else
 		{
-			task = component->parents[i]->pull_task(component->parents[i]);
+			task = starpu_sched_component_pull_task(component->parents[i]);
 			if(task)
 				break;
 		}
@@ -576,7 +586,7 @@ struct starpu_sched_component * starpu_sched_component_create(struct starpu_sche
 	component->remove_child = starpu_sched_component_remove_child;
 	component->add_parent = starpu_sched_component_add_parent;
 	component->remove_parent = starpu_sched_component_remove_parent;
-	component->pull_task = starpu_sched_component_pull_task;
+	component->pull_task = starpu_sched_component_parents_pull_task;
 	component->can_push = starpu_sched_component_can_push;
 	component->can_pull = starpu_sched_component_can_pull;
 	component->estimated_load = starpu_sched_component_estimated_load;

+ 2 - 2
src/sched_policies/component_work_stealing.c

@@ -161,7 +161,7 @@ static struct starpu_task * pull_task(struct starpu_sched_component * component)
 			continue;
 		else
 		{
-			task = component->parents[i]->pull_task(component->parents[i]);
+			task = starpu_sched_component_pull_task(component->parents[i]);
 			if(task)
 				break;
 		}
@@ -319,7 +319,7 @@ void _ws_remove_child(struct starpu_sched_component * component, struct starpu_s
 	struct starpu_task * task;
 	while((task = _starpu_prio_deque_pop_task(tmp_fifo)))
 	{
-		component->push_task(component, task);
+		starpu_sched_component_push_task(component, task);
 	}
 	_starpu_prio_deque_destroy(tmp_fifo);
 	free(tmp_fifo);

+ 2 - 2
src/sched_policies/component_worker.c

@@ -501,7 +501,7 @@ static struct starpu_task * simple_worker_pull_task(struct starpu_sched_componen
 			else
 			{
 				_starpu_sched_component_worker_unlock_scheduling(component->tree->sched_ctx_id);
-				task = component->parents[i]->pull_task(component->parents[i]);
+				task = starpu_sched_component_pull_task(component->parents[i]);
 				_starpu_sched_component_worker_lock_scheduling(component->tree->sched_ctx_id);
 				if(task)
 					break;
@@ -521,7 +521,7 @@ static struct starpu_task * simple_worker_pull_task(struct starpu_sched_componen
 			return task;
 		}
 		struct starpu_sched_component * combined_worker_component = starpu_sched_component_worker_get(component->tree->sched_ctx_id, workerid);
-		(void)combined_worker_component->push_task(combined_worker_component, task);
+		starpu_sched_component_push_task(combined_worker_component, task);
 		/* we have pushed a task in queue, so can make a recursive call */
 		return simple_worker_pull_task(component);