Browse Source

openmp: add _starpu_omp_get_region_at_level()

This new internal function will be also used for OMPT.
Samuel Pitoiset 8 years ago
parent
commit
7bf9dbc347

+ 20 - 0
src/util/openmp_runtime_support.c

@@ -79,6 +79,26 @@ static inline void _starpu_omp_set_task(struct starpu_omp_task *task)
 	STARPU_PTHREAD_SETSPECIFIC(omp_task_key, task);
 }
 
+struct starpu_omp_region *_starpu_omp_get_region_at_level(int level)
+{
+	const struct starpu_omp_task *task = _starpu_omp_get_task();
+	struct starpu_omp_region *parallel_region;
+
+	if (!task)
+		return NULL;
+
+	parallel_region = task->owner_region;
+	if (level < 0 || level > parallel_region->icvs.levels_var)
+		return NULL;
+
+	while (level < parallel_region->icvs.levels_var)
+	{
+		parallel_region = parallel_region->parent_region;
+	}
+
+	return parallel_region;
+}
+
 static void weak_task_lock(struct starpu_omp_task *task)
 {
 	_starpu_spin_lock(&task->lock);

+ 1 - 0
src/util/openmp_runtime_support.h

@@ -393,6 +393,7 @@ extern double _starpu_omp_clock_ref;
 void _starpu_omp_environment_init(void);
 void _starpu_omp_environment_exit(void);
 struct starpu_omp_thread *_starpu_omp_get_thread(void);
+struct starpu_omp_region *_starpu_omp_get_region_at_level(int level);
 struct starpu_omp_task *_starpu_omp_get_task(void);
 void _starpu_omp_dummy_init(void);
 void _starpu_omp_dummy_shutdown(void);

+ 12 - 18
src/util/openmp_runtime_support_omp_api.c

@@ -167,35 +167,29 @@ int starpu_omp_get_level (void)
 
 int starpu_omp_get_ancestor_thread_num (int level)
 {
+	struct starpu_omp_region *parallel_region;
+
 	if (level == 0)
 		return 0;
-	const struct starpu_omp_task *task = _starpu_omp_get_task();
-	if (task == NULL)
-		return -1;
-	const struct starpu_omp_region *parallel_region = task->owner_region;
-	if (level < 0 || level > parallel_region->icvs.levels_var)
+
+	parallel_region = _starpu_omp_get_region_at_level(level);
+	if (!parallel_region)
 		return -1;
-	while (level < parallel_region->icvs.levels_var)
-	{
-		parallel_region = parallel_region->parent_region;
-	}
+
 	return _starpu_omp_get_region_thread_num(parallel_region);
 }
 
 int starpu_omp_get_team_size (int level)
 {
+	struct starpu_omp_region *parallel_region;
+
 	if (level == 0)
 		return 1;
-	const struct starpu_omp_task *task = _starpu_omp_get_task();
-	if (task == NULL)
-		return -1;
-	const struct starpu_omp_region *parallel_region = task->owner_region;
-	if (level < 0 || level > parallel_region->icvs.levels_var)
+
+	parallel_region = _starpu_omp_get_region_at_level(level);
+	if (!parallel_region)
 		return -1;
-	while (level < parallel_region->icvs.levels_var)
-	{
-		parallel_region = parallel_region->parent_region;
-	}
+
 	return parallel_region->nb_threads;
 }