uso - ¿Cómo obtener la cantidad de CPU en Linux usando C?
ver caracteristicas de mi pc linux centos (6)
¿Hay una API para obtener la cantidad de CPU disponibles en Linux? Quiero decir, sin usar / proc / cpuinfo o cualquier otro archivo de sistema de nodo ...
Encontré esta implementación usando sched.h:
int GetCPUCount()
{
cpu_set_t cs;
CPU_ZERO(&cs);
sched_getaffinity(0, sizeof(cs), &cs);
int count = 0;
for (int i = 0; i < 8; i++)
{
if (CPU_ISSET(i, &cs))
count++;
}
return count;
}
Pero, ¿no hay algo más de nivel superior utilizando bibliotecas comunes?
Este código (extraído de here ) debería funcionar tanto en plataformas Windows como * NIX.
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#else
#include <unistd.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main() {
long nprocs = -1;
long nprocs_max = -1;
#ifdef _WIN32
#ifndef _SC_NPROCESSORS_ONLN
SYSTEM_INFO info;
GetSystemInfo(&info);
#define sysconf(a) info.dwNumberOfProcessors
#define _SC_NPROCESSORS_ONLN
#endif
#endif
#ifdef _SC_NPROCESSORS_ONLN
nprocs = sysconf(_SC_NPROCESSORS_ONLN);
if (nprocs < 1)
{
fprintf(stderr, "Could not determine number of CPUs online:/n%s/n",
strerror (errno));
exit (EXIT_FAILURE);
}
nprocs_max = sysconf(_SC_NPROCESSORS_CONF);
if (nprocs_max < 1)
{
fprintf(stderr, "Could not determine number of CPUs configured:/n%s/n",
strerror (errno));
exit (EXIT_FAILURE);
}
printf ("%ld of %ld processors online/n",nprocs, nprocs_max);
exit (EXIT_SUCCESS);
#else
fprintf(stderr, "Could not determine number of CPUs");
exit (EXIT_FAILURE);
#endif
}
Otro método para escanear los directorios de cpu * en el sistema de archivos sys:
#include<stdio.h>
#include <dirent.h>
#include <errno.h>
#define LINUX_SYS_CPU_DIRECTORY "/sys/devices/system/cpu"
int main() {
int cpu_count = 0;
DIR *sys_cpu_dir = opendir(LINUX_SYS_CPU_DIRECTORY);
if (sys_cpu_dir == NULL) {
int err = errno;
printf("Cannot open %s directory, error (%d)./n", LINUX_SYS_CPU_DIRECTORY, strerror(err));
return -1;
}
const struct dirent *cpu_dir;
while((cpu_dir = readdir(sys_cpu_dir)) != NULL) {
if (fnmatch("cpu[0-9]*", cpu_dir->d_name, 0) != 0)
{
/* Skip the file which does not represent a CPU */
continue;
}
cpu_count++;
}
printf("CPU count: %d/n", cpu_count);
return 0;
}
Usar /proc/cpuinfo
es la solución más limpia y portátil. En caso de que la apertura falla, simplemente podría asumir 1 CPU o 2 CPU. El código que depende de conocer el número de CPU para un fin distinto a la micro-optimización (por ejemplo, elegir el número ideal de hilos para ejecutar) es casi seguro que está haciendo algo tonto.
La solución _SC_NPROCESSORS_ONLN
depende de una extensión sysconf
no estándar (glibc-specific), que es una dependencia mucho mayor que /proc
(todos los sistemas Linux tienen /proc
, pero algunos tienen libcs que no son glibc o versiones anteriores de glibc que carecen de _SC_NPROCESSORS_ONLN
) .
sched_affinity()
versión de sched_affinity()
que mencionas al principio es aún mejor que /proc/cpuinfo
y / o _SC_NPROCESSORS_ONLN
ya que solo cuenta las CPU disponibles para un proceso dado (algunas pueden ser desactivadas por sched_setaffinity()
invocadas por un proceso externo). El único cambio sería usar CPU_COUNT()
lugar de hacer CPU_ISSET
en un bucle.
#include <unistd.h>
sysconf(_SC_NPROCESSORS_ONLN);
#include <stdio.h>
#include <sys/sysinfo.h>
int
int main(int argc, char *argv[])
{
printf("This system has %d processors configured and "
"%d processors available./n",
get_nprocs_conf(), get_nprocs());
return 0;
}