Procházet zdrojové kódy

_starpu_fifo_push_task(): Fix "TODO: if prio, put at back".

Move _starpu_fifo_push_sorted_task() from deque_modeling_policy_data_aware to fifo_queues.c.
Cyril Roelandt před 12 roky
rodič
revize
b188aa78c8

+ 0 - 67
src/sched_policies/deque_modeling_policy_data_aware.c

@@ -200,73 +200,6 @@ static struct starpu_task *dmda_pop_every_task(void)
 	return new_list;
 }
 
-static
-int _starpu_fifo_push_sorted_task(struct _starpu_fifo_taskq *fifo_queue, pthread_mutex_t *sched_mutex, pthread_cond_t *sched_cond, struct starpu_task *task)
-{
-	struct starpu_task_list *list = &fifo_queue->taskq;
-
-	_STARPU_PTHREAD_MUTEX_LOCK(sched_mutex);
-
-	_STARPU_TRACE_JOB_PUSH(task, 0);
-
-	if (list->head == NULL)
-	{
-		list->head = task;
-		list->tail = task;
-		task->prev = NULL;
-		task->next = NULL;
-	}
-	else
-	{
-		struct starpu_task *current = list->head;
-		struct starpu_task *prev = NULL;
-
-		while (current)
-		{
-			if (current->priority >= task->priority)
-				break;
-
-			prev = current;
-			current = current->next;
-		}
-
-		if (prev == NULL)
-		{
-			/* Insert at the front of the list */
-			list->head->prev = task;
-			task->prev = NULL;
-			task->next = list->head;
-			list->head = task;
-		}
-		else
-		{
-			if (current)
-			{
-				/* Insert between prev and current */
-				task->prev = prev;
-				prev->next = task;
-				task->next = current;
-				current->prev = task;
-			}
-			else
-			{
-				/* Insert at the tail of the list */
-				list->tail->next = task;
-				task->next = NULL;
-				task->prev = list->tail;
-				list->tail = task;
-			}
-		}
-	}
-
-	fifo_queue->ntasks++;
-	fifo_queue->nprocessed++;
-
-	_STARPU_PTHREAD_COND_SIGNAL(sched_cond);
-	_STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex);
-
-	return 0;
-}
 
 
 

+ 85 - 4
src/sched_policies/fifo_queues.c

@@ -52,14 +52,68 @@ int _starpu_fifo_empty(struct _starpu_fifo_taskq *fifo)
 	return fifo->ntasks == 0;
 }
 
-/* TODO: revert front/back? */
-int _starpu_fifo_push_task(struct _starpu_fifo_taskq *fifo_queue, pthread_mutex_t *sched_mutex, pthread_cond_t *sched_cond, struct starpu_task *task)
+int
+_starpu_fifo_push_sorted_task(struct _starpu_fifo_taskq *fifo_queue,
+			      pthread_mutex_t *sched_mutex,
+			      pthread_cond_t *sched_cond,
+			      struct starpu_task *task)
 {
+	struct starpu_task_list *list = &fifo_queue->taskq;
+
 	_STARPU_PTHREAD_MUTEX_LOCK(sched_mutex);
 
 	_STARPU_TRACE_JOB_PUSH(task, 0);
-	/* TODO: if prio, put at back */
-	starpu_task_list_push_front(&fifo_queue->taskq, task);
+
+	if (list->head == NULL)
+	{
+		list->head = task;
+		list->tail = task;
+		task->prev = NULL;
+		task->next = NULL;
+	}
+	else
+	{
+		struct starpu_task *current = list->head;
+		struct starpu_task *prev = NULL;
+
+		while (current)
+		{
+			if (current->priority >= task->priority)
+				break;
+
+			prev = current;
+			current = current->next;
+		}
+
+		if (prev == NULL)
+		{
+			/* Insert at the front of the list */
+			list->head->prev = task;
+			task->prev = NULL;
+			task->next = list->head;
+			list->head = task;
+		}
+		else
+		{
+			if (current)
+			{
+				/* Insert between prev and current */
+				task->prev = prev;
+				prev->next = task;
+				task->next = current;
+				current->prev = task;
+			}
+			else
+			{
+				/* Insert at the tail of the list */
+				list->tail->next = task;
+				task->next = NULL;
+				task->prev = list->tail;
+				list->tail = task;
+			}
+		}
+	}
+
 	fifo_queue->ntasks++;
 	fifo_queue->nprocessed++;
 
@@ -69,6 +123,33 @@ int _starpu_fifo_push_task(struct _starpu_fifo_taskq *fifo_queue, pthread_mutex_
 	return 0;
 }
 
+/* TODO: revert front/back? */
+int _starpu_fifo_push_task(struct _starpu_fifo_taskq *fifo_queue, pthread_mutex_t *sched_mutex, pthread_cond_t *sched_cond, struct starpu_task *task)
+{
+
+	if (task->priority > 0)
+	{
+		_STARPU_TRACE_JOB_PUSH(task, 1);
+		_starpu_fifo_push_sorted_task(fifo_queue, sched_mutex,
+					      sched_cond, task);
+	}
+	else
+	{
+		_STARPU_TRACE_JOB_PUSH(task, 0);
+
+		_STARPU_PTHREAD_MUTEX_LOCK(sched_mutex);
+		starpu_task_list_push_front(&fifo_queue->taskq, task);
+
+		fifo_queue->ntasks++;
+		fifo_queue->nprocessed++;
+
+		_STARPU_PTHREAD_COND_SIGNAL(sched_cond);
+		_STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex);
+	}
+
+	return 0;
+}
+
 struct starpu_task *_starpu_fifo_pop_task(struct _starpu_fifo_taskq *fifo_queue, int workerid)
 {
 	struct starpu_task *task;

+ 5 - 0
src/sched_policies/fifo_queues.h

@@ -44,6 +44,11 @@ void _starpu_destroy_fifo(struct _starpu_fifo_taskq *fifo);
 
 int _starpu_fifo_empty(struct _starpu_fifo_taskq *fifo);
 
+int _starpu_fifo_push_sorted_task(struct _starpu_fifo_taskq *fifo_queue,
+				  pthread_mutex_t *sched_mutex,
+				  pthread_cond_t *sched_cond,
+				  struct starpu_task *task);
+
 int _starpu_fifo_push_task(struct _starpu_fifo_taskq *fifo, pthread_mutex_t *sched_mutex, pthread_cond_t *sched_cond, struct starpu_task *task);
 
 struct starpu_task *_starpu_fifo_pop_task(struct _starpu_fifo_taskq *fifo, int workerid);