util: Consider CPU affinity when detecting number of CPUs
A similar path can be used on at least FreeBSD using cpuset_getaffinity. This is how Ninja determines the number of available CPUs on that platform. See the GetProcessorCount function in util.cc: https://github.com/ninja-build/ninja/blob/master/src/util.cc v2: Fix counting the number of available CPUs. The CPU_COUNT API does not work the way I thought it did. :face_palm: Noticed by Marek. Reviewed-by: Adam Jackson <ajax@redhat.com> [v1] Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> [v1] Reviewed-by: Marek Olšák <marek.olsak@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11228>
This commit is contained in:
@@ -1288,6 +1288,13 @@ if (cc.has_header_symbol('sys/mkdev.h', 'major') and
|
|||||||
pre_args += '-DMAJOR_IN_MKDEV'
|
pre_args += '-DMAJOR_IN_MKDEV'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if cc.check_header('sched.h')
|
||||||
|
pre_args += '-DHAS_SCHED_H'
|
||||||
|
if cc.has_function('sched_getaffinity')
|
||||||
|
pre_args += '-DHAS_SCHED_GETAFFINITY'
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
if not ['linux'].contains(host_machine.system())
|
if not ['linux'].contains(host_machine.system())
|
||||||
# Deprecated on Linux and requires <sys/types.h> on FreeBSD and OpenBSD
|
# Deprecated on Linux and requires <sys/types.h> on FreeBSD and OpenBSD
|
||||||
if cc.check_header('sys/sysctl.h', prefix : '#include <sys/types.h>')
|
if cc.check_header('sys/sysctl.h', prefix : '#include <sys/types.h>')
|
||||||
|
@@ -86,6 +86,9 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(HAS_SCHED_H)
|
||||||
|
#include <sched.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
DEBUG_GET_ONCE_BOOL_OPTION(dump_cpu, "GALLIUM_DUMP_CPU", false)
|
DEBUG_GET_ONCE_BOOL_OPTION(dump_cpu, "GALLIUM_DUMP_CPU", false)
|
||||||
|
|
||||||
@@ -573,12 +576,29 @@ util_cpu_detect_once(void)
|
|||||||
available_cpus = MAX2(1, system_info.dwNumberOfProcessors);
|
available_cpus = MAX2(1, system_info.dwNumberOfProcessors);
|
||||||
}
|
}
|
||||||
#elif defined(PIPE_OS_UNIX)
|
#elif defined(PIPE_OS_UNIX)
|
||||||
|
# if defined(HAS_SCHED_GETAFFINITY)
|
||||||
|
{
|
||||||
|
/* sched_setaffinity() can be used to further restrict the number of
|
||||||
|
* CPUs on which the process can run. Use sched_getaffinity() to
|
||||||
|
* determine the true number of available CPUs.
|
||||||
|
*
|
||||||
|
* FIXME: The Linux manual page for sched_getaffinity describes how this
|
||||||
|
* simple implementation will fail with > 1024 CPUs, and we'll fall back
|
||||||
|
* to the _SC_NPROCESSORS_ONLN path. Support for > 1024 CPUs can be
|
||||||
|
* added to this path once someone has such a system for testing.
|
||||||
|
*/
|
||||||
|
cpu_set_t affin;
|
||||||
|
if (sched_getaffinity(getpid(), sizeof(affin), &affin) == 0)
|
||||||
|
available_cpus = CPU_COUNT(&affin);
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
/* Linux, FreeBSD, DragonFly, and Mac OS X should have
|
/* Linux, FreeBSD, DragonFly, and Mac OS X should have
|
||||||
* _SC_NOPROCESSORS_ONLN. NetBSD and OpenBSD should have HW_NCPUONLINE.
|
* _SC_NOPROCESSORS_ONLN. NetBSD and OpenBSD should have HW_NCPUONLINE.
|
||||||
* This is what FFmpeg uses on those platforms.
|
* This is what FFmpeg uses on those platforms.
|
||||||
*/
|
*/
|
||||||
# if defined(PIPE_OS_BSD) && defined(HW_NCPUONLINE)
|
# if defined(PIPE_OS_BSD) && defined(HW_NCPUONLINE)
|
||||||
{
|
if (available_cpus == 0) {
|
||||||
const int mib[] = { CTL_HW, HW_NCPUONLINE };
|
const int mib[] = { CTL_HW, HW_NCPUONLINE };
|
||||||
int ncpu;
|
int ncpu;
|
||||||
int len = sizeof(ncpu);
|
int len = sizeof(ncpu);
|
||||||
@@ -587,11 +607,13 @@ util_cpu_detect_once(void)
|
|||||||
available_cpus = ncpu;
|
available_cpus = ncpu;
|
||||||
}
|
}
|
||||||
# elif defined(_SC_NPROCESSORS_ONLN)
|
# elif defined(_SC_NPROCESSORS_ONLN)
|
||||||
available_cpus = sysconf(_SC_NPROCESSORS_ONLN);
|
if (available_cpus == 0) {
|
||||||
if (available_cpus == ~0)
|
available_cpus = sysconf(_SC_NPROCESSORS_ONLN);
|
||||||
available_cpus = 1;
|
if (available_cpus == ~0)
|
||||||
|
available_cpus = 1;
|
||||||
|
}
|
||||||
# elif defined(PIPE_OS_BSD)
|
# elif defined(PIPE_OS_BSD)
|
||||||
{
|
if (available_cpus == 0) {
|
||||||
const int mib[] = { CTL_HW, HW_NCPU };
|
const int mib[] = { CTL_HW, HW_NCPU };
|
||||||
int ncpu;
|
int ncpu;
|
||||||
int len = sizeof(ncpu);
|
int len = sizeof(ncpu);
|
||||||
|
Reference in New Issue
Block a user