Message ID | 95c1a0d9-2cc5-4f82-dc44-13efa38df115@codesourcery.com |
---|---|
State | New |
Headers | show |
Series | openmp: Add support for omp_get_supported_active_levels | expand |
On Tue, Oct 13, 2020 at 07:05:10PM +0100, Kwok Cheung Yeung wrote: > --- 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; This is not valid C, and while gcc currently in GNU mode accepts it (I think with optimization only?), we shouldn't use that. It is valid C++ though. I'd suggest to #define gomp_supported_active_levels INT_MAX in libgomp.h and leave out the const variable. Another possibility is an enumerator, but we don't include limits.h in libgomp.h. > --- 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_5.0 symbol version has been shipped already in GCC 9. So we should never add any further symbols to it. Thus it needs to be added to OMP_5.0.1 symbol version instead (which is new in GCC 11). Otherwise LGTM. Jakub
Now committed to trunk with the suggested fixes. Thanks for the quick review. Kwok On 13/10/2020 7:36 pm, Jakub Jelinek wrote: > I'd suggest to > #define gomp_supported_active_levels INT_MAX > in libgomp.h and leave out the const variable. Another possibility is an > enumerator, but we don't include limits.h in libgomp.h. > > OMP_5.0 symbol version has been shipped already in GCC 9. So we should > never add any further symbols to it. > Thus it needs to be added to OMP_5.0.1 symbol version instead (which is new > in GCC 11). > > Otherwise LGTM.
On Tue, Oct 13, 2020 at 07:05:10PM +0100, Kwok Cheung Yeung wrote: > +* omp_get_supported_active_levels:: Maxiumum number of active levels supported Sorry for not catching it during review, but there is a typo above. Fixed with patch below, committed to trunk. > +@node omp_get_supported_active_levels > +@section @code{omp_get_supported_active_levels} -- Maximum number of active regions supported I also wonder about the different wording between the above two places, don't you want the same wording as earlier here? > +@table @asis > +@item @emph{Description}: > +This function returns the maximum number of nested, active parallel regions > +supported by this implementation. 2020-10-14 Jakub Jelinek <jakub@redhat.com> * libgomp.texi (omp_get_supported_active_levels): Fix a typo. --- libgomp/libgomp.texi.jj 2020-10-13 22:29:22.215958176 +0200 +++ libgomp/libgomp.texi 2020-10-13 22:29:52.816516414 +0200 @@ -177,7 +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_supported_active_levels:: Maximum 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 Jakub
On 14/10/2020 9:20 am, Jakub Jelinek wrote: > On Tue, Oct 13, 2020 at 07:05:10PM +0100, Kwok Cheung Yeung wrote: >> +* omp_get_supported_active_levels:: Maxiumum number of active levels supported > > Sorry for not catching it during review, but there is a typo above. Fixed > with patch below, committed to trunk. > Thanks. >> +@node omp_get_supported_active_levels >> +@section @code{omp_get_supported_active_levels} -- Maximum number of active regions supported > > I also wonder about the different wording between the above two places, > don't you want the same wording as earlier here? > Yes, they should be the same... I think I was playing around with wording (since the description for omp_get_max_active_levels is 'Maximum number of active regions' - different by one extra word!), and forgot to make them consistent. Maybe we should change the description of omp_get_max_active_levels to 'Current maximum number of active regions', to make it more obvious that it can be changed? 'omp_get_supported_active_levels' can then be 'Maximum number of active regions supported'. Okay to apply this patch? Kwok commit 3f6f8808f74598e274bfb8245c08a5428ee1b3fd Author: Kwok Cheung Yeung <kcy@codesourcery.com> Date: Thu Oct 15 02:32:09 2020 -0700 Amend documentation for omp_get_max_active_levels and omp_get_supported_active_levels 2020-10-15 Kwok Cheung Yeung <kcy@codesourcery.com> libgomp/ * libgomp.texi (omp_get_max_active_levels): Modify description. (omp_get_supported_active_levels): Make descriptions consistent. diff --git a/libgomp/libgomp.texi b/libgomp/libgomp.texi index 4a5e56f..7c6d5fd 100644 --- a/libgomp/libgomp.texi +++ b/libgomp/libgomp.texi @@ -167,7 +167,7 @@ linkage, and do not throw exceptions. * omp_get_default_device:: Get the default device for target regions * omp_get_dynamic:: Dynamic teams setting * omp_get_level:: Number of parallel regions -* omp_get_max_active_levels:: Maximum number of active regions +* omp_get_max_active_levels:: Current maximum number of active regions * omp_get_max_task_priority:: Maximum task priority value that can be set * omp_get_max_threads:: Maximum number of threads of parallel region * omp_get_nested:: Nested parallel regions @@ -177,7 +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:: Maximum number of active levels supported +* omp_get_supported_active_levels:: Maximum number of active regions 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 @@ -380,7 +380,7 @@ which enclose the calling call. @node omp_get_max_active_levels -@section @code{omp_get_max_active_levels} -- Maximum number of active regions +@section @code{omp_get_max_active_levels} -- Current maximum number of active regions @table @asis @item @emph{Description}: This function obtains the maximum allowed number of nested, active parallel regions.
On Thu, Oct 15, 2020 at 10:38:56AM +0100, Kwok Cheung Yeung wrote: > Okay to apply this patch? Ok, thanks. > commit 3f6f8808f74598e274bfb8245c08a5428ee1b3fd > Author: Kwok Cheung Yeung <kcy@codesourcery.com> > Date: Thu Oct 15 02:32:09 2020 -0700 > > Amend documentation for omp_get_max_active_levels and omp_get_supported_active_levels > > 2020-10-15 Kwok Cheung Yeung <kcy@codesourcery.com> > > libgomp/ > * libgomp.texi (omp_get_max_active_levels): Modify description. > (omp_get_supported_active_levels): Make descriptions consistent. > > diff --git a/libgomp/libgomp.texi b/libgomp/libgomp.texi > index 4a5e56f..7c6d5fd 100644 > --- a/libgomp/libgomp.texi > +++ b/libgomp/libgomp.texi > @@ -167,7 +167,7 @@ linkage, and do not throw exceptions. > * omp_get_default_device:: Get the default device for target regions > * omp_get_dynamic:: Dynamic teams setting > * omp_get_level:: Number of parallel regions > -* omp_get_max_active_levels:: Maximum number of active regions > +* omp_get_max_active_levels:: Current maximum number of active regions > * omp_get_max_task_priority:: Maximum task priority value that can be set > * omp_get_max_threads:: Maximum number of threads of parallel region > * omp_get_nested:: Nested parallel regions > @@ -177,7 +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:: Maximum number of active levels supported > +* omp_get_supported_active_levels:: Maximum number of active regions 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 > @@ -380,7 +380,7 @@ which enclose the calling call. > > > @node omp_get_max_active_levels > -@section @code{omp_get_max_active_levels} -- Maximum number of active regions > +@section @code{omp_get_max_active_levels} -- Current maximum number of active regions > @table @asis > @item @emph{Description}: > This function obtains the maximum allowed number of nested, active parallel regions. Jakub
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