浏览代码

reduce difference between eager and prio

Samuel Thibault 9 年之前
父节点
当前提交
a96ff17210
共有 2 个文件被更改,包括 21 次插入12 次删除
  1. 9 9
      src/sched_policies/eager_central_policy.c
  2. 12 3
      src/sched_policies/eager_central_priority_policy.c

+ 9 - 9
src/sched_policies/eager_central_policy.c

@@ -148,11 +148,10 @@ static struct starpu_task *pop_every_task_eager_policy(unsigned sched_ctx_id)
 
 
 static struct starpu_task *pop_task_eager_policy(unsigned sched_ctx_id)
 static struct starpu_task *pop_task_eager_policy(unsigned sched_ctx_id)
 {
 {
+	struct starpu_task *chosen_task = NULL;
 	unsigned workerid = starpu_worker_get_id();
 	unsigned workerid = starpu_worker_get_id();
 	struct _starpu_eager_center_policy_data *data = (struct _starpu_eager_center_policy_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id);
 	struct _starpu_eager_center_policy_data *data = (struct _starpu_eager_center_policy_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id);
 
 
-	struct starpu_task *task = NULL;
-
 	/* block until some event happens */
 	/* block until some event happens */
 	/* Here helgrind would shout that this is unprotected, this is just an
 	/* Here helgrind would shout that this is unprotected, this is just an
 	 * integer access, and we hold the sched mutex, so we can not miss any
 	 * integer access, and we hold the sched mutex, so we can not miss any
@@ -168,27 +167,28 @@ static struct starpu_task *pop_task_eager_policy(unsigned sched_ctx_id)
 
 
 	STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex);
 	STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex);
 
 
-	task = _starpu_fifo_pop_task(data->fifo, workerid);
-	if (!task)
+	chosen_task = _starpu_fifo_pop_task(data->fifo, workerid);
+	if (!chosen_task)
 		/* Tell pushers that we are waiting for tasks for us */
 		/* Tell pushers that we are waiting for tasks for us */
 		starpu_bitmap_set(data->waiters, workerid);
 		starpu_bitmap_set(data->waiters, workerid);
 
 
 	STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex);
 	STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex);
 
 
-	if(task)
+	if(chosen_task)
 	{
 	{
-		starpu_sched_ctx_list_task_counters_decrement_all(task, sched_ctx_id);
+		starpu_sched_ctx_list_task_counters_decrement_all(chosen_task, sched_ctx_id);
 
 
 		unsigned child_sched_ctx = starpu_sched_ctx_worker_is_master_for_child_ctx(workerid, 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)
 		if(child_sched_ctx != STARPU_NMAX_SCHED_CTXS)
 		{
 		{
-			starpu_sched_ctx_move_task_to_ctx(task, child_sched_ctx, 1);
-			starpu_sched_ctx_revert_task_counters(sched_ctx_id, task->flops);
+			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;
 			return NULL;
 		}
 		}
 	}
 	}
 
 
-	return task;
+
+	return chosen_task;
 }
 }
 
 
 static void eager_add_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers)
 static void eager_add_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers)

+ 12 - 3
src/sched_policies/eager_central_priority_policy.c

@@ -1,6 +1,6 @@
 /* StarPU --- Runtime system for heterogeneous multicore architectures.
 /* StarPU --- Runtime system for heterogeneous multicore architectures.
  *
  *
- * Copyright (C) 2010-2015  Université de Bordeaux
+ * Copyright (C) 2010-2016  Université de Bordeaux
  * Copyright (C) 2010, 2011, 2012, 2013, 2015  CNRS
  * Copyright (C) 2010, 2011, 2012, 2013, 2015  CNRS
  * Copyright (C) 2011  INRIA
  * Copyright (C) 2011  INRIA
  *
  *
@@ -109,7 +109,7 @@ static void deinitialize_eager_center_priority_policy(unsigned sched_ctx_id)
 	/* TODO check that there is no task left in the queue */
 	/* TODO check that there is no task left in the queue */
 	struct _starpu_eager_central_prio_data *data = (struct _starpu_eager_central_prio_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id);
 	struct _starpu_eager_central_prio_data *data = (struct _starpu_eager_central_prio_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id);
 
 
-	/* deallocate the task queue */
+	/* deallocate the job queue */
 	_starpu_destroy_priority_taskq(data->taskq);
 	_starpu_destroy_priority_taskq(data->taskq);
 	starpu_bitmap_destroy(data->waiters);
 	starpu_bitmap_destroy(data->waiters);
 
 
@@ -140,6 +140,7 @@ static int _starpu_priority_push_task(struct starpu_task *task)
 #ifndef STARPU_NON_BLOCKING_DRIVERS
 #ifndef STARPU_NON_BLOCKING_DRIVERS
 	char dowake[STARPU_NMAXWORKERS] = { 0 };
 	char dowake[STARPU_NMAXWORKERS] = { 0 };
 #endif
 #endif
+
 	workers->init_iterator_for_parallel_tasks(workers, &it, task);
 	workers->init_iterator_for_parallel_tasks(workers, &it, task);
 	while(workers->has_next(workers, &it))
 	while(workers->has_next(workers, &it))
 	{
 	{
@@ -166,7 +167,7 @@ static int _starpu_priority_push_task(struct starpu_task *task)
 	/* Let the task free */
 	/* Let the task free */
 	STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex);
 	STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex);
 
 
-#ifndef STARPU_NON_BLOCKING_DRIVERS
+#if !defined(STARPU_NON_BLOCKING_DRIVERS) || defined(STARPU_SIMGRID)
 	/* Now that we have a list of potential workers, try to wake one */
 	/* Now that we have a list of potential workers, try to wake one */
 
 
 	workers->init_iterator(workers, &it);
 	workers->init_iterator(workers, &it);
@@ -304,6 +305,10 @@ static void eager_center_priority_add_workers(unsigned sched_ctx_id, int *worker
         for (i = 0; i < nworkers; i++)
         for (i = 0; i < nworkers; i++)
         {
         {
 		workerid = workerids[i];
 		workerid = workerids[i];
+		int curr_workerid = starpu_worker_get_id();
+		if(workerid != curr_workerid)
+			starpu_wake_worker(workerid);
+
                 starpu_sched_ctx_worker_shares_tasks_lists(workerid, sched_ctx_id);
                 starpu_sched_ctx_worker_shares_tasks_lists(workerid, sched_ctx_id);
         }
         }
 }
 }
@@ -321,5 +326,9 @@ struct starpu_sched_policy _starpu_sched_prio_policy =
 	.pop_every_task = NULL,
 	.pop_every_task = NULL,
 	.policy_name = "prio",
 	.policy_name = "prio",
 	.policy_description = "eager (with priorities)",
 	.policy_description = "eager (with priorities)",
+#ifdef STARPU_HAVE_HWLOC
+	.worker_type = STARPU_WORKER_TREE,
+#else
 	.worker_type = STARPU_WORKER_LIST,
 	.worker_type = STARPU_WORKER_LIST,
+#endif
 };
 };