Bläddra i källkod

Merge branch 'master' of git+ssh://scm.gforge.inria.fr/gitroot/starpu/starpu

Nathalie Furmento 7 år sedan
förälder
incheckning
5ddcdf2ff8

+ 4 - 1
src/core/perfmodel/perfmodel.c

@@ -1,7 +1,7 @@
 /* StarPU --- Runtime system for heterogeneous multicore architectures.
  *
  * Copyright (C) 2011-2012,2016-2017                      Inria
- * Copyright (C) 2008-2017                                Université de Bordeaux
+ * Copyright (C) 2008-2018                                Université de Bordeaux
  * Copyright (C) 2010-2017                                CNRS
  * Copyright (C) 2011                                     Télécom-SudParis
  * Copyright (C) 2016                                     Uppsala University
@@ -342,6 +342,9 @@ double starpu_task_expected_data_transfer_time(unsigned memory_node, struct star
 	{
 		starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, buffer);
 		enum starpu_data_access_mode mode = STARPU_TASK_GET_MODE(task, buffer);
+		unsigned node = memory_node;
+		if (task->cl->specific_nodes)
+			node = STARPU_CODELET_GET_NODE(task->cl, buffer);
 
 		penalty += starpu_data_expected_transfer_time(handle, memory_node, mode);
 	}

+ 14 - 8
src/sched_policies/component_heft.c

@@ -45,15 +45,21 @@ static int heft_progress_one(struct starpu_sched_component *component)
 	starpu_pthread_mutex_t * mutex = &data->mutex;
 	struct _starpu_prio_deque * prio = &data->prio;
 	struct starpu_task * (tasks[NTASKS]);
-	unsigned ntasks;
+	unsigned ntasks = 0;
 
 	STARPU_COMPONENT_MUTEX_LOCK(mutex);
-	/* Try to look at NTASKS from the queue */
-	for (ntasks = 0; ntasks < NTASKS; ntasks++)
+	tasks[0] = _starpu_prio_deque_pop_task(prio);
+	if (tasks[0])
 	{
-		tasks[ntasks] = _starpu_prio_deque_pop_task(prio);
-		if (!tasks[ntasks])
-			break;
+		int priority = tasks[0]->priority;
+		/* Try to look at NTASKS from the queue */
+		for (ntasks = 1; ntasks < NTASKS; ntasks++)
+		{
+			tasks[ntasks] = _starpu_prio_deque_highest_task(prio);
+ 			if (!tasks[ntasks] || tasks[ntasks]->priority < priority)
+ 				break;
+ 			_starpu_prio_deque_pop_task(prio);		
+		}
 	}
 	STARPU_COMPONENT_MUTEX_UNLOCK(mutex);
 
@@ -105,10 +111,10 @@ static int heft_progress_one(struct starpu_sched_component *component)
 		}
 
 		int best_task = 0;
-		double max_benefit =  max_exp_end_with_task[0] - min_exp_end_with_task[0];
+		double max_benefit = 0;
 
 		/* Find the task which provides the most computation time benefit */
-		for (n = 1; n < ntasks; n++)
+		for (n = 0; n < ntasks; n++)
 		{
 			double benefit = max_exp_end_with_task[n] - min_exp_end_with_task[n];
 			if (max_benefit < benefit)

+ 9 - 0
src/sched_policies/prio_deque.h

@@ -74,6 +74,15 @@ static inline int _starpu_prio_deque_push_back_task(struct _starpu_prio_deque *p
 int _starpu_prio_deque_push_back_task(struct _starpu_prio_deque *, struct starpu_task *);
 
 
+static inline struct starpu_task * _starpu_prio_deque_highest_task(struct _starpu_prio_deque *pdeque)
+{
+	struct starpu_task *task;
+	if (starpu_task_prio_list_empty(&pdeque->list))
+		return NULL;
+	task = starpu_task_prio_list_front_highest(&pdeque->list);
+	return task;
+}
+
 /* all _starpu_prio_deque_pop/deque_task function return a task or a NULL pointer if none are available
  * in O(lg(nb priorities))
  */