Quellcode durchsuchen

Add STARPU_SCHED_SIMPLE_PRE_DECISION

Samuel Thibault vor 4 Jahren
Ursprung
Commit
77b0a217e8
3 geänderte Dateien mit 45 neuen und 7 gelöschten Zeilen
  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_tree_deinitialize function.
   * Add STARPU_SCHED_SORTED_ABOVE and STARPU_SCHED_SORTED_BELOW environment
   * Add STARPU_SCHED_SORTED_ABOVE and STARPU_SCHED_SORTED_BELOW environment
     variables.
     variables.
+  * Add STARPU_SCHED_SIMPLE_PRE_DECISION.
 
 
 StarPU 1.3.7
 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)
 #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
    Create a simple modular scheduler tree around a scheduling decision-making
    component \p component. The details of what should be built around \p component
    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
    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 */
 	struct starpu_sched_component *last = NULL;	/* Stores the last created component, from top to bottom */
 	unsigned i, j, n;
 	unsigned i, j, n;
 	struct starpu_sched_component *userchoice_component = NULL;
 	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 *decision_component = NULL;
 	struct starpu_sched_component *no_perfmodel_component = NULL;
 	struct starpu_sched_component *no_perfmodel_component = NULL;
 	struct starpu_sched_component *calibrator_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) create_decision_component;
 		(void) data;
 		(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 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);
 		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 *);
 		void *data = va_arg(varg_list, void *);
 		flags = va_arg(varg_list, unsigned);
 		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 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);
 		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);
 			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 */
 		/* First, a fifo if requested */
 		if (flags & STARPU_SCHED_SIMPLE_FIFO_ABOVE)
 		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,
 					.calibrator_component = calibrator_component,
 					.no_perfmodel_component = no_perfmodel_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);
 			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
 			else
 				starpu_sched_component_connect(last, perfmodel_select_component);
 				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, calibrator_component);
 			starpu_sched_component_connect(perfmodel_select_component, no_perfmodel_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 */
 			/* No perfmodel calibration */
 			if (!last)
 			if (!last)
 				/* Plug decision_component directly */
 				/* Plug decision_component directly */
-				last = t->root = decision_component;
+				t->root = pre_decision_component;
 			else
 			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 */
 		/* Take default ntasks_threshold */
 		unsigned ntasks_threshold;
 		unsigned ntasks_threshold;