[committed] libgomp: Add omp_in_explicit_task support
Commit Message
Hi!
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.
Regtested on x86_64-linux and i686-linux, committed to trunk.
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.
Jakub
@@ -244,6 +244,7 @@ extern int omp_get_team_size (int) __GOM
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;
@@ -220,6 +220,8 @@
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
@@ -445,6 +445,12 @@
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
end function omp_get_cancellation
@@ -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;
@@ -2678,6 +2678,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)
{
@@ -76,6 +76,7 @@ ialias_redirect (omp_get_ancestor_thread
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)
{
@@ -360,8 +360,8 @@ to address of matching mapped list item
@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}
@@ -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;
+}
@@ -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;
+}
@@ -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;
+}