Browse Source

add a field to indicate when a sched_ctx is ready for scheduling instead
of using the id field for that purpose, since the id is affected before
the sched_ctx struct is fully initialized

Olivier Aumage 7 years ago
parent
commit
45a52180c2
3 changed files with 24 additions and 9 deletions
  1. 12 0
      src/core/sched_ctx.c
  2. 3 0
      src/core/sched_ctx.h
  3. 9 9
      src/core/task.c

+ 12 - 0
src/core/sched_ctx.c

@@ -542,6 +542,7 @@ struct _starpu_sched_ctx* _starpu_create_sched_ctx(struct starpu_sched_policy *p
 	unsigned id = _starpu_get_first_free_sched_ctx(config);
 
 	struct _starpu_sched_ctx *sched_ctx = &config->sched_ctxs[id];
+	STARPU_ASSERT(sched_ctx->do_schedule == 0);
 	sched_ctx->id = id;
 
 	int nworkers = config->topology.nworkers;
@@ -630,6 +631,12 @@ struct _starpu_sched_ctx* _starpu_create_sched_ctx(struct starpu_sched_policy *p
 		sched_ctx->nsub_ctxs = nsub_ctxs;
 	}
 
+	/* starpu_do_schedule() starts to consider the new sched_ctx for scheduling
+	 * once 'sched_cts->do_schedule == 1' becomes visible.
+	 * Make sure the sched_ctx struct and the policy struct initialization are complete at this time. */
+	STARPU_WMB();
+	sched_ctx->do_schedule = 1;
+
 	_starpu_add_workers_to_new_sched_ctx(sched_ctx, workerids, nworkers_ctx);
 
 #ifdef STARPU_HAVE_HWLOC
@@ -958,6 +965,8 @@ void starpu_sched_ctx_set_perf_counters(unsigned sched_ctx_id, void* perf_counte
 static void _starpu_delete_sched_ctx(struct _starpu_sched_ctx *sched_ctx)
 {
 	STARPU_ASSERT(sched_ctx->id != STARPU_NMAX_SCHED_CTXS);
+	STARPU_ASSERT(sched_ctx->do_schedule == 1);
+	sched_ctx->do_schedule = 0;
 	struct _starpu_machine_config *config = _starpu_get_machine_config();
 	if(sched_ctx->sched_policy)
 	{
@@ -1417,7 +1426,10 @@ void _starpu_init_all_sched_ctxs(struct _starpu_machine_config *config)
 
 	unsigned i;
 	for(i = 0; i <= STARPU_NMAX_SCHED_CTXS; i++)
+	{
+		config->sched_ctxs[i].do_schedule = 0;
 		config->sched_ctxs[i].id = STARPU_NMAX_SCHED_CTXS;
+	}
 
 	return;
 }

+ 3 - 0
src/core/sched_ctx.h

@@ -46,6 +46,9 @@ struct _starpu_sched_ctx
 	/* id of the context used in user mode*/
 	unsigned id;
 
+	/* boolean indicating whether the scheduling_ctx will be considered for scheduling (1) or not (0)*/
+	unsigned do_schedule;
+
 	/* name of context */
 	const char *name;
 

+ 9 - 9
src/core/task.c

@@ -893,14 +893,14 @@ int _starpu_task_wait_for_all_and_return_nb_waited_tasks(void)
 			int s;
 			for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++)
 			{
-				if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS)
+				if(config->sched_ctxs[s].do_schedule == 1)
 				{
 					_starpu_sched_do_schedule(config->sched_ctxs[s].id);
 				}
 			}
 			for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++)
 			{
-				if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS)
+				if(config->sched_ctxs[s].do_schedule == 1)
 				{
 					starpu_task_wait_for_all_in_ctx(config->sched_ctxs[s].id);
 				}
@@ -963,7 +963,7 @@ int starpu_task_wait_for_n_submitted(unsigned n)
 			int s;
 			for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++)
 			{
-				if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS)
+				if(config->sched_ctxs[s].do_schedule == 1)
 				{
 					_starpu_wait_for_n_submitted_tasks_of_sched_ctx(config->sched_ctxs[s].id, n);
 				}
@@ -1005,14 +1005,14 @@ int starpu_task_wait_for_no_ready(void)
 		int s;
 		for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++)
 		{
-			if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS)
+			if(config->sched_ctxs[s].do_schedule == 1)
 			{
 				_starpu_sched_do_schedule(config->sched_ctxs[s].id);
 			}
 		}
 		for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++)
 		{
-			if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS)
+			if(config->sched_ctxs[s].do_schedule == 1)
 			{
 				_starpu_wait_for_no_ready_of_sched_ctx(config->sched_ctxs[s].id);
 			}
@@ -1049,7 +1049,7 @@ void starpu_do_schedule(void)
 		int s;
 		for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++)
 		{
-			if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS)
+			if(config->sched_ctxs[s].do_schedule == 1)
 			{
 				_starpu_sched_do_schedule(config->sched_ctxs[s].id);
 			}
@@ -1074,7 +1074,7 @@ starpu_drivers_request_termination(void)
 		int s;
 		for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++)
 		{
-			if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS)
+			if(config->sched_ctxs[s].do_schedule == 1)
 			{
 				_starpu_check_nsubmitted_tasks_of_sched_ctx(config->sched_ctxs[s].id);
 			}
@@ -1095,7 +1095,7 @@ int starpu_task_nsubmitted(void)
 		int s;
 		for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++)
 		{
-			if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS)
+			if(config->sched_ctxs[s].do_schedule == 1)
 			{
 				nsubmitted += _starpu_get_nsubmitted_tasks_of_sched_ctx(config->sched_ctxs[s].id);
 			}
@@ -1116,7 +1116,7 @@ int starpu_task_nready(void)
 		int s;
 		for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++)
 		{
-			if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS)
+			if(config->sched_ctxs[s].do_schedule == 1)
 			{
 				nready += starpu_sched_ctx_get_nready_tasks(config->sched_ctxs[s].id);
 			}