From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1534) id AB6A53857C7F; Fri, 15 Oct 2021 11:05:22 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org AB6A53857C7F Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Tobias Burnus To: gcc-cvs@gcc.gnu.org Subject: [gcc/devel/omp/gcc-11] openmp: Add support for OMP_PLACES=numa_domains X-Act-Checkin: gcc X-Git-Author: Jakub Jelinek X-Git-Refname: refs/heads/devel/omp/gcc-11 X-Git-Oldrev: 1b23d8b3a216cf0022401b22647ebed2eccc73e4 X-Git-Newrev: c0a91dff3902eb00ff1ac8755f1b20a27b721728 Message-Id: <20211015110522.AB6A53857C7F@sourceware.org> Date: Fri, 15 Oct 2021 11:05:22 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 15 Oct 2021 11:05:22 -0000 https://gcc.gnu.org/g:c0a91dff3902eb00ff1ac8755f1b20a27b721728 commit c0a91dff3902eb00ff1ac8755f1b20a27b721728 Author: Jakub Jelinek Date: Fri Oct 15 12:59:24 2021 +0200 openmp: Add support for OMP_PLACES=numa_domains This adds support for numa_domains abstract name in OMP_PLACES, also new in OpenMP 5.1. Way to test this is OMP_PLACES=numa_domains OMP_DISPLAY_ENV=true LD_PRELOAD=.libs/libgomp.so.1 /bin/true and see what it prints on OMP_PLACES line. For non-NUMA machines it should print a single place that covers all CPUs, for NUMA machine one place for each NUMA node with corresponding CPUs. 2021-10-15 Jakub Jelinek * env.c (parse_places_var): Handle numa_domains as level 5. * config/linux/affinity.c (gomp_affinity_init_numa_domains): New function. (gomp_affinity_init_level): Use it instead of gomp_affinity_init_level_1 for level == 5. * testsuite/libgomp.c/places-5.c: New test. (cherry picked from commit e7ce32c783c8d38ef8a1ab227fd05cbab41da75b) Diff: --- libgomp/ChangeLog.omp | 12 ++++ libgomp/config/linux/affinity.c | 103 ++++++++++++++++++++++++++++++++- libgomp/env.c | 5 ++ libgomp/testsuite/libgomp.c/places-5.c | 10 ++++ 4 files changed, 128 insertions(+), 2 deletions(-) diff --git a/libgomp/ChangeLog.omp b/libgomp/ChangeLog.omp index af41b929348..cb05c2c11f2 100644 --- a/libgomp/ChangeLog.omp +++ b/libgomp/ChangeLog.omp @@ -1,3 +1,15 @@ +2021-10-15 Tobias Burnus + + Backported from master: + 2021-10-15 Jakub Jelinek + + * env.c (parse_places_var): Handle numa_domains as level 5. + * config/linux/affinity.c (gomp_affinity_init_numa_domains): New + function. + (gomp_affinity_init_level): Use it instead of + gomp_affinity_init_level_1 for level == 5. + * testsuite/libgomp.c/places-5.c: New test. + 2021-10-15 Tobias Burnus Backported from master: diff --git a/libgomp/config/linux/affinity.c b/libgomp/config/linux/affinity.c index 32415537853..82981b65472 100644 --- a/libgomp/config/linux/affinity.c +++ b/libgomp/config/linux/affinity.c @@ -355,6 +355,102 @@ gomp_affinity_init_level_1 (int level, int this_level, unsigned long count, free (line); } +static void +gomp_affinity_init_numa_domains (unsigned long count, cpu_set_t *copy, + char *name) +{ + FILE *f; + char *nline = NULL, *line = NULL; + size_t nlinelen = 0, linelen = 0; + char *q; + size_t prefix_len = sizeof ("/sys/devices/system/node/") - 1; + + strcpy (name, "/sys/devices/system/node/online"); + f = fopen (name, "r"); + if (f == NULL || getline (&nline, &nlinelen, f) <= 0) + { + if (f) + fclose (f); + return; + } + fclose (f); + q = nline; + while (*q && *q != '\n' && gomp_places_list_len < count) + { + unsigned long nfirst, nlast; + + errno = 0; + nfirst = strtoul (q, &q, 10); + if (errno) + break; + nlast = nfirst; + if (*q == '-') + { + errno = 0; + nlast = strtoul (q + 1, &q, 10); + if (errno || nlast < nfirst) + break; + } + for (; nfirst <= nlast; nfirst++) + { + sprintf (name + prefix_len, "node%lu/cpulist", nfirst); + f = fopen (name, "r"); + if (f == NULL) + continue; + if (getline (&line, &linelen, f) > 0) + { + char *p = line; + void *pl = NULL; + + while (*p && *p != '\n') + { + unsigned long first, last; + bool seen = false; + + errno = 0; + first = strtoul (p, &p, 10); + if (errno) + break; + last = first; + if (*p == '-') + { + errno = 0; + last = strtoul (p + 1, &p, 10); + if (errno || last < first) + break; + } + for (; first <= last; first++) + { + if (!CPU_ISSET_S (first, gomp_cpuset_size, copy)) + continue; + if (pl == NULL) + { + pl = gomp_places_list[gomp_places_list_len]; + gomp_affinity_init_place (pl); + } + if (gomp_affinity_add_cpus (pl, first, 1, 0, true)) + { + CPU_CLR_S (first, gomp_cpuset_size, copy); + if (!seen) + { + gomp_places_list_len++; + seen = true; + } + } + } + if (*p == ',') + ++p; + } + } + fclose (f); + } + if (*q == ',') + ++q; + } + free (line); + free (nline); +} + bool gomp_affinity_init_level (int level, unsigned long count, bool quiet) { @@ -377,8 +473,11 @@ gomp_affinity_init_level (int level, unsigned long count, bool quiet) copy = gomp_alloca (gomp_cpuset_size); strcpy (name, "/sys/devices/system/cpu/cpu"); memcpy (copy, gomp_cpusetp, gomp_cpuset_size); - gomp_affinity_init_level_1 (level, level > 3 ? level : 3, count, copy, name, - quiet); + if (level == 5) + gomp_affinity_init_numa_domains (count, copy, name); + else + gomp_affinity_init_level_1 (level, level > 3 ? level : 3, count, copy, + name, quiet); if (gomp_places_list_len == 0) { if (!quiet) diff --git a/libgomp/env.c b/libgomp/env.c index 38903c76b34..7eb895f6b69 100644 --- a/libgomp/env.c +++ b/libgomp/env.c @@ -701,6 +701,11 @@ parse_places_var (const char *name, bool ignore) env += 9; level = 4; } + else if (strncasecmp (env, "numa_domains", 12) == 0) + { + env += 12; + level = 5; + } if (level) { count = ULONG_MAX; diff --git a/libgomp/testsuite/libgomp.c/places-5.c b/libgomp/testsuite/libgomp.c/places-5.c new file mode 100644 index 00000000000..5f1e595433b --- /dev/null +++ b/libgomp/testsuite/libgomp.c/places-5.c @@ -0,0 +1,10 @@ +/* { dg-set-target-env-var OMP_PLACES "numa_domains" } */ + +#include + +int +main () +{ + omp_display_env (0); + return 0; +}