openmp: Fix up handling of OMP_PLACES=threads(1)

When writing the places-*.c tests, I've noticed that we mishandle threads
abstract name with specified num-places if num-places isn't a multiple of
number of hw threads in a core.  It then happily ignores the maximum count
and overwrites for the remaining hw threads in a core further places that
haven't been allocated.

2021-10-15  Jakub Jelinek  <jakub@redhat.com>

	* config/linux/affinity.c (gomp_affinity_init_level_1): For level 1
	after creating count places clean up and return immediately.
	* testsuite/libgomp.c/places-6.c: New test.
	* testsuite/libgomp.c/places-7.c: New test.
	* testsuite/libgomp.c/places-8.c: New test.
	* testsuite/libgomp.c/places-9.c: New test.
	* testsuite/libgomp.c/places-10.c: New test.
This commit is contained in:
Jakub Jelinek 2021-10-15 16:25:25 +02:00
parent f3d64372d7
commit 4764049dd6
6 changed files with 57 additions and 2 deletions

View File

@ -338,8 +338,13 @@ gomp_affinity_init_level_1 (int level, int this_level, unsigned long count,
if (gomp_affinity_add_cpus (pl, first, 1, 0, true))
{
CPU_CLR_S (first, gomp_cpuset_size, copy);
if (level == 1)
gomp_places_list_len++;
if (level == 1
&& ++gomp_places_list_len >= count)
{
fclose (f);
free (line);
return;
}
}
}
if (*p == ',')

View File

@ -0,0 +1,10 @@
/* { dg-set-target-env-var OMP_PLACES "numa_domains(1)" } */
#include <omp.h>
int
main ()
{
omp_display_env (0);
return 0;
}

View File

@ -0,0 +1,10 @@
/* { dg-set-target-env-var OMP_PLACES "threads(1)" } */
#include <omp.h>
int
main ()
{
omp_display_env (0);
return 0;
}

View File

@ -0,0 +1,10 @@
/* { dg-set-target-env-var OMP_PLACES "cores(1)" } */
#include <omp.h>
int
main ()
{
omp_display_env (0);
return 0;
}

View File

@ -0,0 +1,10 @@
/* { dg-set-target-env-var OMP_PLACES "sockets(1)" } */
#include <omp.h>
int
main ()
{
omp_display_env (0);
return 0;
}

View File

@ -0,0 +1,10 @@
/* { dg-set-target-env-var OMP_PLACES "ll_caches(1)" } */
#include <omp.h>
int
main ()
{
omp_display_env (0);
return 0;
}