瀏覽代碼

Add STARPU_SCHED_SIMPLE_PRE_DECISION

Samuel Thibault 4 年之前
父節點
當前提交
77b0a217e8
共有 3 個文件被更改,包括 45 次插入7 次删除
  1. 1 0
      ChangeLog
  2. 7 0
      include/starpu_sched_component.h
  3. 37 7
      src/sched_policies/modular_ez.c

+ 1 - 0
ChangeLog

@@ -85,6 +85,7 @@ Small features:
   * Add starpu_sched_tree_deinitialize function.
   * Add STARPU_SCHED_SORTED_ABOVE and STARPU_SCHED_SORTED_BELOW environment
     variables.
+  * Add STARPU_SCHED_SIMPLE_PRE_DECISION.
 
 StarPU 1.3.7
 ====================================================================

+ 7 - 0
include/starpu_sched_component.h

@@ -793,6 +793,13 @@ struct starpu_sched_tree *starpu_sched_component_make_scheduler(unsigned sched_c
 #define STARPU_SCHED_SIMPLE_FIFOS_BELOW_EXP	(1<<13)
 
 /**
+   Request to prepend a component before the decision component. This should be
+   used alone and followed by the component creation function pointer and its
+   data.
+*/
+#define STARPU_SCHED_SIMPLE_PRE_DECISION	(1<<14)
+
+/**
    Create a simple modular scheduler tree around a scheduling decision-making
    component \p component. The details of what should be built around \p component
    is described by \p flags. The different STARPU_SCHED_SIMPL_DECIDE_* flags are

+ 37 - 7
src/sched_policies/modular_ez.c

@@ -56,6 +56,8 @@ void starpu_sched_component_initialize_simple_schedulers(unsigned sched_ctx_id,
 	struct starpu_sched_component *last = NULL;	/* Stores the last created component, from top to bottom */
 	unsigned i, j, n;
 	struct starpu_sched_component *userchoice_component = NULL;
+	struct starpu_sched_component *pre_decision_component = NULL;
+	struct starpu_sched_component *last_pre_decision_component = NULL;
 	struct starpu_sched_component *decision_component = NULL;
 	struct starpu_sched_component *no_perfmodel_component = NULL;
 	struct starpu_sched_component *calibrator_component = NULL;
@@ -93,6 +95,14 @@ void starpu_sched_component_initialize_simple_schedulers(unsigned sched_ctx_id,
 		(void) create_decision_component;
 		(void) data;
 
+		while ((flags & STARPU_SCHED_SIMPLE_PRE_DECISION) == STARPU_SCHED_SIMPLE_PRE_DECISION)
+		{
+			STARPU_ASSERT(flags == STARPU_SCHED_SIMPLE_PRE_DECISION);
+			(void) va_arg(varg_list, starpu_sched_component_create_t);
+			(void) va_arg(varg_list, void *);
+			flags = va_arg(varg_list, unsigned);
+		}
+
 		int above_prio = starpu_get_env_number_default("STARPU_SCHED_SORTED_ABOVE", flags & STARPU_SCHED_SIMPLE_FIFO_ABOVE_PRIO ? 1 : 0);
 		int below_prio = starpu_get_env_number_default("STARPU_SCHED_SORTED_BELOW", flags & STARPU_SCHED_SIMPLE_FIFOS_BELOW_PRIO ? 1 : 0);
 
@@ -191,6 +201,24 @@ void starpu_sched_component_initialize_simple_schedulers(unsigned sched_ctx_id,
 		void *data = va_arg(varg_list, void *);
 		flags = va_arg(varg_list, unsigned);
 
+		while ((flags & STARPU_SCHED_SIMPLE_PRE_DECISION) == STARPU_SCHED_SIMPLE_PRE_DECISION)
+		{
+			starpu_sched_component_create_t create_pre_decision_component = va_arg(varg_list, starpu_sched_component_create_t);
+			void *pre_data = va_arg(varg_list, void *);
+			flags = va_arg(varg_list, unsigned);
+			struct starpu_sched_component *component;
+
+			component = create_pre_decision_component(t, pre_data);
+
+			if (pre_decision_component)
+				/* Connect after previous pre-decision component */
+				starpu_sched_component_connect(pre_decision_component, component);
+			else
+				/* We are the first pre-decision component */
+				pre_decision_component = component;
+			last_pre_decision_component = component;
+		}
+
 		int above_prio = starpu_get_env_number_default("STARPU_SCHED_SORTED_ABOVE", flags & STARPU_SCHED_SIMPLE_FIFO_ABOVE_PRIO ? 1 : 0);
 		int below_prio = starpu_get_env_number_default("STARPU_SCHED_SORTED_BELOW", flags & STARPU_SCHED_SIMPLE_FIFOS_BELOW_PRIO ? 1 : 0);
 
@@ -207,6 +235,10 @@ void starpu_sched_component_initialize_simple_schedulers(unsigned sched_ctx_id,
 		{
 			decision_component = create_decision_component(t, data);
 		}
+		if (last_pre_decision_component)
+			starpu_sched_component_connect(last_pre_decision_component, decision_component);
+		else
+			last_pre_decision_component = decision_component;
 
 		/* First, a fifo if requested */
 		if (flags & STARPU_SCHED_SIMPLE_FIFO_ABOVE)
@@ -239,7 +271,7 @@ void starpu_sched_component_initialize_simple_schedulers(unsigned sched_ctx_id,
 				{
 					.calibrator_component = calibrator_component,
 					.no_perfmodel_component = no_perfmodel_component,
-					.perfmodel_component = decision_component,
+					.perfmodel_component = pre_decision_component,
 				};
 
 			struct starpu_sched_component * perfmodel_select_component = starpu_sched_component_perfmodel_select_create(t, &perfmodel_select_data);
@@ -249,7 +281,7 @@ void starpu_sched_component_initialize_simple_schedulers(unsigned sched_ctx_id,
 			else
 				starpu_sched_component_connect(last, perfmodel_select_component);
 
-			starpu_sched_component_connect(perfmodel_select_component, decision_component);
+			starpu_sched_component_connect(perfmodel_select_component, pre_decision_component);
 			starpu_sched_component_connect(perfmodel_select_component, calibrator_component);
 			starpu_sched_component_connect(perfmodel_select_component, no_perfmodel_component);
 		}
@@ -258,13 +290,11 @@ void starpu_sched_component_initialize_simple_schedulers(unsigned sched_ctx_id,
 			/* No perfmodel calibration */
 			if (!last)
 				/* Plug decision_component directly */
-				last = t->root = decision_component;
+				t->root = pre_decision_component;
 			else
-				/* Plug decision_component to fifo */
-				starpu_sched_component_connect(last, decision_component);
+				/* Plug decision components to fifo */
+				starpu_sched_component_connect(last, pre_decision_component);
 		}
-		/* Silence static analysis warnings */
-		(void) last;
 
 		/* Take default ntasks_threshold */
 		unsigned ntasks_threshold;