From 6a9443d955ce742112c6c05ed68fc8c3d5b6c3e6 Mon Sep 17 00:00:00 2001 From: Wessel Dankers Date: Sun, 30 Oct 2022 18:06:51 +0100 Subject: [PATCH] Only use available CPUs Not all online CPUs may be available for the current process, especially when CPU affinity is involved. In such cases too many threads will be created, which will unnecessarily compete for CPU time. Use sched_getaffinity() (if available) to determine the correct number of threads to create. --- configure.ac | 2 +- src/cpu.c | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 9773993..2678f64 100644 --- a/configure.ac +++ b/configure.ac @@ -68,7 +68,7 @@ AC_SYS_LARGEFILE AC_FUNC_MALLOC AC_FUNC_REALLOC AC_FUNC_STRTOD -AC_CHECK_FUNCS([memchr memmove memset strerror strtol]) +AC_CHECK_FUNCS([memchr memmove memset strerror strtol sched_getaffinity]) AC_CHECK_HEADER([sys/endian.h], [ AC_CHECK_DECLS([htole64, le64toh], [], [], [ diff --git a/src/cpu.c b/src/cpu.c index c0155ef..3d2e813 100644 --- a/src/cpu.c +++ b/src/cpu.c @@ -1,5 +1,28 @@ +#define _GNU_SOURCE + #include +#include "config.h" + +#ifdef HAVE_SCHED_GETAFFINITY + +#include +#include + +size_t num_threads(void) { + cpu_set_t cpu_set; + CPU_ZERO(&cpu_set); + + if (sched_getaffinity(0, sizeof cpu_set, &cpu_set) == -1) + return sysconf(_SC_NPROCESSORS_ONLN); + else + return CPU_COUNT(&cpu_set); +} + +#else + size_t num_threads(void) { return sysconf(_SC_NPROCESSORS_ONLN); } + +#endif