diff options
author | Tobias Burnus <tobias@codesourcery.com> | 2021-08-12 15:48:28 +0200 |
---|---|---|
committer | Tobias Burnus <tobias@codesourcery.com> | 2021-08-12 15:49:49 +0200 |
commit | 432de08498142d2266c0fb05f2c555a7f1e10ddd (patch) | |
tree | eb534cfc1379a9d59255a6c31f38519aaba927b4 /libgomp | |
parent | 2d7967a10c2f3b4652f77a1a2119ba03b3472266 (diff) | |
download | gcc-432de08498142d2266c0fb05f2c555a7f1e10ddd.zip gcc-432de08498142d2266c0fb05f2c555a7f1e10ddd.tar.gz gcc-432de08498142d2266c0fb05f2c555a7f1e10ddd.tar.bz2 |
OpenMP 5.1: Add proc-bind 'primary' support
In OpenMP 5.1 "master thread" was changed to "primary thread" and
the proc_bind clause and the OMP_PROC_BIND environment variable
now take 'primary' as argument as alias for 'master', while the
latter is deprecated.
This commit accepts 'primary' and adds the named constant
omp_proc_bind_primary and changes 'master thread' in the
documentation; however, given that not even OpenMP 5.0 is
fully supported, omp_display_env and the dumps currently
still output 'master' and there is no deprecation warning
when using the 'master' in the proc_bind clause.
gcc/c/ChangeLog:
* c-parser.c (c_parser_omp_clause_proc_bind): Accept
'primary' as alias for 'master'.
gcc/cp/ChangeLog:
* parser.c (cp_parser_omp_clause_proc_bind): Accept
'primary' as alias for 'master'.
gcc/fortran/ChangeLog:
* gfortran.h (gfc_omp_proc_bind_kind): Add OMP_PROC_BIND_PRIMARY.
* dump-parse-tree.c (show_omp_clauses): Add TODO comment to
change 'master' to 'primary' in proc_bind for OpenMP 5.1.
* intrinsic.texi (OMP_LIB): Mention OpenMP 5.1; add
omp_proc_bind_primary.
* openmp.c (gfc_match_omp_clauses): Accept
'primary' as alias for 'master'.
* trans-openmp.c (gfc_trans_omp_clauses): Handle
OMP_PROC_BIND_PRIMARY.
gcc/ChangeLog:
* tree-core.h (omp_clause_proc_bind_kind): Add
OMP_CLAUSE_PROC_BIND_PRIMARY.
* tree-pretty-print.c (dump_omp_clause): Add TODO comment to
change 'master' to 'primary' in proc_bind for OpenMP 5.1.
libgomp/ChangeLog:
* env.c (parse_bind_var): Accept 'primary' as alias for
'master'.
(omp_display_env): Add TODO comment to
change 'master' to 'primary' in proc_bind for OpenMP 5.1.
* libgomp.texi: Change 'master thread' to 'primary thread'
in line with OpenMP 5.1.
(omp_get_proc_bind): Add omp_proc_bind_primary and note that
omp_proc_bind_master is an alias of it.
(OMP_PROC_BIND): Mention 'PRIMARY'.
* omp.h.in (__GOMP_DEPRECATED_5_1): Define.
(omp_proc_bind_primary): Add.
(omp_proc_bind_master): Deprecate for OpenMP 5.1.
* omp_lib.f90.in (omp_proc_bind_primary): Add.
(omp_proc_bind_master): Deprecate for OpenMP 5.1.
* omp_lib.h.in (omp_proc_bind_primary): Add.
* testsuite/libgomp.c/affinity-1.c: Check that
'primary' works and is identical to 'master'.
gcc/testsuite/ChangeLog:
* c-c++-common/gomp/pr61486-2.c: Duplicate one proc_bind(master)
testcase and test proc_bind(primary) instead.
* gfortran.dg/gomp/affinity-1.f90: Likewise.
Diffstat (limited to 'libgomp')
-rw-r--r-- | libgomp/env.c | 13 | ||||
-rw-r--r-- | libgomp/libgomp.texi | 32 | ||||
-rw-r--r-- | libgomp/omp.h.in | 10 | ||||
-rw-r--r-- | libgomp/omp_lib.f90.in | 6 | ||||
-rw-r--r-- | libgomp/omp_lib.h.in | 2 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.c/affinity-1.c | 14 |
6 files changed, 51 insertions, 26 deletions
diff --git a/libgomp/env.c b/libgomp/env.c index 5220877..9216998 100644 --- a/libgomp/env.c +++ b/libgomp/env.c @@ -437,6 +437,7 @@ parse_bind_var (const char *name, char *p1stvalue, { "false", 5, omp_proc_bind_false }, { "true", 4, omp_proc_bind_true }, { "master", 6, omp_proc_bind_master }, + { "primary", 7, omp_proc_bind_primary }, { "close", 5, omp_proc_bind_close }, { "spread", 6, omp_proc_bind_spread } }; @@ -450,14 +451,14 @@ parse_bind_var (const char *name, char *p1stvalue, if (*env == '\0') goto invalid; - for (i = 0; i < 5; i++) + for (i = 0; i < 6; i++) if (strncasecmp (env, kinds[i].name, kinds[i].len) == 0) { value = kinds[i].kind; env += kinds[i].len; break; } - if (i == 5) + if (i == 6) goto invalid; while (isspace ((unsigned char) *env)) @@ -497,14 +498,14 @@ parse_bind_var (const char *name, char *p1stvalue, if (*env == '\0') goto invalid; - for (i = 2; i < 5; i++) + for (i = 2; i < 6; i++) if (strncasecmp (env, kinds[i].name, kinds[i].len) == 0) { value = kinds[i].kind; env += kinds[i].len; break; } - if (i == 5) + if (i == 6) goto invalid; values[nvalues++] = value; @@ -1277,7 +1278,7 @@ omp_display_env (int verbose) fputs ("TRUE", stderr); break; case omp_proc_bind_master: - fputs ("MASTER", stderr); + fputs ("MASTER", stderr); /* TODO: Change to PRIMARY for OpenMP 5.1. */ break; case omp_proc_bind_close: fputs ("CLOSE", stderr); @@ -1290,7 +1291,7 @@ omp_display_env (int verbose) switch (gomp_bind_var_list[i]) { case omp_proc_bind_master: - fputs (",MASTER", stderr); + fputs (",MASTER", stderr); /* TODO: Change to PRIMARY for OpenMP 5.1. */ break; case omp_proc_bind_close: fputs (",CLOSE", stderr); diff --git a/libgomp/libgomp.texi b/libgomp/libgomp.texi index fc9e708..1bfa26e 100644 --- a/libgomp/libgomp.texi +++ b/libgomp/libgomp.texi @@ -660,8 +660,9 @@ one thread per CPU online is used. @item @emph{Description}: This functions returns the currently active thread affinity policy, which is set via @env{OMP_PROC_BIND}. Possible values are @code{omp_proc_bind_false}, -@code{omp_proc_bind_true}, @code{omp_proc_bind_master}, -@code{omp_proc_bind_close} and @code{omp_proc_bind_spread}. +@code{omp_proc_bind_true}, @code{omp_proc_bind_primary}, +@code{omp_proc_bind_master}, @code{omp_proc_bind_close} and @code{omp_proc_bind_spread}, +where @code{omp_proc_bind_master} is an alias for @code{omp_proc_bind_primary}. @item @emph{C/C++}: @multitable @columnfractions .20 .80 @@ -822,7 +823,7 @@ Returns a unique thread identification number within the current team. In a sequential parts of the program, @code{omp_get_thread_num} always returns 0. In parallel regions the return value varies from 0 to @code{omp_get_num_threads}-1 inclusive. The return -value of the master thread of a team is always 0. +value of the primary thread of a team is always 0. @item @emph{C/C++}: @multitable @columnfractions .20 .80 @@ -1670,11 +1671,12 @@ nesting by default. If undefined one thread per CPU is used. Specifies whether threads may be moved between processors. If set to @code{TRUE}, OpenMP theads should not be moved; if set to @code{FALSE} they may be moved. Alternatively, a comma separated list with the -values @code{MASTER}, @code{CLOSE} and @code{SPREAD} can be used to specify -the thread affinity policy for the corresponding nesting level. With -@code{MASTER} the worker threads are in the same place partition as the -master thread. With @code{CLOSE} those are kept close to the master thread -in contiguous place partitions. And with @code{SPREAD} a sparse distribution +values @code{PRIMARY}, @code{MASTER}, @code{CLOSE} and @code{SPREAD} can +be used to specify the thread affinity policy for the corresponding nesting +level. With @code{PRIMARY} and @code{MASTER} the worker threads are in the +same place partition as the primary thread. With @code{CLOSE} those are +kept close to the primary thread in contiguous place partitions. And +with @code{SPREAD} a sparse distribution across the place partitions is used. Specifying more than one item in the list will automatically enable nesting by default. @@ -1951,23 +1953,23 @@ instance. @item @code{$<priority>} is an optional priority for the worker threads of a thread pool according to @code{pthread_setschedparam}. In case a priority value is omitted, then a worker thread will inherit the priority of the OpenMP -master thread that created it. The priority of the worker thread is not -changed after creation, even if a new OpenMP master thread using the worker has +primary thread that created it. The priority of the worker thread is not +changed after creation, even if a new OpenMP primary thread using the worker has a different priority. @item @code{@@<scheduler-name>} is the scheduler instance name according to the RTEMS application configuration. @end itemize In case no thread pool configuration is specified for a scheduler instance, -then each OpenMP master thread of this scheduler instance will use its own +then each OpenMP primary thread of this scheduler instance will use its own dynamically allocated thread pool. To limit the worker thread count of the -thread pools, each OpenMP master thread must call @code{omp_set_num_threads}. +thread pools, each OpenMP primary thread must call @code{omp_set_num_threads}. @item @emph{Example}: Lets suppose we have three scheduler instances @code{IO}, @code{WRK0}, and @code{WRK1} with @env{GOMP_RTEMS_THREAD_POOLS} set to @code{"1@@WRK0:3$4@@WRK1"}. Then there are no thread pool restrictions for scheduler instance @code{IO}. In the scheduler instance @code{WRK0} there is one thread pool available. Since no priority is specified for this scheduler -instance, the worker thread inherits the priority of the OpenMP master thread +instance, the worker thread inherits the priority of the OpenMP primary thread that created it. In the scheduler instance @code{WRK1} there are three thread pools available and their worker threads run at priority four. @end table @@ -3881,7 +3883,7 @@ if (omp_get_thread_num () == 0) @end smallexample Alternately, we generate two copies of the parallel subfunction -and only include this in the version run by the master thread. +and only include this in the version run by the primary thread. Surely this is not worthwhile though... @@ -4018,7 +4020,7 @@ broadcast would have to happen via SINGLE machinery instead. The private struct mentioned in the previous section should have a pointer to an array of the type of the variable, indexed by the thread's @var{team_id}. The thread stores its final value into the -array, and after the barrier, the master thread iterates over the +array, and after the barrier, the primary thread iterates over the array to collect the values. diff --git a/libgomp/omp.h.in b/libgomp/omp.h.in index da34a9d..314f964 100644 --- a/libgomp/omp.h.in +++ b/libgomp/omp.h.in @@ -32,6 +32,12 @@ # define __GOMP_DEPRECATED_5_0 #endif +#if defined(__GNUC__) && _OPENMP >= 202011 +# define __GOMP_DEPRECATED_5_1 __attribute__((__deprecated__)) +#else +# define __GOMP_DEPRECATED_5_1 +#endif + #ifndef _LIBGOMP_OMP_LOCK_DEFINED #define _LIBGOMP_OMP_LOCK_DEFINED 1 /* These two structures get edited by the libgomp build process to @@ -64,7 +70,9 @@ typedef enum omp_proc_bind_t { omp_proc_bind_false = 0, omp_proc_bind_true = 1, - omp_proc_bind_master = 2, + omp_proc_bind_primary = 2, + omp_proc_bind_master __GOMP_DEPRECATED_5_1 + = omp_proc_bind_primary, omp_proc_bind_close = 3, omp_proc_bind_spread = 4 } omp_proc_bind_t; diff --git a/libgomp/omp_lib.f90.in b/libgomp/omp_lib.f90.in index d7e804f..6394e65 100644 --- a/libgomp/omp_lib.f90.in +++ b/libgomp/omp_lib.f90.in @@ -49,6 +49,8 @@ integer (omp_proc_bind_kind), & parameter :: omp_proc_bind_true = 1 integer (omp_proc_bind_kind), & + parameter :: omp_proc_bind_primary = 2 + integer (omp_proc_bind_kind), & parameter :: omp_proc_bind_master = 2 integer (omp_proc_bind_kind), & parameter :: omp_proc_bind_close = 3 @@ -672,4 +674,8 @@ !GCC$ ATTRIBUTES DEPRECATED :: omp_get_nested, omp_set_nested #endif +#if _OPENMP >= 202011 +!GCC$ ATTRIBUTES DEPRECATED :: omp_proc_bind_master +#endif + end module omp_lib diff --git a/libgomp/omp_lib.h.in b/libgomp/omp_lib.h.in index 20c3264..f2ad445 100644 --- a/libgomp/omp_lib.h.in +++ b/libgomp/omp_lib.h.in @@ -40,11 +40,13 @@ parameter (omp_proc_bind_kind = 4) integer (omp_proc_bind_kind) omp_proc_bind_false integer (omp_proc_bind_kind) omp_proc_bind_true + integer (omp_proc_bind_kind) omp_proc_bind_primary integer (omp_proc_bind_kind) omp_proc_bind_master integer (omp_proc_bind_kind) omp_proc_bind_close integer (omp_proc_bind_kind) omp_proc_bind_spread parameter (omp_proc_bind_false = 0) parameter (omp_proc_bind_true = 1) + parameter (omp_proc_bind_primary = 2) parameter (omp_proc_bind_master = 2) parameter (omp_proc_bind_close = 3) parameter (omp_proc_bind_spread = 4) diff --git a/libgomp/testsuite/libgomp.c/affinity-1.c b/libgomp/testsuite/libgomp.c/affinity-1.c index 13a743e..574a9f7 100644 --- a/libgomp/testsuite/libgomp.c/affinity-1.c +++ b/libgomp/testsuite/libgomp.c/affinity-1.c @@ -183,20 +183,26 @@ main () int test_false = env_proc_bind && strcmp (env_proc_bind, "false") == 0; int test_true = env_proc_bind && strcmp (env_proc_bind, "true") == 0; int test_spread_master_close - = env_proc_bind && strcmp (env_proc_bind, "spread,master,close") == 0; + = (env_proc_bind + && (strcmp (env_proc_bind, "spread,master,close") == 0 + || strcmp (env_proc_bind, "spread,primary,close") == 0)); char *env_places = getenv ("OMP_PLACES"); int test_places = 0; + if (omp_proc_bind_master != omp_proc_bind_primary) + abort (); + #ifdef DO_FORK if (env_places == NULL && contig_cpucount >= 8 && test_false && getenv ("GOMP_AFFINITY") == NULL) { int i, j, status; pid_t pid; - for (j = 0; j < 2; j++) + for (j = 0; j < 3; j++) { - if (setenv ("OMP_PROC_BIND", j ? "spread,master,close" : "true", 1) - < 0) + if (setenv ("OMP_PROC_BIND", + j > 1 ? "spread,primary,close" + : (j ? "spread,master,close" : "true"), 1) < 0) break; for (i = sizeof (places_array) / sizeof (places_array[0]) - 1; i; --i) |