summaryrefslogtreecommitdiffstats
path: root/openmp/runtime
diff options
context:
space:
mode:
authorJonathan Peyton <jonathan.l.peyton@intel.com>2016-06-21 19:12:07 +0000
committerJonathan Peyton <jonathan.l.peyton@intel.com>2016-06-21 19:12:07 +0000
commitc76f9f0df81de05e19e15a7c756d50b413cddbb9 (patch)
tree522c2e54607c0e6e963a084b06f37dad23904bed /openmp/runtime
parent93b4b2e386209aa353091240c591ebeefae45bed (diff)
downloadbcm5719-llvm-c76f9f0df81de05e19e15a7c756d50b413cddbb9.tar.gz
bcm5719-llvm-c76f9f0df81de05e19e15a7c756d50b413cddbb9.zip
Bug fix for hang when tasks used in nested parallel
Bug fix for hang when omp task and nested parallelism used together. Still some problem remains with task state saving/restoring, but user's case works fine now. All tasking unit tests passed as well. Patch by Andrey Churbanov Differential Revision: http://reviews.llvm.org/D21558 llvm-svn: 273297
Diffstat (limited to 'openmp/runtime')
-rw-r--r--openmp/runtime/src/kmp_runtime.c6
-rw-r--r--openmp/runtime/test/tasking/nested_parallel_tasking.c32
2 files changed, 35 insertions, 3 deletions
diff --git a/openmp/runtime/src/kmp_runtime.c b/openmp/runtime/src/kmp_runtime.c
index 446dccb4aa5..55d080b9062 100644
--- a/openmp/runtime/src/kmp_runtime.c
+++ b/openmp/runtime/src/kmp_runtime.c
@@ -1459,8 +1459,8 @@ __kmp_fork_call(
// Nested level will be an index in the nested nthreads array
level = parent_team->t.t_level;
-#if OMP_40_ENABLED
active_level = parent_team->t.t_active_level; // is used to launch non-serial teams even if nested is not allowed
+#if OMP_40_ENABLED
teams_level = master_th->th.th_teams_level; // needed to check nesting inside the teams
#endif
#if KMP_NESTED_HOT_TEAMS
@@ -2051,7 +2051,7 @@ __kmp_fork_call(
__kmp_gtid_from_thread( master_th ), master_th->th.th_task_team,
parent_team, team->t.t_task_team[master_th->th.th_task_state], team ) );
- if ( level || master_th->th.th_task_team ) {
+ if ( active_level || master_th->th.th_task_team ) {
// Take a memo of master's task_state
KMP_DEBUG_ASSERT(master_th->th.th_task_state_memo_stack);
if (master_th->th.th_task_state_top >= master_th->th.th_task_state_stack_sz) { // increase size
@@ -2074,7 +2074,7 @@ __kmp_fork_call(
master_th->th.th_task_state_memo_stack[master_th->th.th_task_state_top] = master_th->th.th_task_state;
master_th->th.th_task_state_top++;
#if KMP_NESTED_HOT_TEAMS
- if (team == master_th->th.th_hot_teams[level].hot_team) { // Restore master's nested state if nested hot team
+ if (team == master_th->th.th_hot_teams[active_level].hot_team) { // Restore master's nested state if nested hot team
master_th->th.th_task_state = master_th->th.th_task_state_memo_stack[master_th->th.th_task_state_top];
}
else {
diff --git a/openmp/runtime/test/tasking/nested_parallel_tasking.c b/openmp/runtime/test/tasking/nested_parallel_tasking.c
new file mode 100644
index 00000000000..4374d6ecda2
--- /dev/null
+++ b/openmp/runtime/test/tasking/nested_parallel_tasking.c
@@ -0,0 +1,32 @@
+// RUN: %libomp-compile-and-run
+#include <stdio.h>
+#include <omp.h>
+
+/*
+ * This test would hang when level instead of active level
+ * used to push task state.
+ */
+
+int main()
+{
+ // If num_threads is changed to a value greater than 1, then the test passes
+ #pragma omp parallel num_threads(1)
+ {
+ #pragma omp parallel
+ printf("Hello World from thread %d\n", omp_get_thread_num());
+ }
+
+ printf("omp_num_threads: %d\n", omp_get_max_threads());
+
+ #pragma omp parallel
+ {
+ #pragma omp master
+ #pragma omp task default(none)
+ {
+ printf("%d is executing this task\n", omp_get_thread_num());
+ }
+ }
+
+ printf("pass\n");
+ return 0;
+}
OpenPOWER on IntegriCloud