瀏覽代碼

openmp: add more wait_on events

This splits starpu_omp_task_wait_on_condition into 3 new events,
ordered, lock and nest_lock. These new events will be useful for
implementing OMPT (the new OpenMP tool API).
Samuel Pitoiset 8 年之前
父節點
當前提交
f8f24670c7
共有 2 個文件被更改,包括 14 次插入12 次删除
  1. 11 11
      src/util/openmp_runtime_support.c
  2. 3 1
      src/util/openmp_runtime_support.h

+ 11 - 11
src/util/openmp_runtime_support.c

@@ -128,12 +128,12 @@ static void condition_exit(struct starpu_omp_condition *condition)
 	condition->contention_list_head = NULL;
 }
 
-static void condition_wait(struct starpu_omp_condition *condition, struct _starpu_spinlock *lock)
+static void condition_wait(struct starpu_omp_condition *condition, struct _starpu_spinlock *lock, enum starpu_omp_task_wait_on flag)
 {
 	struct starpu_omp_task *task = _starpu_omp_get_task();
 	struct starpu_omp_task_link link;
 	_starpu_spin_lock(&task->lock);
-	task->wait_on |= starpu_omp_task_wait_on_condition;
+	task->wait_on |= flag;
 	link.task = task;
 	link.next = condition->contention_list_head;
 	condition->contention_list_head = &link;
@@ -163,15 +163,15 @@ static void condition_signal(struct starpu_omp_condition *condition)
 }
 #endif
 
-static void condition_broadcast(struct starpu_omp_condition *condition)
+static void condition_broadcast(struct starpu_omp_condition *condition, enum starpu_omp_task_wait_on flag)
 {
 	while (condition->contention_list_head != NULL)
 	{
 		struct starpu_omp_task *next_task = condition->contention_list_head->task;
 		weak_task_lock(next_task);
 		condition->contention_list_head = condition->contention_list_head->next;
-		STARPU_ASSERT(next_task->wait_on & starpu_omp_task_wait_on_condition);
-		next_task->wait_on &= ~starpu_omp_task_wait_on_condition;
+		STARPU_ASSERT(next_task->wait_on & flag);
+		next_task->wait_on &= ~flag;
 		wake_up_and_unlock_task(next_task);
 	}
 }
@@ -2052,7 +2052,7 @@ void starpu_omp_ordered_inline_begin(void)
 	while (i != loop->ordered_iteration)
 	{
 		STARPU_ASSERT(i > loop->ordered_iteration);
-		condition_wait(&loop->ordered_cond, &loop->ordered_lock);
+		condition_wait(&loop->ordered_cond, &loop->ordered_lock, starpu_omp_task_wait_on_ordered);
 	}
 }
 
@@ -2063,7 +2063,7 @@ void starpu_omp_ordered_inline_end(void)
 	struct starpu_omp_loop *loop = _starpu_omp_for_get_loop(parallel_region, task);
 
 	loop->ordered_iteration++;	
-	condition_broadcast(&loop->ordered_cond);
+	condition_broadcast(&loop->ordered_cond, starpu_omp_task_wait_on_ordered);
 	_starpu_spin_unlock(&loop->ordered_lock);
 }
 
@@ -2206,7 +2206,7 @@ static void _starpu_omp_lock_set(void **_internal)
 	_starpu_spin_lock(&_lock->lock);
 	while (_lock->state != 0)
 	{
-		condition_wait(&_lock->cond, &_lock->lock);
+		condition_wait(&_lock->cond, &_lock->lock, starpu_omp_task_wait_on_lock);
 	}
 	_lock->state = 1;
 	_starpu_spin_unlock(&_lock->lock);
@@ -2218,7 +2218,7 @@ static void _starpu_omp_lock_unset(void **_internal)
 	_starpu_spin_lock(&_lock->lock);
 	STARPU_ASSERT(_lock->state == 1);
 	_lock->state = 0;
-	condition_broadcast(&_lock->cond);
+	condition_broadcast(&_lock->cond, starpu_omp_task_wait_on_lock);
 	_starpu_spin_unlock(&_lock->lock);
 }
 
@@ -2276,7 +2276,7 @@ static void _starpu_omp_nest_lock_set(void **_internal)
 	{
 		while (_nest_lock->state != 0)
 		{
-			condition_wait(&_nest_lock->cond, &_nest_lock->lock);
+			condition_wait(&_nest_lock->cond, &_nest_lock->lock, starpu_omp_task_wait_on_nest_lock);
 		}
 		STARPU_ASSERT(_nest_lock->nesting == 0);
 		STARPU_ASSERT(_nest_lock->owner_task == NULL);
@@ -2300,7 +2300,7 @@ static void _starpu_omp_nest_lock_unset(void **_internal)
 	{
 		_nest_lock->state = 0;
 		_nest_lock->owner_task = NULL;
-		condition_broadcast(&_nest_lock->cond);
+		condition_broadcast(&_nest_lock->cond, starpu_omp_task_wait_on_nest_lock);
 	}
 	_starpu_spin_unlock(&_nest_lock->lock);
 }

+ 3 - 1
src/util/openmp_runtime_support.h

@@ -193,7 +193,9 @@ enum starpu_omp_task_wait_on
 	starpu_omp_task_wait_on_barrier      = 1 << 2,
 	starpu_omp_task_wait_on_group        = 1 << 3,
 	starpu_omp_task_wait_on_critical     = 1 << 4,
-	starpu_omp_task_wait_on_condition    = 1 << 5
+	starpu_omp_task_wait_on_ordered      = 1 << 5,
+	starpu_omp_task_wait_on_lock         = 1 << 6,
+	starpu_omp_task_wait_on_nest_lock    = 1 << 7,
 };
 
 enum starpu_omp_task_flags