Bläddra i källkod

Review the fix proposed in r15577 because of some edge cases.

Terry Cojean 10 år sedan
förälder
incheckning
3533faa87f

+ 1 - 1
include/starpu_sched_ctx.h

@@ -151,7 +151,7 @@ unsigned starpu_sched_ctx_master_get_context(int masterid);
 
 void starpu_sched_ctx_revert_task_counters(unsigned sched_ctx_id, double flops);
 
-void starpu_sched_ctx_move_task_to_ctx(struct starpu_task *task, unsigned sched_ctx);
+void starpu_sched_ctx_move_task_to_ctx(struct starpu_task *task, unsigned sched_ctx, unsigned manage_mutex);
 
 int starpu_sched_ctx_get_worker_rank(unsigned sched_ctx_id);
 

+ 15 - 1
src/core/sched_ctx.c

@@ -1984,8 +1984,19 @@ void starpu_sched_ctx_revert_task_counters(unsigned sched_ctx_id, double ready_f
         _starpu_decrement_nready_tasks_of_sched_ctx(sched_ctx_id, ready_flops);
 }
 
-void starpu_sched_ctx_move_task_to_ctx(struct starpu_task *task, unsigned sched_ctx)
+void starpu_sched_ctx_move_task_to_ctx(struct starpu_task *task, unsigned sched_ctx, unsigned manage_mutex)
 {
+	/* TODO: make something cleaner which differentiates between calls
+	   from push or pop (have mutex or not) and from another worker or not */
+	int workerid = starpu_worker_get_id();
+	struct _starpu_worker *worker  = NULL;
+	if(workerid != -1 && manage_mutex)
+	{
+		worker = _starpu_get_worker_struct(workerid);
+		STARPU_PTHREAD_MUTEX_UNLOCK(&worker->sched_mutex);
+	}
+
+
 	task->sched_ctx = sched_ctx;
 
 	struct _starpu_job *j = _starpu_get_job_associated_to_task(task);
@@ -1993,6 +2004,9 @@ void starpu_sched_ctx_move_task_to_ctx(struct starpu_task *task, unsigned sched_
 	_starpu_increment_nsubmitted_tasks_of_sched_ctx(j->task->sched_ctx);
 
 	_starpu_repush_task(j);
+
+	if(workerid != -1 && manage_mutex)
+		STARPU_PTHREAD_MUTEX_LOCK(&worker->sched_mutex);
 }
 
 void starpu_sched_ctx_list_task_counters_increment(unsigned sched_ctx_id, int workerid)

+ 1 - 1
src/sched_policies/deque_modeling_policy_data_aware.c

@@ -334,7 +334,7 @@ static int push_task_on_best_worker(struct starpu_task *task, int best_workerid,
 
         if(child_sched_ctx != STARPU_NMAX_SCHED_CTXS)
         {
-                starpu_sched_ctx_move_task_to_ctx(task, child_sched_ctx);
+                starpu_sched_ctx_move_task_to_ctx(task, child_sched_ctx, 0);
 		starpu_sched_ctx_revert_task_counters(sched_ctx_id, task->flops);
                 return 0;
         }

+ 1 - 1
src/sched_policies/eager_central_policy.c

@@ -189,7 +189,7 @@ static struct starpu_task *pop_task_eager_policy(unsigned sched_ctx_id)
 		unsigned child_sched_ctx = starpu_sched_ctx_worker_is_master_for_child_ctx(workerid, sched_ctx_id);
 		if(child_sched_ctx != STARPU_NMAX_SCHED_CTXS)
 		{
-			starpu_sched_ctx_move_task_to_ctx(task, child_sched_ctx);
+			starpu_sched_ctx_move_task_to_ctx(task, child_sched_ctx, 1);
 			starpu_sched_ctx_revert_task_counters(sched_ctx_id, task->flops);
 			return NULL;
 		}

+ 1 - 1
src/sched_policies/eager_central_priority_policy.c

@@ -292,7 +292,7 @@ static struct starpu_task *_starpu_priority_pop_task(unsigned sched_ctx_id)
                 unsigned child_sched_ctx = starpu_sched_ctx_worker_is_master_for_child_ctx(workerid, sched_ctx_id);
 		if(child_sched_ctx != STARPU_NMAX_SCHED_CTXS)
 		{
-			starpu_sched_ctx_move_task_to_ctx(chosen_task, child_sched_ctx);
+			starpu_sched_ctx_move_task_to_ctx(chosen_task, child_sched_ctx, 1);
 			starpu_sched_ctx_revert_task_counters(sched_ctx_id, chosen_task->flops);
 			return NULL;
 		}

+ 2 - 2
src/sched_policies/heteroprio.c

@@ -586,18 +586,18 @@ static struct starpu_task *pop_task_heteroprio_policy(unsigned sched_ctx_id)
 	}
 	STARPU_PTHREAD_MUTEX_UNLOCK(&hp->policy_mutex);
 
+	STARPU_PTHREAD_MUTEX_LOCK(worker_sched_mutex);
 	if(task)
 	{
 		unsigned child_sched_ctx = starpu_sched_ctx_worker_is_master_for_child_ctx(workerid, sched_ctx_id);
 		if(child_sched_ctx != STARPU_NMAX_SCHED_CTXS)
 		{
-			starpu_sched_ctx_move_task_to_ctx(task, child_sched_ctx);
+			starpu_sched_ctx_move_task_to_ctx(task, child_sched_ctx, 1);
 			starpu_sched_ctx_revert_task_counters(sched_ctx_id, task->flops);
 			return NULL;
 		}
 	}
 
-	STARPU_PTHREAD_MUTEX_LOCK(worker_sched_mutex);
 	/* if we have task (task) me way have some in the queue (worker->tasks_queue_size) that was freshly addeed (nb_added_tasks) */
 	if(task && worker->tasks_queue->ntasks && nb_added_tasks && starpu_get_prefetch_flag())
 	{