Forráskód Böngészése

Add starpu_sched_component_connect helper and benefit from it

Samuel Thibault 10 éve
szülő
commit
5e8cba21b1

+ 6 - 0
include/starpu_sched_component.h

@@ -101,6 +101,12 @@ int STARPU_WARN_UNUSED_RESULT starpu_sched_component_execute_preds(struct starpu
 double starpu_sched_component_transfer_length(struct starpu_sched_component *component, struct starpu_task *task);
 void starpu_sched_component_prefetch_on_node(struct starpu_sched_component *component, struct starpu_task *task);
 
+static __starpu_inline void starpu_sched_component_connect(struct starpu_sched_component *parent, struct starpu_sched_component *child)
+{
+	parent->add_child(parent, child);
+	child->add_parent(child, parent);
+}
+
 struct starpu_sched_component *starpu_sched_component_worker_get(unsigned sched_ctx, int workerid);
 int starpu_sched_component_worker_get_workerid(struct starpu_sched_component *worker_component);
 int starpu_sched_component_is_worker(struct starpu_sched_component *component);

+ 9 - 10
src/sched_policies/modular_eager.c

@@ -22,22 +22,21 @@ static void initialize_eager_center_policy(unsigned sched_ctx_id)
 {
 	_STARPU_DISP("Warning: you are running the default modular-eager scheduler, which is not very smart. Make sure to read the StarPU documentation about adding performance models in order to be able to use the modular-heft scheduler instead.\n");
 
+	struct starpu_sched_tree *t;
+	struct starpu_sched_component * eager_component;
+
 	starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST);
-	struct starpu_sched_tree *t = starpu_sched_tree_create(sched_ctx_id);
+
+	t = starpu_sched_tree_create(sched_ctx_id);
  	t->root = starpu_sched_component_fifo_create(t, NULL);
-	struct starpu_sched_component * eager_component = starpu_sched_component_eager_create(t, NULL);
-	t->root->add_child(t->root, eager_component);
-	eager_component->add_parent(eager_component, t->root);
+	eager_component = starpu_sched_component_eager_create(t, NULL);
+
+	starpu_sched_component_connect(t->root, eager_component);
 
 	unsigned i;
 	for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++)
-	{
-		struct starpu_sched_component * worker_component = starpu_sched_component_worker_get(sched_ctx_id, i);
-		STARPU_ASSERT(worker_component);
+		starpu_sched_component_connect(eager_component, starpu_sched_component_worker_get(sched_ctx_id, i));
 
-		eager_component->add_child(eager_component, worker_component);
-		worker_component->add_parent(worker_component, eager_component);
-	}
 	starpu_sched_tree_update_workers(t);
 	starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)t);
 }

+ 10 - 10
src/sched_policies/modular_eager_prefetching.c

@@ -25,12 +25,16 @@ static void initialize_eager_prefetching_center_policy(unsigned sched_ctx_id)
 {
 	_STARPU_DISP("Warning: you are running the default modular-eager-prefetching scheduler, which is not very smart. Make sure to read the StarPU documentation about adding performance models in order to be able to use the modular-heft scheduler instead.\n");
 
+	struct starpu_sched_tree *t;
+	struct starpu_sched_component * eager_component;
+
 	starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST);
-	struct starpu_sched_tree *t = starpu_sched_tree_create(sched_ctx_id);
+
+	t = starpu_sched_tree_create(sched_ctx_id);
  	t->root = starpu_sched_component_fifo_create(t, NULL);
-	struct starpu_sched_component * eager_component = starpu_sched_component_eager_create(t, NULL);
-	t->root->add_child(t->root, eager_component);
-	eager_component->add_parent(eager_component, t->root);
+	eager_component = starpu_sched_component_eager_create(t, NULL);
+
+	starpu_sched_component_connect(t->root, eager_component);
 
 	struct starpu_sched_component_fifo_data fifo_data =
 		{
@@ -42,14 +46,10 @@ static void initialize_eager_prefetching_center_policy(unsigned sched_ctx_id)
 	for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++)
 	{
 		struct starpu_sched_component * worker_component = starpu_sched_component_worker_get(sched_ctx_id, i);
-		STARPU_ASSERT(worker_component);
-
 		struct starpu_sched_component * fifo_component = starpu_sched_component_fifo_create(t, &fifo_data);
-		fifo_component->add_child(fifo_component, worker_component);
-		worker_component->add_parent(worker_component, fifo_component);
 
-		eager_component->add_child(eager_component, fifo_component);
-		fifo_component->add_parent(fifo_component, eager_component);
+		starpu_sched_component_connect(fifo_component, worker_component);
+		starpu_sched_component_connect(eager_component, fifo_component);
 	}
 	starpu_sched_tree_update_workers(t);
 	starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)t);

+ 13 - 23
src/sched_policies/modular_heft.c

@@ -70,7 +70,6 @@ static void initialize_heft_center_policy(unsigned sched_ctx_id)
 	struct starpu_sched_tree * t = starpu_sched_tree_create(sched_ctx_id);
 
 	struct starpu_sched_component * window_component = starpu_sched_component_prio_create(t, NULL);
-	t->root = window_component;
 
 	struct starpu_sched_component * perfmodel_component = starpu_sched_component_mct_create(t, NULL);
 	struct starpu_sched_component * no_perfmodel_component = starpu_sched_component_eager_create(t, NULL);
@@ -84,15 +83,13 @@ static void initialize_heft_center_policy(unsigned sched_ctx_id)
 		};
 
 	struct starpu_sched_component * perfmodel_select_component = starpu_sched_component_perfmodel_select_create(t, &perfmodel_select_data);
-	window_component->add_child(window_component, perfmodel_select_component);
-	perfmodel_select_component->add_parent(perfmodel_select_component, window_component);
 
-	perfmodel_select_component->add_child(perfmodel_select_component, calibrator_component);
-	calibrator_component->add_parent(calibrator_component, perfmodel_select_component);
-	perfmodel_select_component->add_child(perfmodel_select_component, perfmodel_component);
-	perfmodel_component->add_parent(perfmodel_component, perfmodel_select_component);
-	perfmodel_select_component->add_child(perfmodel_select_component, no_perfmodel_component);
-	no_perfmodel_component->add_parent(no_perfmodel_component, perfmodel_select_component);
+	t->root = window_component;
+	starpu_sched_component_connect(window_component, perfmodel_select_component);
+
+	starpu_sched_component_connect(perfmodel_select_component, calibrator_component);
+	starpu_sched_component_connect(perfmodel_select_component, perfmodel_component);
+	starpu_sched_component_connect(perfmodel_select_component, no_perfmodel_component);
 
 	struct starpu_sched_component_prio_data prio_data =
 		{
@@ -104,22 +101,15 @@ static void initialize_heft_center_policy(unsigned sched_ctx_id)
 	for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++)
 	{
 		struct starpu_sched_component * worker_component = starpu_sched_component_worker_get(sched_ctx_id, i);
-		STARPU_ASSERT(worker_component);
-
 		struct starpu_sched_component * prio_component = starpu_sched_component_prio_create(t, &prio_data);
-		prio_component->add_child(prio_component, worker_component);
-		worker_component->add_parent(worker_component, prio_component);
-
 		struct starpu_sched_component * impl_component = starpu_sched_component_best_implementation_create(t, NULL);
-		impl_component->add_child(impl_component, prio_component);
-		prio_component->add_parent(prio_component, impl_component);
-
-		perfmodel_component->add_child(perfmodel_component, impl_component);
-		impl_component->add_parent(impl_component, perfmodel_component);
-		no_perfmodel_component->add_child(no_perfmodel_component, impl_component);
-		impl_component->add_parent(impl_component, no_perfmodel_component);
-		calibrator_component->add_child(calibrator_component, impl_component);
-		impl_component->add_parent(impl_component, calibrator_component);
+
+		starpu_sched_component_connect(prio_component, worker_component);
+		starpu_sched_component_connect(impl_component, prio_component);
+
+		starpu_sched_component_connect(perfmodel_component, impl_component);
+		starpu_sched_component_connect(no_perfmodel_component, impl_component);
+		starpu_sched_component_connect(calibrator_component, impl_component);
 	}
 
 	starpu_sched_tree_update_workers(t);

+ 13 - 23
src/sched_policies/modular_heft2.c

@@ -44,7 +44,6 @@ static void initialize_heft2_center_policy(unsigned sched_ctx_id)
 	struct starpu_sched_tree * t = starpu_sched_tree_create(sched_ctx_id);
 
 	struct starpu_sched_component * window_component = starpu_sched_component_prio_create(t, NULL);
-	t->root = window_component;
 
 	struct starpu_sched_component * perfmodel_component = starpu_sched_component_heft_create(t, NULL);
 	struct starpu_sched_component * no_perfmodel_component = starpu_sched_component_eager_create(t, NULL);
@@ -58,15 +57,13 @@ static void initialize_heft2_center_policy(unsigned sched_ctx_id)
 		};
 
 	struct starpu_sched_component * perfmodel_select_component = starpu_sched_component_perfmodel_select_create(t, &perfmodel_select_data);
-	window_component->add_child(window_component, perfmodel_select_component);
-	perfmodel_select_component->add_parent(perfmodel_select_component, window_component);
 
-	perfmodel_select_component->add_child(perfmodel_select_component, calibrator_component);
-	calibrator_component->add_parent(calibrator_component, perfmodel_select_component);
-	perfmodel_select_component->add_child(perfmodel_select_component, perfmodel_component);
-	perfmodel_component->add_parent(perfmodel_component, perfmodel_select_component);
-	perfmodel_select_component->add_child(perfmodel_select_component, no_perfmodel_component);
-	no_perfmodel_component->add_parent(no_perfmodel_component, perfmodel_select_component);
+	t->root = window_component;
+	starpu_sched_component_connect(window_component, perfmodel_select_component);
+
+	starpu_sched_component_connect(perfmodel_select_component, calibrator_component);
+	starpu_sched_component_connect(perfmodel_select_component, perfmodel_component);
+	starpu_sched_component_connect(perfmodel_select_component, no_perfmodel_component);
 
 	struct starpu_sched_component_prio_data prio_data =
 		{
@@ -78,22 +75,15 @@ static void initialize_heft2_center_policy(unsigned sched_ctx_id)
 	for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++)
 	{
 		struct starpu_sched_component * worker_component = starpu_sched_component_worker_get(sched_ctx_id, i);
-		STARPU_ASSERT(worker_component);
-
 		struct starpu_sched_component * prio_component = starpu_sched_component_prio_create(t, &prio_data);
-		prio_component->add_child(prio_component, worker_component);
-		worker_component->add_parent(worker_component, prio_component);
-
 		struct starpu_sched_component * impl_component = starpu_sched_component_best_implementation_create(t, NULL);
-		impl_component->add_child(impl_component, prio_component);
-		prio_component->add_parent(prio_component, impl_component);
-
-		perfmodel_component->add_child(perfmodel_component, impl_component);
-		impl_component->add_parent(impl_component, perfmodel_component);
-		no_perfmodel_component->add_child(no_perfmodel_component, impl_component);
-		impl_component->add_parent(impl_component, no_perfmodel_component);
-		calibrator_component->add_child(calibrator_component, impl_component);
-		impl_component->add_parent(impl_component, calibrator_component);
+
+		starpu_sched_component_connect(prio_component, worker_component);
+		starpu_sched_component_connect(impl_component, prio_component);
+
+		starpu_sched_component_connect(perfmodel_component, impl_component);
+		starpu_sched_component_connect(no_perfmodel_component, impl_component);
+		starpu_sched_component_connect(calibrator_component, impl_component);
 	}
 
 	starpu_sched_tree_update_workers(t);

+ 9 - 10
src/sched_policies/modular_prio.c

@@ -19,22 +19,21 @@
 
 static void initialize_prio_center_policy(unsigned sched_ctx_id)
 {
+	struct starpu_sched_tree *t;
+	struct starpu_sched_component * eager_component;
+
 	starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST);
-	struct starpu_sched_tree *t = starpu_sched_tree_create(sched_ctx_id);
+
+	t = starpu_sched_tree_create(sched_ctx_id);
  	t->root = starpu_sched_component_prio_create(t, NULL);
-	struct starpu_sched_component * eager_component = starpu_sched_component_eager_create(t, NULL);
-	t->root->add_child(t->root, eager_component);
-	eager_component->add_parent(eager_component, t->root);
+	eager_component = starpu_sched_component_eager_create(t, NULL);
+
+	starpu_sched_component_connect(t->root, eager_component);
 
 	unsigned i;
 	for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++)
-	{
-		struct starpu_sched_component * worker_component = starpu_sched_component_worker_get(sched_ctx_id, i);
-		STARPU_ASSERT(worker_component);
+		starpu_sched_component_connect(eager_component, starpu_sched_component_worker_get(sched_ctx_id, i));
 
-		eager_component->add_child(eager_component, worker_component);
-		worker_component->add_parent(worker_component, eager_component);
-	}
 	starpu_sched_tree_update_workers(t);
 	starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)t);
 }

+ 9 - 10
src/sched_policies/modular_prio_prefetching.c

@@ -22,11 +22,14 @@
 
 static void initialize_prio_prefetching_center_policy(unsigned sched_ctx_id)
 {
-	struct starpu_sched_tree *t = starpu_sched_tree_create(sched_ctx_id);
+	struct starpu_sched_tree *t;
+	struct starpu_sched_component * eager_component;
+
+	t = starpu_sched_tree_create(sched_ctx_id);
  	t->root = starpu_sched_component_prio_create(t, NULL);
-	struct starpu_sched_component * eager_component = starpu_sched_component_eager_create(t, NULL);
-	t->root->add_child(t->root, eager_component);
-	eager_component->add_parent(eager_component, t->root);
+	eager_component = starpu_sched_component_eager_create(t, NULL);
+
+	starpu_sched_component_connect(t->root, eager_component);
 
 	struct starpu_sched_component_prio_data prio_data =
 		{
@@ -38,14 +41,10 @@ static void initialize_prio_prefetching_center_policy(unsigned sched_ctx_id)
 	for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++)
 	{
 		struct starpu_sched_component * worker_component = starpu_sched_component_worker_get(sched_ctx_id, i);
-		STARPU_ASSERT(worker_component);
-
 		struct starpu_sched_component * prio_component = starpu_sched_component_prio_create(t, &prio_data);
-		prio_component->add_child(prio_component, worker_component);
-		worker_component->add_parent(worker_component, prio_component);
 
-		eager_component->add_child(eager_component, prio_component);
-		prio_component->add_parent(prio_component, eager_component);
+		starpu_sched_component_connect(prio_component, worker_component);
+		starpu_sched_component_connect(eager_component, prio_component);
 	}
 	starpu_sched_tree_update_workers(t);
 	starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)t);

+ 18 - 20
src/sched_policies/modular_random.c

@@ -22,22 +22,21 @@
 
 static void initialize_random_fifo_center_policy(unsigned sched_ctx_id)
 {
+	struct starpu_sched_tree *t;
+	struct starpu_sched_component * random_component;
+
 	starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST);
-	struct starpu_sched_tree *t = starpu_sched_tree_create(sched_ctx_id);
+
+	t = starpu_sched_tree_create(sched_ctx_id);
  	t->root = starpu_sched_component_fifo_create(t, NULL);
-	struct starpu_sched_component * random_component = starpu_sched_component_random_create(t, NULL);
-	t->root->add_child(t->root, random_component);
-	random_component->add_parent(random_component, t->root);
+	random_component = starpu_sched_component_random_create(t, NULL);
+
+	starpu_sched_component_connect(t->root, random_component);
 
 	unsigned i;
 	for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++)
-	{
-		struct starpu_sched_component * worker_component = starpu_sched_component_worker_get(sched_ctx_id, i);
-		STARPU_ASSERT(worker_component);
+		starpu_sched_component_connect(random_component, starpu_sched_component_worker_get(sched_ctx_id, i));
 
-		random_component->add_child(random_component, worker_component);
-		worker_component->add_parent(worker_component, random_component);
-	}
 	starpu_sched_tree_update_workers(t);
 	starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)t);
 }
@@ -68,22 +67,21 @@ struct starpu_sched_policy _starpu_sched_modular_random_policy =
 
 static void initialize_random_prio_center_policy(unsigned sched_ctx_id)
 {
+	struct starpu_sched_tree *t;
+	struct starpu_sched_component * random_component;
+
 	starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST);
-	struct starpu_sched_tree *t = starpu_sched_tree_create(sched_ctx_id);
+
+	t = starpu_sched_tree_create(sched_ctx_id);
  	t->root = starpu_sched_component_prio_create(t, NULL);
-	struct starpu_sched_component * random_component = starpu_sched_component_random_create(t, NULL);
-	t->root->add_child(t->root, random_component);
-	random_component->add_parent(random_component, t->root);
+	random_component = starpu_sched_component_random_create(t, NULL);
+
+	starpu_sched_component_connect(t->root, random_component);
 
 	unsigned i;
 	for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++)
-	{
-		struct starpu_sched_component * worker_component = starpu_sched_component_worker_get(sched_ctx_id, i);
-		STARPU_ASSERT(worker_component);
+		starpu_sched_component_connect(random_component, starpu_sched_component_worker_get(sched_ctx_id, i));
 
-		random_component->add_child(random_component, worker_component);
-		worker_component->add_parent(worker_component, random_component);
-	}
 	starpu_sched_tree_update_workers(t);
 	starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)t);
 }

+ 20 - 20
src/sched_policies/modular_random_prefetching.c

@@ -25,12 +25,16 @@
 
 static void initialize_random_fifo_prefetching_center_policy(unsigned sched_ctx_id)
 {
+	struct starpu_sched_tree *t;
+	struct starpu_sched_component * random_component;
+
 	starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST);
-	struct starpu_sched_tree *t = starpu_sched_tree_create(sched_ctx_id);
+
+	t = starpu_sched_tree_create(sched_ctx_id);
  	t->root = starpu_sched_component_fifo_create(t, NULL);
-	struct starpu_sched_component * random_component = starpu_sched_component_random_create(t, NULL);
-	t->root->add_child(t->root, random_component);
-	random_component->add_parent(random_component, t->root);
+	random_component = starpu_sched_component_random_create(t, NULL);
+
+	starpu_sched_component_connect(t->root, random_component);
 
 	struct starpu_sched_component_fifo_data fifo_data =
 		{
@@ -42,14 +46,10 @@ static void initialize_random_fifo_prefetching_center_policy(unsigned sched_ctx_
 	for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++)
 	{
 		struct starpu_sched_component * worker_component = starpu_sched_component_worker_get(sched_ctx_id, i);
-		STARPU_ASSERT(worker_component);
-
 		struct starpu_sched_component * fifo_component = starpu_sched_component_fifo_create(t, &fifo_data);
-		fifo_component->add_child(fifo_component, worker_component);
-		worker_component->add_parent(worker_component, fifo_component);
 
-		random_component->add_child(random_component, fifo_component);
-		fifo_component->add_parent(fifo_component, random_component);
+		starpu_sched_component_connect(fifo_component, worker_component);
+		starpu_sched_component_connect(random_component, fifo_component);
 	}
 	starpu_sched_tree_update_workers(t);
 	starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)t);
@@ -81,12 +81,16 @@ struct starpu_sched_policy _starpu_sched_modular_random_prefetching_policy =
 
 static void initialize_random_prio_prefetching_center_policy(unsigned sched_ctx_id)
 {
+	struct starpu_sched_tree *t;
+	struct starpu_sched_component *random_component;
+
 	starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST);
-	struct starpu_sched_tree *t = starpu_sched_tree_create(sched_ctx_id);
+
+	t = starpu_sched_tree_create(sched_ctx_id);
  	t->root = starpu_sched_component_prio_create(t, NULL);
-	struct starpu_sched_component * random_component = starpu_sched_component_random_create(t, NULL);
-	t->root->add_child(t->root, random_component);
-	random_component->add_parent(random_component, t->root);
+	random_component = starpu_sched_component_random_create(t, NULL);
+
+	starpu_sched_component_connect(t->root, random_component);
 
 	struct starpu_sched_component_prio_data prio_data =
 		{
@@ -98,14 +102,10 @@ static void initialize_random_prio_prefetching_center_policy(unsigned sched_ctx_
 	for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++)
 	{
 		struct starpu_sched_component * worker_component = starpu_sched_component_worker_get(sched_ctx_id, i);
-		STARPU_ASSERT(worker_component);
-
 		struct starpu_sched_component * prio_component = starpu_sched_component_prio_create(t, &prio_data);
-		prio_component->add_child(prio_component, worker_component);
-		worker_component->add_parent(worker_component, prio_component);
 
-		random_component->add_child(random_component, prio_component);
-		prio_component->add_parent(prio_component, random_component);
+		starpu_sched_component_connect(prio_component, worker_component);
+		starpu_sched_component_connect(random_component, prio_component);
 	}
 	starpu_sched_tree_update_workers(t);
 	starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)t);

+ 6 - 3
src/sched_policies/modular_ws.c

@@ -21,17 +21,20 @@
 
 static void initialize_ws_center_policy(unsigned sched_ctx_id)
 {
+	struct starpu_sched_tree *t;
+
 	starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST);
-	struct starpu_sched_tree *t = starpu_sched_tree_create(sched_ctx_id);
+
+	t = starpu_sched_tree_create(sched_ctx_id);
  	t->root = starpu_sched_component_work_stealing_create(t, NULL);
+
 	unsigned i;
 	for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++)
 	{
 		struct starpu_sched_component * worker_component = starpu_sched_component_worker_get(sched_ctx_id, i);
 		STARPU_ASSERT(worker_component);
 
-		t->root->add_child(t->root, worker_component);
-		worker_component->add_parent(worker_component, t->root);
+		starpu_sched_component_connect(t->root, worker_component);
 	}
 	starpu_sched_tree_update_workers(t);
 	starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)t);