[Openmp-commits] [PATCH] D75673: [runtime] Fixed hang when explicit task created inside a taskloop.

Andrey Churbanov via Phabricator via Openmp-commits openmp-commits at lists.llvm.org
Thu Mar 5 04:24:28 PST 2020


AndreyChurbanov created this revision.
AndreyChurbanov added reviewers: hbae, jlpeyton, tlwilmar.
AndreyChurbanov added a project: OpenMP.
Herald added a reviewer: jdoerfert.
Herald added a subscriber: openmp-commits.

Added missed initialization of the td_last_tied field for taskloop tasks.

Without this the test hang because of task-stealing-constraint mistakenly prevented child tasks to be executed by the parent.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D75673

Files:
  openmp/runtime/src/kmp_tasking.cpp
  openmp/runtime/test/tasking/omp_task_red_taskloop.c


Index: openmp/runtime/test/tasking/omp_task_red_taskloop.c
===================================================================
--- /dev/null
+++ openmp/runtime/test/tasking/omp_task_red_taskloop.c
@@ -0,0 +1,57 @@
+// RUN: %libomp-compile-and-run
+
+#include <stdio.h>
+#include <omp.h>
+
+int r;
+
+int work(int k, int l)
+{
+  return k + l + 1;
+}
+void bar(int i) {
+  #pragma omp taskgroup task_reduction(+:r)
+ { int th_gen = omp_get_thread_num();
+  #pragma omp task in_reduction(+:r) firstprivate(i, th_gen)
+  {
+    r += work(i, 0);
+printf("executing task (%d, 0), th %d (gen by th %d)\n", i, omp_get_thread_num(), th_gen);
+  }
+  #pragma omp task in_reduction(+:r) firstprivate(i, th_gen)
+  {
+    r += work(i, 1);
+printf("executing task (%d, 1), th %d (gen by th %d)\n", i, omp_get_thread_num(), th_gen);
+  }
+ }
+}
+int foo() {
+  int i;
+  int th_gen = omp_get_thread_num();
+  #pragma omp taskgroup task_reduction(+:r)
+  {
+    bar(0);
+  }
+printf("th %d passed bar0\n", th_gen);
+  #pragma omp taskloop reduction(+:r) firstprivate(th_gen)
+  for (i = 1; i < 4; ++i) {
+    bar(i);
+printf("th %d (gen by th %d) passed bar%d in taskloop\n", omp_get_thread_num(), th_gen, i);
+//  #pragma omp task in_reduction(+:r)
+    r += i;
+  }
+  return 0;
+}
+// res = 2*((1+2)+(2+3)+(3+4)+(4+5)+1+2+3) = 60
+#define res 60
+int main()
+{
+  r = 0;
+  #pragma omp parallel num_threads(2)
+    foo();
+  if (r == res) {
+    return 0;
+  } else {
+    printf("error r = %d (!= %d)\n", r, res);
+    return 1;
+  }
+}
Index: openmp/runtime/src/kmp_tasking.cpp
===================================================================
--- openmp/runtime/src/kmp_tasking.cpp
+++ openmp/runtime/src/kmp_tasking.cpp
@@ -3923,9 +3923,9 @@
   }
   taskdata->td_alloc_thread = thread;
   taskdata->td_parent = parent_task;
-  taskdata->td_taskgroup =
-      parent_task
-          ->td_taskgroup; // task inherits the taskgroup from the parent task
+  // task inherits the taskgroup from the parent task
+  taskdata->td_taskgroup = parent_task->td_taskgroup;
+  taskdata->td_last_tied = taskdata;
 
   // Only need to keep track of child task counts if team parallel and tasking
   // not serialized


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D75673.248433.patch
Type: text/x-patch
Size: 2196 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/openmp-commits/attachments/20200305/a2f3daac/attachment.bin>


More information about the Openmp-commits mailing list