Selaa lähdekoodia

wake up target worker on push_local_task
do not clear keep_awake in sched policies since it may have been set to indicate a new local task

Olivier Aumage 8 vuotta sitten
vanhempi
commit
800fd1e875

+ 1 - 0
src/core/task.c

@@ -801,6 +801,7 @@ int _starpu_task_submit_conversion_task(struct starpu_task *task,
 	struct _starpu_worker *worker;
 	worker = _starpu_get_worker_struct(workerid);
 	starpu_task_list_push_back(&worker->local_tasks, task);
+	starpu_wake_worker_locked(worker->workerid);
 
 	_starpu_profiling_set_task_push_end_time(task);
 

+ 4 - 2
src/sched_policies/component_worker.c

@@ -435,10 +435,12 @@ static struct starpu_task * simple_worker_pull_task(struct starpu_sched_componen
 	struct _starpu_worker_task_list * list = data->list;
 	struct starpu_task * task;
 	int i;
+	int n_tries = 0;
 	do
 	{
+		/* do not reset state_keep_awake here has it may hide tasks in worker->local_tasks */
+		n_tries++;
 		STARPU_COMPONENT_MUTEX_LOCK(&list->mutex);
-		worker->state_keep_awake = 0;
 		/* Take the opportunity to update start time */
 		data->list->exp_start = STARPU_MAX(starpu_timing_now(), data->list->exp_start);
 		data->list->exp_end = data->list->exp_start + data->list->exp_len;
@@ -463,7 +465,7 @@ static struct starpu_task * simple_worker_pull_task(struct starpu_sched_componen
 			}
 		}
 	}
-	while((!task) && worker->state_keep_awake);
+	while((!task) && worker->state_keep_awake && n_tries < 2);
 	if(!task)
 		goto ret;
 	if(task->cl->type == STARPU_SPMD)

+ 4 - 2
src/sched_policies/work_stealing_policy.c

@@ -589,11 +589,13 @@ static struct starpu_task *ws_pop_task(unsigned sched_ctx_id)
 		struct _starpu_worker *worker = _starpu_get_worker_struct(starpu_worker_get_id());
 		if (!task && worker->state_keep_awake)
 		{
-			/* keep_awake notice taken into account here, clear flag */
-			worker->state_keep_awake = 0;
 			task = ws_pick_task(ws, workerid, workerid);
 			if (task)
+			{
+				/* keep_awake notice taken into account here, clear flag */
+				worker->state_keep_awake = 0;
 				locality_popped_task(ws, task, workerid, sched_ctx_id);
+			}
 		}
 	}
 #endif