]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libgomp: Add omp_in_explicit_task support
authorJakub Jelinek <jakub@redhat.com>
Mon, 17 Oct 2022 14:56:33 +0000 (16:56 +0200)
committerTobias Burnus <tobias@codesourcery.com>
Mon, 17 Oct 2022 14:56:33 +0000 (16:56 +0200)
This is pretty straightforward, if gomp_thread ()->task is NULL,
it can't be explicit task, otherwise if
gomp_thread ()->task->kind == GOMP_TASK_IMPLICIT, it is an implicit
task, otherwise explicit task.

2022-10-12  Jakub Jelinek  <jakub@redhat.com>

* omp.h.in (omp_in_explicit_task): Declare.
* omp_lib.h.in (omp_in_explicit_task): Likewise.
* omp_lib.f90.in (omp_in_explicit_task): New interface.
* libgomp.map (OMP_5.2): New symbol version, export
omp_in_explicit_task and omp_in_explicit_task_.
* task.c (omp_in_explicit_task): New function.
* fortran.c (omp_in_explicit_task): Add ialias_redirect.
(omp_in_explicit_task_): New function.
* libgomp.texi (OpenMP 5.2): Mark omp_in_explicit_task as implemented.
* testsuite/libgomp.c-c++-common/task-in-explicit-1.c: New test.
* testsuite/libgomp.c-c++-common/task-in-explicit-2.c: New test.
* testsuite/libgomp.c-c++-common/task-in-explicit-3.c: New test.

(cherry picked from commit 0ec4e93fb9fa5e9d2424683c5fab1310c8ae2f76)

libgomp/ChangeLog.omp
libgomp/fortran.c
libgomp/libgomp.map
libgomp/libgomp.texi
libgomp/omp.h.in
libgomp/omp_lib.f90.in
libgomp/omp_lib.h.in
libgomp/task.c
libgomp/testsuite/libgomp.c-c++-common/task-in-explicit-1.c [new file with mode: 0644]
libgomp/testsuite/libgomp.c-c++-common/task-in-explicit-2.c [new file with mode: 0644]
libgomp/testsuite/libgomp.c-c++-common/task-in-explicit-3.c [new file with mode: 0644]

index 432938871fa9e6d41cc73884e26c5b67bfeca08a..23ec0e9de62c0216e4893f3a204c7b7eee632b4d 100644 (file)
@@ -1,3 +1,21 @@
+2022-10-17  Tobias Burnus  <tobias@codesourcery.com>
+
+       Backport from mainline:
+       2022-10-12  Jakub Jelinek  <jakub@redhat.com>
+
+       * omp.h.in (omp_in_explicit_task): Declare.
+       * omp_lib.h.in (omp_in_explicit_task): Likewise.
+       * omp_lib.f90.in (omp_in_explicit_task): New interface.
+       * libgomp.map (OMP_5.2): New symbol version, export
+       omp_in_explicit_task and omp_in_explicit_task_.
+       * task.c (omp_in_explicit_task): New function.
+       * fortran.c (omp_in_explicit_task): Add ialias_redirect.
+       (omp_in_explicit_task_): New function.
+       * libgomp.texi (OpenMP 5.2): Mark omp_in_explicit_task as implemented.
+       * testsuite/libgomp.c-c++-common/task-in-explicit-1.c: New test.
+       * testsuite/libgomp.c-c++-common/task-in-explicit-2.c: New test.
+       * testsuite/libgomp.c-c++-common/task-in-explicit-3.c: New test.
+
 2022-10-17  Tobias Burnus  <tobias@codesourcery.com>
 
        Backport from mainline:
index d984ce5c6f88f34709a8795a581d2f2a82483f33..72784ec5dadfcb7b41cefde4fa3921d0fb73d701 100644 (file)
@@ -76,6 +76,7 @@ ialias_redirect (omp_get_ancestor_thread_num)
 ialias_redirect (omp_get_team_size)
 ialias_redirect (omp_get_active_level)
 ialias_redirect (omp_in_final)
+ialias_redirect (omp_in_explicit_task)
 ialias_redirect (omp_get_cancellation)
 ialias_redirect (omp_get_proc_bind)
 ialias_redirect (omp_get_num_places)
@@ -482,6 +483,12 @@ omp_in_final_ (void)
   return omp_in_final ();
 }
 
+int32_t
+omp_in_explicit_task_ (void)
+{
+  return omp_in_explicit_task ();
+}
+
 void
 omp_set_num_teams_ (const int32_t *num_teams)
 {
index 5af5c2d8929e116098d31a17995537de827debd8..52424f52513316d832dc01a2f31c0ca196ab5643 100644 (file)
@@ -234,6 +234,12 @@ OMP_5.1.1 {
        omp_target_memcpy_rect_async;
 } OMP_5.1;
 
+OMP_5.2 {
+  global:
+       omp_in_explicit_task;
+       omp_in_explicit_task_;
+} OMP_5.1.1;
+
 GOMP_1.0 {
   global:
        GOMP_atomic_end;
index 513d5e23c6aaa29fdf9791403358205a8e10b664..e9edeff0bba0a6d78b98abcbe87bc22baf083352 100644 (file)
@@ -360,8 +360,8 @@ to address of matching mapped list item per 5.1, Sect. 2.21.7.2 @tab N @tab
 
 @multitable @columnfractions .60 .10 .25
 @headitem Description @tab Status @tab Comments
-@item @code{omp_in_explicit_task} routine and @emph{implicit-task-var} ICV
-      @tab N @tab
+@item @code{omp_in_explicit_task} routine and @emph{explicit-task-var} ICV
+      @tab Y @tab
 @item @code{omp}/@code{ompx}/@code{omx} sentinels and @code{omp_}/@code{ompx_}
       namespaces @tab N/A
       @tab warning for @code{ompx/omx} sentinels@footnote{The @code{ompx}
index eea019ad88da150770b54872d29b9943b52ea0b6..a4ea5212e79485a61aa5f72612e65e1ac6feb9be 100644 (file)
@@ -249,6 +249,7 @@ extern int omp_get_team_size (int) __GOMP_NOTHROW;
 extern int omp_get_active_level (void) __GOMP_NOTHROW;
 
 extern int omp_in_final (void) __GOMP_NOTHROW;
+extern int omp_in_explicit_task (void) __GOMP_NOTHROW;
 
 extern int omp_get_cancellation (void) __GOMP_NOTHROW;
 extern omp_proc_bind_t omp_get_proc_bind (void) __GOMP_NOTHROW;
index 39a58b4bc4db899775fedaac290c0ee2bf9c4111..82b845455f3f7bbb2f822f98d22599835075d999 100644 (file)
           end function omp_in_final
         end interface
 
+        interface
+          function omp_in_explicit_task ()
+            logical (4) :: omp_in_explicit_task
+          end function omp_in_explicit_task
+        end interface
+
         interface
           function omp_get_cancellation ()
             logical (4) :: omp_get_cancellation
index 362683638593ac6cf13687c98cb9d3f41eb2752a..ecfb9348305a761d16395eb3a8a96c8abd5132c8 100644 (file)
 
       external omp_in_final
       logical(4) omp_in_final
+      external omp_in_explicit_task
+      logical(4) omp_in_explicit_task
 
       external omp_get_cancellation
       logical(4) omp_get_cancellation
index 7766535d1aa233e0125f9712dfc6cdc0b6513d9b..a7e67e8ea813a2bdc8061e36e3da9a980b9facea 100644 (file)
@@ -2687,6 +2687,16 @@ omp_in_final (void)
 
 ialias (omp_in_final)
 
+int
+omp_in_explicit_task (void)
+{
+  struct gomp_thread *thr = gomp_thread ();
+  struct gomp_task *task = thr->task;
+  return task && task->kind != GOMP_TASK_IMPLICIT;
+}
+
+ialias (omp_in_explicit_task)
+
 void
 omp_fulfill_event (omp_event_handle_t event)
 {
diff --git a/libgomp/testsuite/libgomp.c-c++-common/task-in-explicit-1.c b/libgomp/testsuite/libgomp.c-c++-common/task-in-explicit-1.c
new file mode 100644 (file)
index 0000000..a228d93
--- /dev/null
@@ -0,0 +1,106 @@
+/* { dg-do run } */
+
+#include <omp.h>
+#include <stdlib.h>
+
+int
+main ()
+{
+  if (omp_in_explicit_task ())
+    abort ();
+  #pragma omp task
+  if (!omp_in_explicit_task ())
+    abort ();
+  #pragma omp task final (1)
+  {
+    if (!omp_in_explicit_task ())
+      abort ();
+    #pragma omp task 
+    if (!omp_in_explicit_task ())
+      abort ();
+  }
+  #pragma omp parallel
+  {
+    if (omp_in_explicit_task ())
+      abort ();
+    #pragma omp task if (0)
+      {
+       if (!omp_in_explicit_task ())
+         abort ();
+       #pragma omp task if (0)
+         if (!omp_in_explicit_task ())
+           abort ();
+      }
+    #pragma omp task final (1)
+      if (!omp_in_explicit_task ())
+       abort ();
+    #pragma omp barrier
+    if (omp_in_explicit_task ())
+      abort ();
+    #pragma omp taskloop num_tasks (24)
+    for (int i = 0; i < 32; ++i)
+      if (!omp_in_explicit_task ())
+       abort ();
+    #pragma omp masked
+    #pragma omp task
+    if (!omp_in_explicit_task ())
+      abort ();
+    #pragma omp barrier
+    if (omp_in_explicit_task ())
+      abort ();
+  }
+  #pragma omp target
+  {
+    if (omp_in_explicit_task ())
+      abort ();
+    #pragma omp task if (0)
+    if (!omp_in_explicit_task ())
+      abort ();
+    #pragma omp task
+    if (!omp_in_explicit_task ())
+      abort ();
+  }
+  #pragma omp target teams
+  {
+    #pragma omp distribute
+    for (int i = 0; i < 4; ++i)
+      if (omp_in_explicit_task ())
+       abort ();
+      else
+       {
+         #pragma omp parallel
+         {
+           if (omp_in_explicit_task ())
+             abort ();
+           #pragma omp task
+           if (!omp_in_explicit_task ())
+             abort ();
+           #pragma omp barrier
+           if (omp_in_explicit_task ())
+             abort ();
+         }
+       }
+  }
+  #pragma omp teams
+  {
+    #pragma omp distribute
+    for (int i = 0; i < 4; ++i)
+      if (omp_in_explicit_task ())
+       abort ();
+      else
+       {
+         #pragma omp parallel
+         {
+           if (omp_in_explicit_task ())
+             abort ();
+           #pragma omp task
+           if (!omp_in_explicit_task ())
+             abort ();
+           #pragma omp barrier
+           if (omp_in_explicit_task ())
+             abort ();
+         }
+       }
+  }
+  return 0;
+}
diff --git a/libgomp/testsuite/libgomp.c-c++-common/task-in-explicit-2.c b/libgomp/testsuite/libgomp.c-c++-common/task-in-explicit-2.c
new file mode 100644 (file)
index 0000000..44df596
--- /dev/null
@@ -0,0 +1,26 @@
+/* { dg-do run } */
+
+#include <omp.h>
+#include <stdlib.h>
+
+int
+main ()
+{
+  #pragma omp task
+  {
+    if (!omp_in_explicit_task ())
+      abort ();
+    #pragma omp task
+    {
+      if (!omp_in_explicit_task ())
+       abort ();
+      #pragma omp target nowait
+      if (omp_in_explicit_task ())
+       abort ();
+      if (!omp_in_explicit_task ())
+       abort ();
+      #pragma omp taskwait
+    }
+  }
+  return 0;
+}
diff --git a/libgomp/testsuite/libgomp.c-c++-common/task-in-explicit-3.c b/libgomp/testsuite/libgomp.c-c++-common/task-in-explicit-3.c
new file mode 100644 (file)
index 0000000..40eb94d
--- /dev/null
@@ -0,0 +1,36 @@
+/* { dg-do run } */
+
+#include <omp.h>
+#include <stdlib.h>
+
+int a;
+
+int
+main ()
+{
+  #pragma omp task
+  {
+    if (!omp_in_explicit_task ())
+      abort ();
+    #pragma omp task
+    {
+      if (!omp_in_explicit_task ())
+       abort ();
+      #pragma omp taskgroup task_reduction (+: a)
+      {
+       if (!omp_in_explicit_task ())
+         abort ();
+       #pragma omp task in_reduction (+: a)
+       {
+         ++a;
+         if (!omp_in_explicit_task ())
+           abort ();
+       }
+      }
+      if (!omp_in_explicit_task ())
+       abort ();
+      #pragma omp taskwait
+    }
+  }
+  return 0;
+}