66 votes

Obtenir le nombre de Processeurs sous Linux à l'aide de C

Est-il une API pour obtenir le nombre de Processeurs disponibles sous Linux? Je veux dire, sans l'aide de /proc/cpuinfo ou de tout autre sys-node du fichier...

J'ai trouvé cette mise en œuvre à l'aide de 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;
}

Mais, n'est-ce pas là quelque chose de plus niveau supérieur à l'aide de bibliothèques communes? Merci...

84voto

chrisaycock Points 12900
#include <unistd.h>
sysconf(_SC_NPROCESSORS_ONLN);

20voto

Vikram.exe Points 2602

Ce code devrait fonctionner sur les deux plateformes windows et *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
}

13voto

R.. Points 93718

À l'aide de /proc/cpuinfo est le plus propre et le plus portable de solution. Dans le cas où l'ouverture échoue, vous pourriez vous contenter de supposer 1 cpu ou 2 processeurs). Un Code qui dépend de connaître le nombre de processeurs dans un but autre que de la micro-optimisation (par exemple, en choisissant le nombre idéal d'exécution des threads) est presque sûrement quelque chose de stupide.

L' _SC_NPROCESSORS_ONLN solution dépend d'un non-standard (glibc-spécifique) sysconf d'extension, qui est beaucoup plus grande dépendance par rapport /proc (tous les systèmes Linux ont /proc, mais certains ont des non-glibc libcs ou des anciennes versions de la glibc qui manque _SC_NPROCESSORS_ONLN).

11voto

RCL Points 61

sched_affinity() version que vous mentionnez dans le début est toujours mieux que d' /proc/cpuinfo et/ou _SC_NPROCESSORS_ONLN car il ne prend en compte que les Processeurs disponibles pour un processus donné (certains peuvent être désactivés en sched_setaffinity() invoquée par un processus extérieur). Le seul changement serait l'aide d' CPU_COUNT() au lieu de faire CPU_ISSET dans une boucle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X