2011-01-03 16 views
38

Esiste un'API per ottenere il numero di CPU disponibili in Linux? Voglio dire, senza l'utilizzo di/proc/cpuinfo o qualsiasi altro file sys-node ...Ottieni il numero di CPU in Linux utilizzando C

ho trovato questa implementazione utilizza 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; 
} 

Ma, non c'è nulla di più livello più alto usando le librerie comuni?

+22

Perché la gente è così paura di usare/proc? Ogni box Linux che ho visto negli ultimi 15 anni ce l'ha, è sempre aggiornato con ciò che il kernel conosce, e il formato delle cose esistenti in esso non cambia molto. – cHao

+1

Penso che sia bello che tu stia cercando di imparare diversi modi di fare le cose, ma stai cercando di reinventare la ruota? – Davidann

+0

possibile duplicato di [Come recuperare il numero di processori su C/Linux?] (Http://stackoverflow.com/questions/2693948/how-do-i-retrieve-the-number-of-processors-on- c-linux) –

risposta

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: funziona su Mac OSX. –

+1

Buona soluzione, ma sembra un'estensione Linux per POSIX: http://pubs.opengroup.org/onlinepubs/9699919799/functions/sysconf.html –

+1

Plus: funziona su Cygwin – zhangyoufu

15

L'utilizzo di /proc/cpuinfo è la soluzione più pulita e portatile. Nel caso in cui l'open fallisce, potresti semplicemente assumere 1 CPU o 2 CPU. Il codice che dipende dal conoscere il numero di cpus per uno scopo diverso dalla micro-ottimizzazione (ad esempio scegliere il numero ideale di thread da eseguire) sta quasi sicuramente facendo qualcosa di stupido.

La soluzione _SC_NPROCESSORS_ONLN dipende da un non-standard (glibc-specifico) sysconf estensione, che è una dipendenza molto più grande di /proc (tutti i sistemi Linux hanno /proc, ma alcuni hanno libc non glibc o vecchie versioni di glibc che mancano _SC_NPROCESSORS_ONLN).

+11

+1 Il PO sembrava irremovibile per impiccarsi, quindi gli ho dato la corda. – chrisaycock

+3

Penso che Ulrich Drepper gli abbia dato la corda. Non capisco davvero la motivazione per l'aggiunta di cose non standard come questa quando c'è un modo esistente, molto più pulito e molto più portatile per fare la stessa cosa. (Se scrivi '_SC_NPROCESSORS_ONLN' nel tuo programma, non riuscirà a compilare se la costante è mancante, ma gli altri modi falliscono solo in fase di esecuzione (non riuscito' open', ecc.) E qualsiasi codice sano gestirà la condizione di errore.) –

+8

In che modo/proc/cpuinfo è portatile? Questa è un'interfaccia specifica per Linux (alcuni altri sistemi lo emulano, ad esempio FreeBSD con il filesystem linprocfs montato in/proc).il sysconfig _SC_NPROCESSORS_ONLN, ad esempio, è supportato da FreeBSD. – MarkR

14

Questo codice (tratto da here) dovrebbe funzionare su entrambe le piattaforme Windows e * 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 
} 
+0

Ho ricevuto questo codice da molto tempo (non ricordo il nome). –

+2

Non sono sicuro che la pubblicazione di questo snippet di codice risponda davvero alla domanda dell'OP, sebbene possano invertire alcune utili informazioni. – MarkR

+1

Sono d'accordo con MarkR. chrisaycock fornisce una risposta succinta. – poindexter

9

sched_affinity() versione si parla in principio è ancora meglio di /proc/cpuinfo e/o _SC_NPROCESSORS_ONLN dal momento che conta solo CPU disponibili per un dato processo (alcuni possono essere disabilitate da sched_setaffinity() invocata da un processo esterno). L'unico cambiamento sarebbe utilizzare CPU_COUNT() invece di fare CPU_ISSET in un ciclo.

0

Un altro metodo di scansione della CPU * directory sotto sistema di file 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; 
} 
Problemi correlati