[PATCH 1/4] Remove architecture specific sched_cpucount optimizations

Adhemerval Zanella adhemerval.zanella@linaro.org
Wed May 5 16:52:58 GMT 2021


Ping.

On 29/03/2021 15:25, Adhemerval Zanella wrote:
> And replace the generic algorithm with the Brian Kernighan’s one.
> GCC optimize it with popcnt if the architecture supports, so there
> is no need to add the extra POPCNT define to enable it.
> 
> This is really a micro-optimization that only adds complexity:
> recent ABIs already support it (x86-64-v2 or power64le) and it
> simplifies the code for internal usage, since i686 does not allow an
> internal iFUNC call.
> 
> Checked on x86_64-linux-gnu, aarch64-linux-gnu, and
> powerpc64le-linux-gnu.
> ---
>  posix/sched_cpucount.c                       | 28 +++------------
>  sysdeps/i386/i686/multiarch/sched_cpucount.c |  1 -
>  sysdeps/ia64/sched_cpucount.c                | 20 -----------
>  sysdeps/powerpc/sched_cpucount.c             | 22 ------------
>  sysdeps/x86_64/multiarch/sched_cpucount.c    | 36 --------------------
>  sysdeps/x86_64/sched_cpucount.c              | 25 --------------
>  6 files changed, 4 insertions(+), 128 deletions(-)
>  delete mode 100644 sysdeps/i386/i686/multiarch/sched_cpucount.c
>  delete mode 100644 sysdeps/ia64/sched_cpucount.c
>  delete mode 100644 sysdeps/powerpc/sched_cpucount.c
>  delete mode 100644 sysdeps/x86_64/multiarch/sched_cpucount.c
>  delete mode 100644 sysdeps/x86_64/sched_cpucount.c
> 
> diff --git a/posix/sched_cpucount.c b/posix/sched_cpucount.c
> index b0ca4ea7bc..529286e777 100644
> --- a/posix/sched_cpucount.c
> +++ b/posix/sched_cpucount.c
> @@ -22,31 +22,11 @@ int
>  __sched_cpucount (size_t setsize, const cpu_set_t *setp)
>  {
>    int s = 0;
> -  const __cpu_mask *p = setp->__bits;
> -  const __cpu_mask *end = &setp->__bits[setsize / sizeof (__cpu_mask)];
> -
> -  while (p < end)
> +  for (int i = 0; i < setsize / sizeof (__cpu_mask); i++)
>      {
> -      __cpu_mask l = *p++;
> -
> -#ifdef POPCNT
> -      s += POPCNT (l);
> -#else
> -      if (l == 0)
> -	continue;
> -
> -      _Static_assert (sizeof (l) == sizeof (unsigned int)
> -		      || sizeof (l) == sizeof (unsigned long)
> -		      || sizeof (l) == sizeof (unsigned long long),
> -		      "sizeof (__cpu_mask");
> -      if (sizeof (__cpu_mask) == sizeof (unsigned int))
> -	s += __builtin_popcount (l);
> -      else if (sizeof (__cpu_mask) == sizeof (unsigned long))
> -	s += __builtin_popcountl (l);
> -      else
> -	s += __builtin_popcountll (l);
> -#endif
> +      __cpu_mask si = setp->__bits[i];
> +      /* Clear the least significant bit set.  */
> +      for (; si != 0; si &= si - 1, s++);
>      }
> -
>    return s;
>  }
> diff --git a/sysdeps/i386/i686/multiarch/sched_cpucount.c b/sysdeps/i386/i686/multiarch/sched_cpucount.c
> deleted file mode 100644
> index 7db31b02f8..0000000000
> --- a/sysdeps/i386/i686/multiarch/sched_cpucount.c
> +++ /dev/null
> @@ -1 +0,0 @@
> -#include <sysdeps/x86_64/multiarch/sched_cpucount.c>
> diff --git a/sysdeps/ia64/sched_cpucount.c b/sysdeps/ia64/sched_cpucount.c
> deleted file mode 100644
> index 8440864b02..0000000000
> --- a/sysdeps/ia64/sched_cpucount.c
> +++ /dev/null
> @@ -1,20 +0,0 @@
> -/* Copyright (C) 2007-2021 Free Software Foundation, Inc.
> -   This file is part of the GNU C Library.
> -
> -   The GNU C Library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public
> -   License as published by the Free Software Foundation; either
> -   version 2.1 of the License, or (at your option) any later version.
> -
> -   The GNU C Library is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with the GNU C Library; if not, see
> -   <https://www.gnu.org/licenses/>.  */
> -
> -#define POPCNT(l) __builtin_popcountl (l)
> -
> -#include <posix/sched_cpucount.c>
> diff --git a/sysdeps/powerpc/sched_cpucount.c b/sysdeps/powerpc/sched_cpucount.c
> deleted file mode 100644
> index 8f00e3dbc8..0000000000
> --- a/sysdeps/powerpc/sched_cpucount.c
> +++ /dev/null
> @@ -1,22 +0,0 @@
> -/* Copyright (C) 2007-2021 Free Software Foundation, Inc.
> -   This file is part of the GNU C Library.
> -
> -   The GNU C Library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public
> -   License as published by the Free Software Foundation; either
> -   version 2.1 of the License, or (at your option) any later version.
> -
> -   The GNU C Library is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with the GNU C Library; if not, see
> -   <https://www.gnu.org/licenses/>.  */
> -
> -#ifdef _ARCH_PWR5
> -# define POPCNT(l) __builtin_popcountl (l)
> -#endif
> -
> -#include <posix/sched_cpucount.c>
> diff --git a/sysdeps/x86_64/multiarch/sched_cpucount.c b/sysdeps/x86_64/multiarch/sched_cpucount.c
> deleted file mode 100644
> index 5180a11434..0000000000
> --- a/sysdeps/x86_64/multiarch/sched_cpucount.c
> +++ /dev/null
> @@ -1,36 +0,0 @@
> -/* Count bits in CPU set.  x86-64 multi-arch version.
> -   This file is part of the GNU C Library.
> -   Copyright (C) 2008-2021 Free Software Foundation, Inc.
> -   Contributed by Ulrich Drepper <drepper@redhat.com>.
> -
> -   The GNU C Library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public
> -   License as published by the Free Software Foundation; either
> -   version 2.1 of the License, or (at your option) any later version.
> -
> -   The GNU C Library is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with the GNU C Library; if not, see
> -   <https://www.gnu.org/licenses/>.  */
> -
> -#include <sched.h>
> -#include "init-arch.h"
> -
> -#define __sched_cpucount static generic_cpucount
> -#include <posix/sched_cpucount.c>
> -#undef __sched_cpucount
> -
> -#define POPCNT(l) \
> -  ({ __cpu_mask r; \
> -     asm ("popcnt %1, %0" : "=r" (r) : "0" (l));\
> -     r; })
> -#define __sched_cpucount static popcount_cpucount
> -#include <posix/sched_cpucount.c>
> -#undef __sched_cpucount
> -
> -libc_ifunc (__sched_cpucount,
> -	    CPU_FEATURE_USABLE (POPCNT) ? popcount_cpucount : generic_cpucount);
> diff --git a/sysdeps/x86_64/sched_cpucount.c b/sysdeps/x86_64/sched_cpucount.c
> deleted file mode 100644
> index 5a27336d6d..0000000000
> --- a/sysdeps/x86_64/sched_cpucount.c
> +++ /dev/null
> @@ -1,25 +0,0 @@
> -/* Copyright (C) 2007-2021 Free Software Foundation, Inc.
> -   This file is part of the GNU C Library.
> -
> -   The GNU C Library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public
> -   License as published by the Free Software Foundation; either
> -   version 2.1 of the License, or (at your option) any later version.
> -
> -   The GNU C Library is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with the GNU C Library; if not, see
> -   <https://www.gnu.org/licenses/>.  */
> -
> -#ifdef __amdfam10
> -# define POPCNT(l) \
> -  ({ __cpu_mask r;							      \
> -     asm ("popcntq %1, %0" : "=r" (r) : "0" (l));			      \
> -     r; })
> -#endif
> -
> -#include <posix/sched_cpucount.c>
> 


More information about the Libc-alpha mailing list