Prechádzať zdrojové kódy

No need to initialize a whole modular heft prio scheduler when there is only one memory node

Samuel Thibault 8 rokov pred
rodič
commit
2374c1ce19

+ 2 - 0
include/starpu_sched_component.h

@@ -172,6 +172,8 @@ struct starpu_sched_component_perfmodel_select_data
 struct starpu_sched_component *starpu_sched_component_perfmodel_select_create(struct starpu_sched_tree *tree, struct starpu_sched_component_perfmodel_select_data *perfmodel_select_data) STARPU_ATTRIBUTE_MALLOC;
 int starpu_sched_component_is_perfmodel_select(struct starpu_sched_component *component);
 
+void starpu_initialize_prio_center_policy(unsigned sched_ctx_id);
+
 struct starpu_sched_component_composed_recipe;
 struct starpu_sched_component_composed_recipe *starpu_sched_component_composed_recipe_create(void) STARPU_ATTRIBUTE_MALLOC;
 struct starpu_sched_component_composed_recipe *starpu_sched_component_composed_recipe_create_singleton(struct starpu_sched_component *(*create_component)(struct starpu_sched_tree *tree, void *arg), void *arg) STARPU_ATTRIBUTE_MALLOC;

+ 23 - 2
src/sched_policies/modular_heft_prio.c

@@ -33,6 +33,29 @@
 
 static void initialize_heft_prio_policy(unsigned sched_ctx_id)
 {
+	unsigned i, j, n, nnodes;
+
+	/* First count how many memory nodes really have workers */
+	n = starpu_memory_nodes_get_count();
+	nnodes = 0;
+	for(i = 0; i < n; i++)
+	{
+		for(j = 0; j < starpu_worker_get_count() + starpu_combined_worker_get_count(); j++)
+			if (starpu_worker_get_memory_node(j) == i)
+				break;
+		if (j >= starpu_worker_get_count() + starpu_combined_worker_get_count())
+			/* Don't create a component for this memory node with no worker */
+			continue;
+		nnodes++;
+	}
+
+	if (nnodes == 1)
+	{
+		/* Just one memory node, we don't actually need MCT etc., just
+		 * initialize a prio scheduler */
+		return starpu_initialize_prio_center_policy(sched_ctx_id);
+	}
+
 	/* The application may use any integer */
 	if (starpu_sched_ctx_min_priority_is_set(sched_ctx_id) == 0)
 		starpu_sched_ctx_set_min_priority(sched_ctx_id, INT_MIN);
@@ -96,8 +119,6 @@ static void initialize_heft_prio_policy(unsigned sched_ctx_id)
 			.exp_len_threshold = starpu_get_env_float_default("STARPU_EXP_LEN_THRESHOLD", _STARPU_SCHED_EXP_LEN_THRESHOLD_DEFAULT),
 		};
 
-	unsigned i, j, n;
-
 	n = starpu_memory_nodes_get_count();
 	STARPU_ASSERT(n >= 1);
 	struct starpu_sched_component * eagers[n];

+ 2 - 2
src/sched_policies/modular_prio.c

@@ -17,7 +17,7 @@
 #include <starpu_sched_component.h>
 #include <starpu_scheduler.h>
 
-static void initialize_prio_center_policy(unsigned sched_ctx_id)
+void starpu_initialize_prio_center_policy(unsigned sched_ctx_id)
 {
 	struct starpu_sched_tree *t;
 	struct starpu_sched_component * eager_component;
@@ -44,7 +44,7 @@ static void deinitialize_prio_center_policy(unsigned sched_ctx_id)
 
 struct starpu_sched_policy _starpu_sched_modular_prio_policy =
 {
-	.init_sched = initialize_prio_center_policy,
+	.init_sched = starpu_initialize_prio_center_policy,
 	.deinit_sched = deinitialize_prio_center_policy,
 	.add_workers = starpu_sched_tree_add_workers,
 	.remove_workers = starpu_sched_tree_remove_workers,