[Openmp-commits] [PATCH] D106220: [OpenMP] Fixed a segmentation fault when using taskloop and target nowait

Shilei Tian via Phabricator via Openmp-commits openmp-commits at lists.llvm.org
Sat Jul 17 09:29:29 PDT 2021


tianshilei1992 created this revision.
tianshilei1992 added reviewers: AndreyChurbanov, hbae, jdoerfert, protze.joachim.
Herald added subscribers: jfb, guansong, yaxunl.
tianshilei1992 requested review of this revision.
Herald added subscribers: openmp-commits, sstefan1.
Herald added a project: OpenMP.

The synchronization of task loop misses hidden helper tasks, causing segmentation
fault reported in https://bugs.llvm.org/show_bug.cgi?id=50002.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D106220

Files:
  openmp/libomptarget/test/offloading/taskloop_offload_nowait.cpp
  openmp/runtime/src/kmp_tasking.cpp


Index: openmp/runtime/src/kmp_tasking.cpp
===================================================================
--- openmp/runtime/src/kmp_tasking.cpp
+++ openmp/runtime/src/kmp_tasking.cpp
@@ -2563,7 +2563,8 @@
 
     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) {
Index: openmp/libomptarget/test/offloading/taskloop_offload_nowait.cpp
===================================================================
--- /dev/null
+++ 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;
+}


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D106220.359566.patch
Type: text/x-patch
Size: 1998 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/openmp-commits/attachments/20210717/b5e2f45e/attachment.bin>


More information about the Openmp-commits mailing list