aboutsummaryrefslogtreecommitdiff
path: root/libgomp/env.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-04-04 17:44:20 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2007-04-04 17:44:20 +0200
commita0884cf09ee0b132930c5ad0f16736f9681f3b07 (patch)
treeac821b38fafbfdcd8c9ded3ac49ca98b9174d998 /libgomp/env.c
parent6acd883864e3cff5895962772cca141bbbf3d2ad (diff)
downloadgcc-a0884cf09ee0b132930c5ad0f16736f9681f3b07.zip
gcc-a0884cf09ee0b132930c5ad0f16736f9681f3b07.tar.gz
gcc-a0884cf09ee0b132930c5ad0f16736f9681f3b07.tar.bz2
libgomp.h (gomp_cpu_affinity, [...]): New extern decls.
* libgomp.h (gomp_cpu_affinity, gomp_cpu_affinity_len): New extern decls. (gomp_init_affinity, gomp_init_thread_affinity): New prototypes. * env.c (gomp_cpu_affinity, gomp_cpu_affinity_len): New variables. (parse_affinity): New function. (initialize_env): Call it and gomp_init_affinity. * team.c (gomp_team_start): If gomp_cpu_affinity != NULL, create new pthread_attr_t and call gomp_init_thread_affinity on it for each thread before passing the attribute to pthread_create. * config/linux/affinity.c: New file. * config/posix/affinity.c: New file. * configure.ac (HAVE_PTHREAD_AFFINITY_NP): New test. * configure: Rebuilt. * config.h.in: Rebuilt. * Makefile.am (libgomp_la_SOURCES): Add affinity.c. * Makefile.in: Rebuilt. From-SVN: r123494
Diffstat (limited to 'libgomp/env.c')
-rw-r--r--libgomp/env.c97
1 files changed, 96 insertions, 1 deletions
diff --git a/libgomp/env.c b/libgomp/env.c
index f07b31b..4a07bfa 100644
--- a/libgomp/env.c
+++ b/libgomp/env.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
Contributed by Richard Henderson <rth@redhat.com>.
This file is part of the GNU OpenMP Library (libgomp).
@@ -42,6 +42,8 @@ bool gomp_dyn_var = false;
bool gomp_nest_var = false;
enum gomp_schedule_type gomp_run_sched_var = GFS_DYNAMIC;
unsigned long gomp_run_sched_chunk = 1;
+unsigned short *gomp_cpu_affinity;
+size_t gomp_cpu_affinity_len;
/* Parse the OMP_SCHEDULE environment variable. */
@@ -177,6 +179,97 @@ parse_boolean (const char *name, bool *value)
gomp_error ("Invalid value for environment variable %s", name);
}
+/* Parse the GOMP_CPU_AFFINITY environment varible. Return true if one was
+ present and it was successfully parsed. */
+
+static bool
+parse_affinity (void)
+{
+ char *env, *end;
+ unsigned long cpu_beg, cpu_end, cpu_stride;
+ unsigned short *cpus = NULL;
+ size_t allocated = 0, used = 0, needed;
+
+ env = getenv ("GOMP_CPU_AFFINITY");
+ if (env == NULL)
+ return false;
+
+ do
+ {
+ while (*env == ' ' || *env == '\t')
+ env++;
+
+ cpu_beg = strtoul (env, &end, 0);
+ cpu_end = cpu_beg;
+ cpu_stride = 1;
+ if (env == end || cpu_beg >= 65536)
+ goto invalid;
+
+ env = end;
+ if (*env == '-')
+ {
+ cpu_end = strtoul (++env, &end, 0);
+ if (env == end || cpu_end >= 65536 || cpu_end < cpu_beg)
+ goto invalid;
+
+ env = end;
+ if (*env == ':')
+ {
+ cpu_stride = strtoul (++env, &end, 0);
+ if (env == end || cpu_stride == 0 || cpu_stride >= 65536)
+ goto invalid;
+
+ env = end;
+ }
+ }
+
+ needed = (cpu_end - cpu_beg) / cpu_stride + 1;
+ if (used + needed >= allocated)
+ {
+ unsigned short *new_cpus;
+
+ if (allocated < 64)
+ allocated = 64;
+ if (allocated > needed)
+ allocated <<= 1;
+ else
+ allocated += 2 * needed;
+ new_cpus = realloc (cpus, allocated * sizeof (unsigned short));
+ if (new_cpus == NULL)
+ {
+ free (cpus);
+ gomp_error ("not enough memory to store GOMP_CPU_AFFINITY list");
+ return false;
+ }
+
+ cpus = new_cpus;
+ }
+
+ while (needed--)
+ {
+ cpus[used++] = cpu_beg;
+ cpu_beg += cpu_stride;
+ }
+
+ while (*env == ' ' || *env == '\t')
+ env++;
+
+ if (*env == ',')
+ env++;
+ else if (*env == '\0')
+ break;
+ }
+ while (1);
+
+ gomp_cpu_affinity = cpus;
+ gomp_cpu_affinity_len = used;
+ return true;
+
+ invalid:
+ gomp_error ("Invalid value for enviroment variable GOMP_CPU_AFFINITY");
+ return false;
+}
+
static void __attribute__((constructor))
initialize_env (void)
{
@@ -190,6 +283,8 @@ initialize_env (void)
parse_boolean ("OMP_NESTED", &gomp_nest_var);
if (!parse_unsigned_long ("OMP_NUM_THREADS", &gomp_nthreads_var))
gomp_init_num_threads ();
+ if (parse_affinity ())
+ gomp_init_affinity ();
/* Not strictly environment related, but ordering constructors is tricky. */
pthread_attr_init (&gomp_thread_attr);