2011-01-03 11 views
38

Gibt es eine API, um die Anzahl der verfügbaren CPUs in Linux zu erhalten? ich meine, ohne die Verwendung von/proc/cpuinfo oder andere sys-Knoten-Datei ...Erhalten Sie die Anzahl der CPUs in Linux mit C

Ich habe diese Implementierung mit sched.h gefunden:

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; 
} 

Aber ist nicht etwas mehr höhere Ebene mit gemeinsamen Bibliotheken?

+22

Warum Menschen sind so Angst proc/zu benutzen? Jede Linux-Box, die ich in den letzten 15 Jahren gesehen habe, hat sie, sie ist immer auf dem neuesten Stand mit dem, was der Kernel weiß, und das Format der vorhandenen Sachen ändert sich nicht viel. – cHao

+1

Ich finde es großartig, dass du versuchst, verschiedene Wege zu lernen, aber versuchst du das Rad neu zu erfinden? – Davidann

+0

mögliche Duplikate von [Wie erhalte ich die Anzahl der Prozessoren auf C/Linux?] (Http://stackoverflow.com/questions/2693948/how-do-i-retrieve-the-number-of-processors-on-- c-linux) –

Antwort

2
#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; 
} 

https://linux.die.net/man/3/get_nprocs

65
#include <unistd.h> 
sysconf(_SC_NPROCESSORS_ONLN); 
+1

Plus: funktioniert unter Mac OSX. –

+1

Gute Lösung, aber scheint wie eine Linux-Erweiterung zu POSIX: http://pubs.opengroup.org/onlinepubs/9699919799/functions/sysconf.html –

+1

Plus: funktioniert auf Cygwin – zhangyoufu

15

Mit /proc/cpuinfo ist die sauberste und portabelste Lösung. Falls das Öffnen fehlschlägt, können Sie einfach 1 CPU oder 2 CPUs annehmen. Ein Code, der davon abhängt, die Anzahl von CPUs zu einem anderen Zweck als der Mikrooptimierung zu kennen (z. B. das Wählen der idealen Anzahl von Threads zum Ausführen), macht fast sicher etwas Dummes.

Die _SC_NPROCESSORS_ONLN Lösung hängt von einem Nicht-Standard (glibc spezifisch) sysconf Erweiterung, die eine viel größere Abhängigkeit ist als /proc (alle Linux-Systeme haben /proc, aber einige haben nicht-glibc libcs ​​oder ältere Versionen von glibc, die fehlen _SC_NPROCESSORS_ONLN).

+11

+1 Der OP schien unnachgiebig zu sein, sich selbst aufzuhängen, also gab ich ihm nur das Seil. – chrisaycock

+3

Ich glaube Ulrich Drepper hat ihm das Seil gegeben. Ich verstehe wirklich nicht die Motivation für das Hinzufügen von Nicht-Standard-Dinge wie diese, wenn es eine vorhandene, viel sauberer und viel portabler Weg, um das Gleiche zu tun ist. (Wenn Sie '_SC_NPROCESSORS_ONLN' in Ihr Programm schreiben, wird es nicht kompilieren, wenn die Konstante fehlt, aber die anderen Möglichkeiten scheitern nur zur Laufzeit (fehlgeschlagen' open', etc.) und jeder normale Code würde die Fehlerbedingung behandeln.) –

+8

Wie ist/proc/cpuinfo portierbar? Dies ist eine Linux-spezifische Schnittstelle (einige andere Systeme emulieren sie, zum Beispiel FreeBSD mit dem in/proc eingebundenen Dateisystem linprocfs).Das sysconfig _SC_NPROCESSORS_ONLN zum Beispiel wird von FreeBSD unterstützt. – MarkR

14

Dieser Code (gezeichnet von here) sollte sowohl auf Windows als auch auf * NIX-Plattformen funktionieren.

#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 
} 
+0

Ich habe diesen Code eine lange Zeit zurück von jemandem (erinnere mich nicht an den Namen). –

+2

Ich bin nicht sicher, dass das Posten dieses Codeausschnitts wirklich die Frage des OP beantwortet, obwohl sie einige nützliche Informationen daraus rekonstruieren könnten. – MarkR

+1

Ich stimme MarkR zu. chrisaycock bietet eine knappe Antwort. – poindexter

9

sched_affinity() Version am Anfang erwähnen ist noch besser als /proc/cpuinfo und/oder _SC_NPROCESSORS_ONLN, da es nur CPUs für einen bestimmten Prozess zählt (einige können von einem externen Prozess aufgerufen durch sched_setaffinity() deaktiviert werden). Die einzige Änderung wäre die Verwendung von CPU_COUNT() anstelle von CPU_ISSET in einer Schleife.

0

Eine andere Methode Scan-cpu * Verzeichnisse unter sys-Dateisystem:

#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; 
} 
Verwandte Themen