[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