aboutsummaryrefslogtreecommitdiff
path: root/libgomp
diff options
context:
space:
mode:
authorTobias Burnus <tobias@codesourcery.com>2021-08-12 15:48:28 +0200
committerTobias Burnus <tobias@codesourcery.com>2021-08-12 15:49:49 +0200
commit432de08498142d2266c0fb05f2c555a7f1e10ddd (patch)
treeeb534cfc1379a9d59255a6c31f38519aaba927b4 /libgomp
parent2d7967a10c2f3b4652f77a1a2119ba03b3472266 (diff)
downloadgcc-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.c13
-rw-r--r--libgomp/libgomp.texi32
-rw-r--r--libgomp/omp.h.in10
-rw-r--r--libgomp/omp_lib.f90.in6
-rw-r--r--libgomp/omp_lib.h.in2
-rw-r--r--libgomp/testsuite/libgomp.c/affinity-1.c14
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)