diff options
author | Jonathan Peyton <jonathan.l.peyton@intel.com> | 2018-07-30 21:47:56 +0000 |
---|---|---|
committer | Jonathan Peyton <jonathan.l.peyton@intel.com> | 2018-07-30 21:47:56 +0000 |
commit | 9c9eebf1307f6b42b252a49717a6a6745f4dfdc3 (patch) | |
tree | aeafaaea92fecbd63211a26f5bdfabec5ec86a5b | |
parent | 72133c3013323fad53c82b7de68388bbd0685fb8 (diff) |
[OpenMP] Fix tasking + parallel bug
From the bug report, the runtime needs to initialize the nproc variables
(inside middle init) for each root when the task is encountered, otherwise,
a segfault can occur.
Bugzilla: https://bugs.llvm.org/show_bug.cgi?id=36720
Differential Revision: https://reviews.llvm.org/D49996
git-svn-id: https://llvm.org/svn/llvm-project/openmp/trunk@338313 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | runtime/src/kmp_tasking.cpp | 3 | ||||
-rw-r--r-- | runtime/test/tasking/bug_36720.c | 34 |
2 files changed, 37 insertions, 0 deletions
diff --git a/runtime/src/kmp_tasking.cpp b/runtime/src/kmp_tasking.cpp index 5daca28..8ed6afe 100644 --- a/runtime/src/kmp_tasking.cpp +++ b/runtime/src/kmp_tasking.cpp @@ -1025,6 +1025,9 @@ kmp_task_t *__kmp_task_alloc(ident_t *loc_ref, kmp_int32 gtid, kmp_taskdata_t *parent_task = thread->th.th_current_task; size_t shareds_offset; + if (!TCR_4(__kmp_init_middle)) + __kmp_middle_initialize(); + KA_TRACE(10, ("__kmp_task_alloc(enter): T#%d loc=%p, flags=(0x%x) " "sizeof_task=%ld sizeof_shared=%ld entry=%p\n", gtid, loc_ref, *((kmp_int32 *)flags), sizeof_kmp_task_t, diff --git a/runtime/test/tasking/bug_36720.c b/runtime/test/tasking/bug_36720.c new file mode 100644 index 0000000..059d9c9 --- /dev/null +++ b/runtime/test/tasking/bug_36720.c @@ -0,0 +1,34 @@ +// RUN: %libomp-compile-and-run + +/* +Bugzilla: https://bugs.llvm.org/show_bug.cgi?id=36720 + +Assertion failure at kmp_runtime.cpp(1715): nthreads > 0. +OMP: Error #13: Assertion failure at kmp_runtime.cpp(1715). + +The assertion fails even with OMP_NUM_THREADS=1. If the second task is removed, +everything runs to completion. If the "omp parallel for" directives are removed +from inside the tasks, once again everything runs fine. +*/ + +#define N 1024 + +int main() { + #pragma omp task + { + #pragma omp parallel for + for (int i = 0; i < N; i++) + (void)0; + } + + #pragma omp task + { + #pragma omp parallel for + for (int i = 0; i < N; ++i) + (void)0; + } + + #pragma omp taskwait + + return 0; +} |