Sfoglia il codice sorgente

rework job list structure, to make it more powerful

Samuel Thibault 9 anni fa
parent
commit
0ea5bc54a2
3 ha cambiato i file con 50 aggiunte e 36 eliminazioni
  1. 14 0
      src/core/jobs.c
  2. 34 36
      src/core/jobs.h
  3. 2 0
      src/core/workers.c

+ 14 - 0
src/core/jobs.c

@@ -39,6 +39,13 @@ static struct _starpu_job_list all_jobs_list;
 static starpu_pthread_mutex_t all_jobs_list_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER;
 #endif
 
+void _starpu_job_init(void)
+{
+#ifdef STARPU_DEBUG
+	_starpu_job_list_init(&all_jobs_list);
+#endif
+}
+
 void _starpu_exclude_task_from_dag(struct starpu_task *task)
 {
 	struct _starpu_job *j = _starpu_get_job_associated_to_task(task);
@@ -230,6 +237,13 @@ void _starpu_handle_job_submission(struct _starpu_job *j)
 #ifdef STARPU_DEBUG
 	STARPU_PTHREAD_MUTEX_LOCK(&all_jobs_list_mutex);
 	_starpu_job_list_push_back(&all_jobs_list, j, all_submitted);
+
+	for (j = _starpu_job_list_begin(&all_jobs_list, all_submitted);
+	     j != _starpu_job_list_end(&all_jobs_list, all_submitted);
+	     j = _starpu_job_list_next(&all_jobs_list, j, all_submitted))
+	{
+		STARPU_ASSERT(_starpu_job_of(j->all_submitted.prev->next, all_submitted) == j);
+	}
 	STARPU_PTHREAD_MUTEX_UNLOCK(&all_jobs_list_mutex);
 #endif
 }

+ 34 - 36
src/core/jobs.h

@@ -64,8 +64,8 @@ struct _starpu_data_descr
 };
 
 struct _starpu_job_list {
-	struct _starpu_job *next;
-	struct _starpu_job *prev;
+	struct _starpu_job_list *next;
+	struct _starpu_job_list *prev;
 };
 
 #ifdef STARPU_DEBUG
@@ -74,18 +74,24 @@ struct _starpu_job_list {
 #define STARPU_ASSERT_JOB_LIST(expr) ((void) 0)
 #endif
 
+#define _starpu_job_of(elt, member) \
+	((struct _starpu_job *) ((uintptr_t) (elt) - ((uintptr_t) (&((struct _starpu_job *) 0)->member))))
+
+#define _starpu_job_list_init(head) do { \
+	struct _starpu_job_list *_head = (head); \
+	_head->next = _head; \
+	_head->prev = _head; \
+} while (0)
+
 #define _starpu_job_list_push_front(head, j, member) do { \
 	struct _starpu_job *_j = (j); \
 	struct _starpu_job_list *_head = (head); \
 	STARPU_ASSERT_JOB_LIST(_j->member.prev == NULL); \
 	STARPU_ASSERT_JOB_LIST(_j->member.next == NULL); \
-	if (_head->next) { \
-		_j->member.next = _head->next; \
-		_head->next->member.prev = _j; \
-	} else { \
-		_head->prev = _j; \
-	} \
-	_head->next = _j; \
+	_j->member.next = _head->next; \
+	_j->member.prev = _head; \
+	_head->next->prev = &_j->member; \
+	_head->next = &_j->member; \
 } while (0)
 
 #define _starpu_job_list_push_back(head, j, member) do { \
@@ -93,44 +99,34 @@ struct _starpu_job_list {
 	struct _starpu_job_list *_head = (head); \
 	STARPU_ASSERT_JOB_LIST(_j->member.prev == NULL); \
 	STARPU_ASSERT_JOB_LIST(_j->member.next == NULL); \
-	if (_head->prev) { \
-		_j->member.prev = _head->prev; \
-		_head->prev->member.next = _j; \
-	} else { \
-		_head->next = _j; \
-	} \
-	_head->prev = _j; \
+	_j->member.prev = _head->prev; \
+	_j->member.next = _head; \
+	_head->prev->next = &_j->member; \
+	_head->prev = &_j->member; \
 } while (0)
 
 #define _starpu_job_list_erase(head, j, member) do { \
 	struct _starpu_job *_j = (j); \
-	struct _starpu_job_list *_head = (head); \
-	if (_j->member.next) { \
-		STARPU_ASSERT_JOB_LIST(_j->member.next->member.prev == _j); \
-		_j->member.next->member.prev = _j->member.prev; \
-	} else { \
-		STARPU_ASSERT_JOB_LIST(_head->prev == _j); \
-		_head->prev = _j->member.prev; \
-	} \
-	if (_j->member.prev) { \
-		STARPU_ASSERT_JOB_LIST(_j->member.prev->member.next == _j); \
-		_j->member.prev->member.next = _j->member.next; \
-	} else { \
-		STARPU_ASSERT_JOB_LIST(_head->next == _j); \
-		_head->next = _j->member.next; \
-	} \
+	STARPU_ASSERT_JOB_LIST(_j->member.next->prev == &_j->member); \
+	_j->member.next->prev = _j->member.prev; \
+	STARPU_ASSERT_JOB_LIST(_j->member.prev->next == &_j->member); \
+	_j->member.prev->next = _j->member.next; \
 	_j->member.next = NULL; \
 	_j->member.prev = NULL; \
 } while (0)
 
+#define _starpu_job_list_queued(j, member) \
+	((j)->member.next != NULL)
+
 #define _starpu_job_list_empty(head) \
-	((head)->next != NULL)
+	((head)->next != head)
+
 #define _starpu_job_list_begin(head, member) \
-	((head)->next)
+	_starpu_job_of((head)->next, member)
 #define _starpu_job_list_next(head, j, member) \
-	((j)->next)
-#define _starpu_job_list_end(head, j, member) \
-	(NULL)
+	_starpu_job_of((j)->member.next, member)
+#define _starpu_job_list_end(head, member) \
+	_starpu_job_of(head, member)
 
 /* A job is the internal representation of a task. */
 struct _starpu_job {
@@ -262,6 +258,8 @@ struct _starpu_job {
 #endif
 };
 
+void _starpu_job_init(void);
+
 /* Create an internal struct _starpu_job *structure to encapsulate the task. */
 struct _starpu_job* STARPU_ATTRIBUTE_MALLOC _starpu_job_create(struct starpu_task *task);
 

+ 2 - 0
src/core/workers.c

@@ -1177,6 +1177,8 @@ int starpu_initialize(struct starpu_conf *user_conf, int *argc, char ***argv)
 		_starpu_config.conf.not_launched_drivers = copy;
 	}
 
+	_starpu_job_init();
+
 	_starpu_init_all_sched_ctxs(&_starpu_config);
 	_starpu_init_progression_hooks();