public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Kwok Cheung Yeung <kcy@codesourcery.com>
To: GCC Patches <gcc-patches@gcc.gnu.org>,
	Jakub Jelinek <jakub@redhat.com>,
	Tobias Burnus <tobias@codesourcery.com>
Subject: [PATCH] openmp: Add support for omp_get_supported_active_levels
Date: Tue, 13 Oct 2020 19:05:10 +0100	[thread overview]
Message-ID: <95c1a0d9-2cc5-4f82-dc44-13efa38df115@codesourcery.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 857 bytes --]

Hello

This adds support for the omp_get_supported_active_levels OpenMP runtime 
routine, first introduced in the 5.0 standard. This routine returns the maximum 
level of nested active parallel regions supported on a particular implementation 
of OpenMP, and the current maximum number cannot be set higher than this.

The maximum number in libgomp was initialized to INT_MAX (effectively uncapped), 
so I set the corresponding ICV for omp_get_supported_active_levels to INT_MAX 
too. Attempts to set the maximum to higher than this using 
omp_set_max_active_levels or by setting OMP_MAX_ACTIVE_LEVELS will result in the 
max active levels silently being set to the maximum supported (although since 
omp_set_max_active_levels takes an int and the maximum supported is INT_MAX, 
this is effectively impossible at the moment).

Okay for trunk?

Thanks

Kwok

[-- Attachment #2: omp_get_supported_active_levels.patch --]
[-- Type: text/plain, Size: 10543 bytes --]

commit aa519103d7eeaeed825fd358e9532bf51f4be0a9
Author: Kwok Cheung Yeung <kcy@codesourcery.com>
Date:   Wed Oct 7 09:34:32 2020 -0700

    openmp: Add support for the omp_get_supported_active_levels runtime library routine
    
    This patch implements the omp_get_supported_active_levels runtime routine
    from the OpenMP 5.0 specification, which returns the maximum number of
    active nested parallel regions supported by this implementation.  The
    current maximum (set using the omp_set_max_active_levels routine or the
    OMP_MAX_ACTIVE_LEVELS environment variable) cannot exceed this number.
    
    2020-10-13  Kwok Cheung Yeung  <kcy@codesourcery.com>
    
    	libgomp/
    	* env.c (gomp_supported_active_levels): New global variable.
    	(gomp_max_active_levels_var): Initialize to
    	gomp_supported_active_levels.
    	(initialize_env): Limit gomp_max_active_levels_var to be at most
    	equal to gomp_supported_active_levels.
    	* fortran.c (omp_get_supported_active_levels): Add ialias_redirect.
    	(omp_get_supported_active_levels_): New.
    	* icv.c (omp_set_max_active_levels): Limit gomp_max_active_levels_var
    	to at most equal to gomp_supported_active_levels.
    	(omp_get_supported_active_levels): New.
    	* libgomp.h (gomp_supported_active_levels): New.
    	* libgomp.map (OMP_5.0): Add omp_get_supported_active_levels and
    	omp_get_supported_active_levels_.
    	* libgomp.texi (omp_get_supported_active_levels): New.
    	(omp_set_max_active_levels): Update.  Add reference to
    	omp_get_supported_active_levels.
    	* omp.h.in (omp_get_supported_active_levels): New.
    	* omp_lib.f90.in (omp_get_supported_active_levels): New.
    	* omp_lib.h.in (omp_get_supported_active_levels): New.
    	* testsuite/libgomp.c/lib-2.c (main): Check omp_get_max_active_levels
    	against omp_get_supported_active_levels.
    	* testsuite/libgomp.fortran/lib4.f90 (lib4): Likewise.

diff --git a/libgomp/env.c b/libgomp/env.c
index c0c4730..539d7a9 100644
--- a/libgomp/env.c
+++ b/libgomp/env.c
@@ -73,7 +73,8 @@ struct gomp_task_icv gomp_global_icv = {
   .target_data = NULL
 };
 
-unsigned long gomp_max_active_levels_var = INT_MAX;
+const unsigned long gomp_supported_active_levels = INT_MAX;
+unsigned long gomp_max_active_levels_var = gomp_supported_active_levels;
 bool gomp_cancel_var = false;
 int gomp_max_task_priority_var = 0;
 #ifndef HAVE_SYNC_BUILTINS
@@ -1369,6 +1370,8 @@ initialize_env (void)
   parse_int ("OMP_MAX_TASK_PRIORITY", &gomp_max_task_priority_var, true);
   parse_unsigned_long ("OMP_MAX_ACTIVE_LEVELS", &gomp_max_active_levels_var,
 		       true);
+  if (gomp_max_active_levels_var > gomp_supported_active_levels)
+    gomp_max_active_levels_var = gomp_supported_active_levels;
   gomp_def_allocator = parse_allocator ();
   if (parse_unsigned_long ("OMP_THREAD_LIMIT", &thread_limit_var, false))
     {
diff --git a/libgomp/fortran.c b/libgomp/fortran.c
index 9d838b3..029dec1 100644
--- a/libgomp/fortran.c
+++ b/libgomp/fortran.c
@@ -63,6 +63,7 @@ ialias_redirect (omp_get_schedule)
 ialias_redirect (omp_get_thread_limit)
 ialias_redirect (omp_set_max_active_levels)
 ialias_redirect (omp_get_max_active_levels)
+ialias_redirect (omp_get_supported_active_levels)
 ialias_redirect (omp_get_level)
 ialias_redirect (omp_get_ancestor_thread_num)
 ialias_redirect (omp_get_team_size)
@@ -418,6 +419,12 @@ omp_get_max_active_levels_ (void)
 }
 
 int32_t
+omp_get_supported_active_levels_ (void)
+{
+  return omp_get_supported_active_levels ();
+}
+
+int32_t
 omp_get_level_ (void)
 {
   return omp_get_level ();
diff --git a/libgomp/icv.c b/libgomp/icv.c
index 3c16abb..1bb46ab 100644
--- a/libgomp/icv.c
+++ b/libgomp/icv.c
@@ -116,7 +116,12 @@ void
 omp_set_max_active_levels (int max_levels)
 {
   if (max_levels >= 0)
-    gomp_max_active_levels_var = max_levels;
+    {
+      if (max_levels <= gomp_supported_active_levels)
+	gomp_max_active_levels_var = max_levels;
+      else
+	gomp_max_active_levels_var = gomp_supported_active_levels;
+    }
 }
 
 int
@@ -126,6 +131,12 @@ omp_get_max_active_levels (void)
 }
 
 int
+omp_get_supported_active_levels (void)
+{
+  return gomp_supported_active_levels;
+}
+
+int
 omp_get_cancellation (void)
 {
   return gomp_cancel_var;
@@ -227,6 +238,7 @@ ialias (omp_get_max_threads)
 ialias (omp_get_thread_limit)
 ialias (omp_set_max_active_levels)
 ialias (omp_get_max_active_levels)
+ialias (omp_get_supported_active_levels)
 ialias (omp_get_cancellation)
 ialias (omp_get_proc_bind)
 ialias (omp_get_initial_device)
diff --git a/libgomp/libgomp.h b/libgomp/libgomp.h
index 87f939a..aa945bb 100644
--- a/libgomp/libgomp.h
+++ b/libgomp/libgomp.h
@@ -438,6 +438,7 @@ extern struct gomp_task_icv gomp_global_icv;
 #ifndef HAVE_SYNC_BUILTINS
 extern gomp_mutex_t gomp_managed_threads_lock;
 #endif
+extern const unsigned long gomp_supported_active_levels;
 extern unsigned long gomp_max_active_levels_var;
 extern bool gomp_cancel_var;
 extern int gomp_max_task_priority_var;
diff --git a/libgomp/libgomp.map b/libgomp/libgomp.map
index c808e810..a4ee968 100644
--- a/libgomp/libgomp.map
+++ b/libgomp/libgomp.map
@@ -172,6 +172,8 @@ OMP_5.0 {
 	omp_display_affinity_;
 	omp_get_affinity_format;
 	omp_get_affinity_format_;
+	omp_get_supported_active_levels;
+	omp_get_supported_active_levels_;
 	omp_set_affinity_format;
 	omp_set_affinity_format_;
 	omp_pause_resource;
diff --git a/libgomp/libgomp.texi b/libgomp/libgomp.texi
index 5331230..1b7710c 100644
--- a/libgomp/libgomp.texi
+++ b/libgomp/libgomp.texi
@@ -177,6 +177,7 @@ linkage, and do not throw exceptions.
 * omp_get_num_threads::         Size of the active team
 * omp_get_proc_bind::           Whether theads may be moved between CPUs
 * omp_get_schedule::            Obtain the runtime scheduling method
+* omp_get_supported_active_levels:: Maxiumum number of active levels supported
 * omp_get_team_num::            Get team number
 * omp_get_team_size::           Number of threads in a team
 * omp_get_thread_limit::        Maximum number of threads
@@ -638,6 +639,31 @@ set to the value @code{omp_sched_static}, @code{omp_sched_dynamic},
 @end table
 
 
+@node omp_get_supported_active_levels
+@section @code{omp_get_supported_active_levels} -- Maximum number of active regions supported
+@table @asis
+@item @emph{Description}:
+This function returns the maximum number of nested, active parallel regions
+supported by this implementation.
+
+@item @emph{C/C++}
+@multitable @columnfractions .20 .80
+@item @emph{Prototype}: @tab @code{int omp_get_supported_active_levels(void);}
+@end multitable
+
+@item @emph{Fortran}:
+@multitable @columnfractions .20 .80
+@item @emph{Interface}: @tab @code{integer function omp_get_supported_active_levels()}
+@end multitable
+
+@item @emph{See also}:
+@ref{omp_get_max_active_levels}, @ref{omp_set_max_active_levels}
+
+@item @emph{Reference}:
+@uref{https://www.openmp.org, OpenMP specification v5.0}, Section 3.2.15.
+@end table
+
+
 
 @node omp_get_team_num
 @section @code{omp_get_team_num} -- Get team number
@@ -877,7 +903,8 @@ adjustment of team sizes and @code{false} disables it.
 @table @asis
 @item @emph{Description}:
 This function limits the maximum allowed number of nested, active
-parallel regions.
+parallel regions.  @var{max_levels} must be less or equal to
+the value returned by @code{omp_get_supported_active_levels}.
 
 @item @emph{C/C++}
 @multitable @columnfractions .20 .80
@@ -891,7 +918,8 @@ parallel regions.
 @end multitable
 
 @item @emph{See also}:
-@ref{omp_get_max_active_levels}, @ref{omp_get_active_level}
+@ref{omp_get_max_active_levels}, @ref{omp_get_active_level},
+@ref{omp_get_supported_active_levels}
 
 @item @emph{Reference}:
 @uref{https://www.openmp.org, OpenMP specification v4.5}, Section 3.2.15.
diff --git a/libgomp/omp.h.in b/libgomp/omp.h.in
index 57af737..a9e6c44 100644
--- a/libgomp/omp.h.in
+++ b/libgomp/omp.h.in
@@ -211,6 +211,7 @@ extern void omp_get_schedule (omp_sched_t *, int *) __GOMP_NOTHROW;
 extern int omp_get_thread_limit (void) __GOMP_NOTHROW;
 extern void omp_set_max_active_levels (int) __GOMP_NOTHROW;
 extern int omp_get_max_active_levels (void) __GOMP_NOTHROW;
+extern int omp_get_supported_active_levels (void) __GOMP_NOTHROW;
 extern int omp_get_level (void) __GOMP_NOTHROW;
 extern int omp_get_ancestor_thread_num (int) __GOMP_NOTHROW;
 extern int omp_get_team_size (int) __GOMP_NOTHROW;
diff --git a/libgomp/omp_lib.f90.in b/libgomp/omp_lib.f90.in
index 3ec31ac..2fae57b 100644
--- a/libgomp/omp_lib.f90.in
+++ b/libgomp/omp_lib.f90.in
@@ -394,6 +394,12 @@
         end interface
 
         interface
+          function omp_get_supported_active_levels ()
+            integer (4) :: omp_get_supported_active_levels
+          end function omp_get_supported_active_levels
+        end interface
+
+        interface
           function omp_get_level ()
             integer (4) :: omp_get_level
           end function omp_get_level
diff --git a/libgomp/omp_lib.h.in b/libgomp/omp_lib.h.in
index 26dbe03..eb1dcc4 100644
--- a/libgomp/omp_lib.h.in
+++ b/libgomp/omp_lib.h.in
@@ -205,9 +205,11 @@
       external omp_get_max_active_levels, omp_get_level
       external omp_get_ancestor_thread_num, omp_get_team_size
       external omp_get_active_level
+      external omp_get_supported_active_levels
       integer(4) omp_get_thread_limit, omp_get_max_active_levels
       integer(4) omp_get_level, omp_get_ancestor_thread_num
       integer(4) omp_get_team_size, omp_get_active_level
+      integer(4) omp_get_supported_active_levels
 
       external omp_in_final
       logical(4) omp_in_final
diff --git a/libgomp/testsuite/libgomp.c/lib-2.c b/libgomp/testsuite/libgomp.c/lib-2.c
index 3a3b3f6..ea7a719 100644
--- a/libgomp/testsuite/libgomp.c/lib-2.c
+++ b/libgomp/testsuite/libgomp.c/lib-2.c
@@ -20,6 +20,8 @@ main (void)
   omp_set_max_active_levels (6);
   if (omp_get_max_active_levels () != 6)
     abort ();
+  if (omp_get_max_active_levels () > omp_get_supported_active_levels ())
+    abort ();
 
   return 0;
 }
diff --git a/libgomp/testsuite/libgomp.fortran/lib4.f90 b/libgomp/testsuite/libgomp.fortran/lib4.f90
index d551cde..5259b3b 100644
--- a/libgomp/testsuite/libgomp.fortran/lib4.f90
+++ b/libgomp/testsuite/libgomp.fortran/lib4.f90
@@ -13,4 +13,6 @@ program lib4
   if (omp_get_thread_limit ().lt.0) stop 3
   call omp_set_max_active_levels (6)
   if (omp_get_max_active_levels ().ne.6) stop 4
+  if (omp_get_max_active_levels () &
+      .gt.omp_get_supported_active_levels ()) stop 5
 end program lib4

             reply	other threads:[~2020-10-13 18:05 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-13 18:05 Kwok Cheung Yeung [this message]
2020-10-13 18:36 ` Jakub Jelinek
2020-10-13 20:26   ` Kwok Cheung Yeung
2020-10-14  8:20 ` Jakub Jelinek
2020-10-15  9:38   ` Kwok Cheung Yeung
2020-10-15  9:40     ` Jakub Jelinek
2020-10-20 13:51 David Edelsohn
2020-10-20 13:55 ` Tobias Burnus

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=95c1a0d9-2cc5-4f82-dc44-13efa38df115@codesourcery.com \
    --to=kcy@codesourcery.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=jakub@redhat.com \
    --cc=tobias@codesourcery.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).