123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358 |
- #include <config.h>
- #include "nproc.h"
- #include <stdlib.h>
- #include <unistd.h>
- #if HAVE_PTHREAD_GETAFFINITY_NP && 0
- # include <pthread.h>
- # include <sched.h>
- #endif
- #if HAVE_SCHED_GETAFFINITY_LIKE_GLIBC || HAVE_SCHED_GETAFFINITY_NP
- # include <sched.h>
- #endif
- #include <sys/types.h>
- #if HAVE_SYS_PSTAT_H
- # include <sys/pstat.h>
- #endif
- #if HAVE_SYS_SYSMP_H
- # include <sys/sysmp.h>
- #endif
- #if HAVE_SYS_PARAM_H
- # include <sys/param.h>
- #endif
- #if HAVE_SYS_SYSCTL_H
- # include <sys/sysctl.h>
- #endif
- #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
- # define WIN32_LEAN_AND_MEAN
- # include <windows.h>
- #endif
- #include "c-ctype.h"
- #define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
- static unsigned long
- num_processors_via_affinity_mask (void)
- {
-
- #if HAVE_PTHREAD_GETAFFINITY_NP && defined __GLIBC__ && 0
- {
- cpu_set_t set;
- if (pthread_getaffinity_np (pthread_self (), sizeof (set), &set) == 0)
- {
- unsigned long count;
- # ifdef CPU_COUNT
-
- count = CPU_COUNT (&set);
- # else
- size_t i;
- count = 0;
- for (i = 0; i < CPU_SETSIZE; i++)
- if (CPU_ISSET (i, &set))
- count++;
- # endif
- if (count > 0)
- return count;
- }
- }
- #elif HAVE_PTHREAD_GETAFFINITY_NP && defined __NetBSD__ && 0
- {
- cpuset_t *set;
- set = cpuset_create ();
- if (set != NULL)
- {
- unsigned long count = 0;
- if (pthread_getaffinity_np (pthread_self (), cpuset_size (set), set)
- == 0)
- {
- cpuid_t i;
- for (i = 0;; i++)
- {
- int ret = cpuset_isset (i, set);
- if (ret < 0)
- break;
- if (ret > 0)
- count++;
- }
- }
- cpuset_destroy (set);
- if (count > 0)
- return count;
- }
- }
- #elif HAVE_SCHED_GETAFFINITY_LIKE_GLIBC
- {
- cpu_set_t set;
- if (sched_getaffinity (0, sizeof (set), &set) == 0)
- {
- unsigned long count;
- # ifdef CPU_COUNT
-
- count = CPU_COUNT (&set);
- # else
- size_t i;
- count = 0;
- for (i = 0; i < CPU_SETSIZE; i++)
- if (CPU_ISSET (i, &set))
- count++;
- # endif
- if (count > 0)
- return count;
- }
- }
- #elif HAVE_SCHED_GETAFFINITY_NP
- {
- cpuset_t *set;
- set = cpuset_create ();
- if (set != NULL)
- {
- unsigned long count = 0;
- if (sched_getaffinity_np (getpid (), cpuset_size (set), set) == 0)
- {
- cpuid_t i;
- for (i = 0;; i++)
- {
- int ret = cpuset_isset (i, set);
- if (ret < 0)
- break;
- if (ret > 0)
- count++;
- }
- }
- cpuset_destroy (set);
- if (count > 0)
- return count;
- }
- }
- #endif
- #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
- {
- DWORD_PTR process_mask;
- DWORD_PTR system_mask;
- if (GetProcessAffinityMask (GetCurrentProcess (),
- &process_mask, &system_mask))
- {
- DWORD_PTR mask = process_mask;
- unsigned long count = 0;
- for (; mask != 0; mask = mask >> 1)
- if (mask & 1)
- count++;
- if (count > 0)
- return count;
- }
- }
- #endif
- return 0;
- }
- unsigned long int
- num_processors (enum nproc_query query)
- {
- if (query == NPROC_CURRENT_OVERRIDABLE)
- {
-
- const char *envvalue = getenv ("OMP_NUM_THREADS");
- if (envvalue != NULL)
- {
- while (*envvalue != '\0' && c_isspace (*envvalue))
- envvalue++;
-
- if (c_isdigit (*envvalue))
- {
- char *endptr = NULL;
- unsigned long int value = strtoul (envvalue, &endptr, 10);
- if (endptr != NULL)
- {
- while (*endptr != '\0' && c_isspace (*endptr))
- endptr++;
- if (*endptr == '\0')
- return (value > 0 ? value : 1);
- }
- }
- }
- query = NPROC_CURRENT;
- }
-
-
- if (query == NPROC_CURRENT)
- {
-
- {
- unsigned long nprocs = num_processors_via_affinity_mask ();
- if (nprocs > 0)
- return nprocs;
- }
- #if defined _SC_NPROCESSORS_ONLN
- {
- long int nprocs = sysconf (_SC_NPROCESSORS_ONLN);
- if (nprocs > 0)
- return nprocs;
- }
- #endif
- }
- else
- {
- #if defined _SC_NPROCESSORS_CONF
- {
- long int nprocs = sysconf (_SC_NPROCESSORS_CONF);
- # if __GLIBC__ >= 2 && defined __linux__
-
- if (nprocs == 1)
- {
- unsigned long nprocs_current = num_processors_via_affinity_mask ();
- if (nprocs_current > 0)
- nprocs = nprocs_current;
- }
- # endif
- if (nprocs > 0)
- return nprocs;
- }
- #endif
- }
- #if HAVE_PSTAT_GETDYNAMIC
- {
- struct pst_dynamic psd;
- if (pstat_getdynamic (&psd, sizeof psd, 1, 0) >= 0)
- {
-
- if (query == NPROC_CURRENT)
- {
- if (psd.psd_proc_cnt > 0)
- return psd.psd_proc_cnt;
- }
- else
- {
- if (psd.psd_max_proc_cnt > 0)
- return psd.psd_max_proc_cnt;
- }
- }
- }
- #endif
- #if HAVE_SYSMP && defined MP_NAPROCS && defined MP_NPROCS
- {
-
- int nprocs =
- sysmp (query == NPROC_CURRENT && getpid () != 0
- ? MP_NAPROCS
- : MP_NPROCS);
- if (nprocs > 0)
- return nprocs;
- }
- #endif
-
- #if HAVE_SYSCTL && defined HW_NCPU
- {
- int nprocs;
- size_t len = sizeof (nprocs);
- static int mib[2] = { CTL_HW, HW_NCPU };
- if (sysctl (mib, ARRAY_SIZE (mib), &nprocs, &len, NULL, 0) == 0
- && len == sizeof (nprocs)
- && 0 < nprocs)
- return nprocs;
- }
- #endif
- #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
- {
- SYSTEM_INFO system_info;
- GetSystemInfo (&system_info);
- if (0 < system_info.dwNumberOfProcessors)
- return system_info.dwNumberOfProcessors;
- }
- #endif
- return 1;
- }
|