[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