[Openmp-commits] [openmp] d84dedc - [OpenMP] libomp: fix bug in implementation of distribute construct.

via Openmp-commits openmp-commits at lists.llvm.org
Fri Feb 11 06:34:36 PST 2022


Author: AndreyChurbanov
Date: 2022-02-11T17:34:26+03:00
New Revision: d84dedc7d3346321f3801237fc0ccd4ce772492d

URL: https://github.com/llvm/llvm-project/commit/d84dedc7d3346321f3801237fc0ccd4ce772492d
DIFF: https://github.com/llvm/llvm-project/commit/d84dedc7d3346321f3801237fc0ccd4ce772492d.diff

LOG: [OpenMP] libomp: fix bug in implementation of distribute construct.

Fixed mistaken iterations distribution between different target regions.

Differential Revision: https://reviews.llvm.org/D118393

Added: 
    openmp/runtime/test/teams/teams-distr-on-host.c

Modified: 
    openmp/runtime/src/kmp_sched.cpp

Removed: 
    


################################################################################
diff  --git a/openmp/runtime/src/kmp_sched.cpp b/openmp/runtime/src/kmp_sched.cpp
index 09e497e02914c..46d3d26679c6e 100644
--- a/openmp/runtime/src/kmp_sched.cpp
+++ b/openmp/runtime/src/kmp_sched.cpp
@@ -194,8 +194,13 @@ static void __kmp_for_static_init(ident_t *loc, kmp_int32 global_tid,
     // we are in DISTRIBUTE construct
     schedtype += kmp_sch_static -
                  kmp_distribute_static; // AC: convert to usual schedule type
-    tid = th->th.th_team->t.t_master_tid;
-    team = th->th.th_team->t.t_parent;
+    if (th->th.th_team->t.t_serialized > 1) {
+      tid = 0;
+      team = th->th.th_team;
+    } else {
+      tid = th->th.th_team->t.t_master_tid;
+      team = th->th.th_team->t.t_parent;
+    }
   } else {
     tid = __kmp_tid_from_gtid(global_tid);
     team = th->th.th_team;

diff  --git a/openmp/runtime/test/teams/teams-distr-on-host.c b/openmp/runtime/test/teams/teams-distr-on-host.c
new file mode 100644
index 0000000000000..663d1d3a487fe
--- /dev/null
+++ b/openmp/runtime/test/teams/teams-distr-on-host.c
@@ -0,0 +1,46 @@
+// The test supposes no offload, pure host execution.
+// It checks that the bug in implementation of distribute construct is fixed.
+
+// RUN: %libomp-compile-and-run
+// UNSUPPORTED: icc
+
+#include <stdio.h>
+#include <omp.h>
+
+int main()
+{
+  const int size = 4;
+  int wrong_counts = 0;
+  omp_set_num_threads(2);
+  #pragma omp parallel reduction(+:wrong_counts)
+  {
+    int i;
+    int A[size];
+    int th = omp_get_thread_num();
+    for(i = 0; i < size; i++)
+      A[i] = 0;
+
+    #pragma omp target teams distribute map(tofrom: A[:size]) private(i)
+    for(i = 0; i < size; i++)
+    {
+      A[i] = i;
+      printf("th %d, team %d, i %d\n", th, omp_get_team_num(), i);
+    }
+    #pragma omp critical
+    {
+      printf("tid = %d\n", th);
+      for(i = 0; i < size; i++)
+      {
+        if (A[i] != i) wrong_counts++;
+        printf("  %d", A[i]);
+      }
+      printf("\n");
+    }
+  }
+  if (wrong_counts) {
+    printf("failed\n");
+  } else {
+    printf("passed\n");
+  }
+  return wrong_counts;
+}


        


More information about the Openmp-commits mailing list