[Openmp-commits] [openmp] 996baa5 - [OpenMP] Fixed a segmentation fault when using taskloop and target nowait
Shilei Tian via Openmp-commits
openmp-commits at lists.llvm.org
Mon Jul 19 18:09:10 PDT 2021
Author: Shilei Tian
Date: 2021-07-19T21:09:05-04:00
New Revision: 996baa58a440d3ef80c8e227d4fa3234da8215ed
URL: https://github.com/llvm/llvm-project/commit/996baa58a440d3ef80c8e227d4fa3234da8215ed
DIFF: https://github.com/llvm/llvm-project/commit/996baa58a440d3ef80c8e227d4fa3234da8215ed.diff
LOG: [OpenMP] Fixed a segmentation fault when using taskloop and target nowait
The synchronization of task loop misses hidden helper tasks, causing segmentation
fault reported in https://bugs.llvm.org/show_bug.cgi?id=50002.
Reviewed By: ye-luo
Differential Revision: https://reviews.llvm.org/D106220
Added:
openmp/libomptarget/test/offloading/taskloop_offload_nowait.cpp
Modified:
openmp/runtime/src/kmp_tasking.cpp
Removed:
################################################################################
diff --git a/openmp/libomptarget/test/offloading/taskloop_offload_nowait.cpp b/openmp/libomptarget/test/offloading/taskloop_offload_nowait.cpp
new file mode 100644
index 000000000000..2e1b47bfa0a2
--- /dev/null
+++ b/openmp/libomptarget/test/offloading/taskloop_offload_nowait.cpp
@@ -0,0 +1,40 @@
+// RUN: %libomptarget-compilexx-run-and-check-generic
+
+#include <cmath>
+#include <cstdlib>
+#include <iostream>
+
+bool almost_equal(float x, float gold, float tol) {
+ if (std::signbit(x) != std::signbit(gold))
+ x = std::abs(gold) - std::abs(x);
+
+ return std::abs(gold) * (1 - tol) <= std::abs(x) &&
+ std::abs(x) <= std::abs(gold) * (1 + tol);
+}
+
+int main(int argc, char *argv[]) {
+ constexpr const int N0{2};
+ constexpr const int N1{182};
+ constexpr const float expected_value{N0 * N1};
+ float counter_N0{};
+
+#pragma omp target data map(tofrom : counter_N0)
+ {
+#pragma omp taskloop shared(counter_N0)
+ for (int i0 = 0; i0 < N0; i0++) {
+#pragma omp target teams distribute parallel for map(tofrom : counter_N0) nowait
+ for (int i1 = 0; i1 < N1; i1++) {
+#pragma omp atomic update
+ counter_N0 = counter_N0 + 1.;
+ }
+ }
+ }
+
+ if (!almost_equal(counter_N0, expected_value, 0.1)) {
+ std::cerr << "Expected: " << expected_value << " Got: " << counter_N0
+ << '\n';
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/openmp/runtime/src/kmp_tasking.cpp b/openmp/runtime/src/kmp_tasking.cpp
index ff9b1a8efb4a..030bf1d5aa07 100644
--- a/openmp/runtime/src/kmp_tasking.cpp
+++ b/openmp/runtime/src/kmp_tasking.cpp
@@ -2563,7 +2563,8 @@ void __kmpc_end_taskgroup(ident_t *loc, int gtid) {
if (!taskdata->td_flags.team_serial ||
(thread->th.th_task_team != NULL &&
- thread->th.th_task_team->tt.tt_found_proxy_tasks)) {
+ (thread->th.th_task_team->tt.tt_found_proxy_tasks ||
+ thread->th.th_task_team->tt.tt_hidden_helper_task_encountered))) {
kmp_flag_32<false, false> flag(
RCAST(std::atomic<kmp_uint32> *, &(taskgroup->count)), 0U);
while (KMP_ATOMIC_LD_ACQ(&taskgroup->count) != 0) {
More information about the Openmp-commits
mailing list