Kaynağa Gözat

Modular_heft2 now considers the tasks priority.

Jerome Clet-Ortega 7 yıl önce
ebeveyn
işleme
a14f0de75c

+ 12 - 6
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);
 

+ 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))
  */