This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Adjust gomp_available_cpus in gomp_init_affinity (PR libgomp/43706)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 20 Apr 2010 17:48:22 +0200
- Subject: [PATCH] Adjust gomp_available_cpus in gomp_init_affinity (PR libgomp/43706)
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
gomp_available_cpus is used in two places - to initialize nthreads_var
ICV during initialization if OMP_NUM_THREADS is missing, and to
see if throttled spincount should be used instead of normal spincount
when starting to spin.
gomp_init_affinity is called after nthreads_var ICV is initialized, and
if it contains fewer CPUs than originally available to the process,
it means we can spin a lot even when we have more managed threads than
actual CPUs we schedule threads on.
The following patch adjusts gomp_available_cpus in that case so throttling
works better.
Committed to trunk, will commit to 4.5/4.4 after testing there.
2010-04-20 Jakub Jelinek <jakub@redhat.com>
PR libgomp/43706
* config/linux/affinity.c (gomp_init_affinity): Decrease
gomp_available_cpus if affinity mask confines the process to fewer
CPUs.
* config/linux/proc.c (get_num_procs): If gomp_cpu_affinity is
non-NULL, just return gomp_available_cpus.
--- libgomp/config/linux/affinity.c.jj 2009-04-14 16:33:07.000000000 +0200
+++ libgomp/config/linux/affinity.c 2010-04-20 12:38:14.000000000 +0200
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+/* Copyright (C) 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
Contributed by Jakub Jelinek <jakub@redhat.com>.
This file is part of the GNU OpenMP Library (libgomp).
@@ -39,8 +39,9 @@ static unsigned int affinity_counter;
void
gomp_init_affinity (void)
{
- cpu_set_t cpuset;
+ cpu_set_t cpuset, cpusetnew;
size_t idx, widx;
+ unsigned long cpus = 0;
if (pthread_getaffinity_np (pthread_self (), sizeof (cpuset), &cpuset))
{
@@ -51,10 +52,18 @@ gomp_init_affinity (void)
return;
}
+ CPU_ZERO (&cpusetnew);
for (widx = idx = 0; idx < gomp_cpu_affinity_len; idx++)
if (gomp_cpu_affinity[idx] < CPU_SETSIZE
&& CPU_ISSET (gomp_cpu_affinity[idx], &cpuset))
- gomp_cpu_affinity[widx++] = gomp_cpu_affinity[idx];
+ {
+ if (! CPU_ISSET (gomp_cpu_affinity[idx], &cpusetnew))
+ {
+ cpus++;
+ CPU_SET (gomp_cpu_affinity[idx], &cpusetnew);
+ }
+ gomp_cpu_affinity[widx++] = gomp_cpu_affinity[idx];
+ }
if (widx == 0)
{
@@ -66,6 +75,8 @@ gomp_init_affinity (void)
}
gomp_cpu_affinity_len = widx;
+ if (cpus < gomp_available_cpus)
+ gomp_available_cpus = cpus;
CPU_ZERO (&cpuset);
CPU_SET (gomp_cpu_affinity[0], &cpuset);
pthread_setaffinity_np (pthread_self (), sizeof (cpuset), &cpuset);
--- libgomp/config/linux/proc.c.jj 2009-04-14 16:33:07.000000000 +0200
+++ libgomp/config/linux/proc.c 2010-04-20 12:41:23.000000000 +0200
@@ -1,4 +1,5 @@
-/* Copyright (C) 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+/* Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
+ Free Software Foundation, Inc.
Contributed by Jakub Jelinek <jakub@redhat.com>.
This file is part of the GNU OpenMP Library (libgomp).
@@ -104,26 +105,13 @@ get_num_procs (void)
}
else
{
- size_t idx;
- static int affinity_cpus;
-
/* We can't use pthread_getaffinity_np in this case
(we have changed it ourselves, it binds to just one CPU).
Count instead the number of different CPUs we are
- using. */
- CPU_ZERO (&cpuset);
- if (affinity_cpus == 0)
- {
- int cpus = 0;
- for (idx = 0; idx < gomp_cpu_affinity_len; idx++)
- if (! CPU_ISSET (gomp_cpu_affinity[idx], &cpuset))
- {
- cpus++;
- CPU_SET (gomp_cpu_affinity[idx], &cpuset);
- }
- affinity_cpus = cpus;
- }
- return affinity_cpus;
+ using. gomp_init_affinity updated gomp_available_cpus to
+ the number of CPUs in the GOMP_AFFINITY mask that we are
+ allowed to use though. */
+ return gomp_available_cpus;
}
#endif
#ifdef _SC_NPROCESSORS_ONLN
Jakub