2010-04-22 5 views
13

Sto scrivendo una piccola applicazione C che utilizza alcuni thread per l'elaborazione dei dati. Voglio essere in grado di conoscere il numero di processori su una determinata macchina, senza utilizzare system() & in combinazione con un piccolo script.Come posso recuperare il numero di processori su C/Linux?

L'unico modo in cui posso pensare è di analizzare /proc/cpuinfo. Qualche altro suggerimento utile?

+6

Quasi una rigorosa sottoinsieme di questa domanda: http://stackoverflow.com/questions/150355/programmatically-find-the-number -di-core-on-a-machine (la risposta più alta ha un linux-linux). Quella domanda in realtà dice C++, ma la risposta è anche C. –

+0

Infatti, grazie per il tuo feedback Steve, ma quale è considerato l'approccio più portabile nel "POSIX World", se posso chiamarlo in questo modo? –

+3

Non sicuro. Linux supporta _SC_NPROCESSORS_ONLN, ma non è richiesto da POSIX. Supponendo che un'altra risposta sia buona, il fatto che usi un meccanismo completamente diverso e non POSIX su BSD suggerisce che non esiste una semplice risposta portatile POSIX. Inoltre, ho trovato un avviso online che _SC_NPROCESSORS_ONLN restituisce 1 invece di -1 per "Non so", che non è buono se è ancora vero. –

risposta

4
machine:/sys/devices/system/cpu$ ls 
cpu0 cpu3 cpu6  kernel_max perf_counters sched_mc_power_savings 
cpu1 cpu4 cpu7  offline  possible 
cpu2 cpu5 cpuidle online  present 

Se si dispone di una macchina con sysfs, date un'occhiata in/sys/devices/system/cpu.

Assicurati che stai chiedendo ciò che si vuole - CPU, nuclei, hyperthreads, ecc

3

Il seguente è stato il codice che ho usato per calcolare il numero di core ..... potrebbe aiutarti

//Finding the number of cores(logical processor) using cpuid instruction..... 
    __asm 
    { 
     mov eax,01h //01h is for getting number of cores present in the processor 
     cpuid 
     mov t,ebx 
    } 

(t >> 16) & 0xFF contiene i nuclei numero ........

Credo che questo potrebbe aiutare a http://lists.gnu.org/archive/html/autoconf/2002-08/msg00126.html

+0

Questo non è portabile e non si compila con gcc. – fuz

0
#include <stdio.h> 

void getPSN(char *PSN) 
{int varEAX, varEBX, varECX, varEDX; 
    char str[9]; 
    //%eax=1 gives most significant 32 bits in eax 
    __asm__ __volatile__ ("cpuid": "=a" (varEAX), "=b" (varEBX), "=c" (varECX), "=d" (varEDX) : "a" (1)); 
    sprintf(str, "%08X", varEAX); //i.e. XXXX-XXXX-xxxx-xxxx-xxxx-xxxx 
    sprintf(PSN, "%C%C%C%C-%C%C%C%C", str[0], str[1], str[2], str[3], str[4], str[5], str[6], str[7]); 
    //%eax=3 gives least significant 64 bits in edx and ecx [if PN is enabled] 
    __asm__ __volatile__ ("cpuid": "=a" (varEAX), "=b" (varEBX), "=c" (varECX), "=d" (varEDX) : "a" (3)); 
    sprintf(str, "%08X", varEDX); //i.e. xxxx-xxxx-XXXX-XXXX-xxxx-xxxx 
    sprintf(PSN, "%s-%C%C%C%C-%C%C%C%C", PSN, str[0], str[1], str[2], str[3], str[4], str[5], str[6], str[7]); 
    sprintf(str, "%08X", varECX); //i.e. xxxx-xxxx-xxxx-xxxx-XXXX-XXXX 
    sprintf(PSN, "%s-%C%C%C%C-%C%C%C%C", PSN, str[0], str[1], str[2], str[3], str[4], str[5], str[6], str[7]); 
} 

int main() 
{ 
    char PSN[30]; //24 Hex digits, 5 '-' separators, and a '\0' 
    getPSN(PSN); 
    printf("%s\n", PSN); //compare with: lshw | grep serial: 
    return 0; 
} 
8

Come altri hanno già detto nei commenti, this risposta è utile:

numCPU = sysconf(_SC_NPROCESSORS_ONLN); 

Lasciando come una soluzione per le persone che potrebbero saltare oltre commenti ...

+0

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

6

Perché non utilizzare sys/sysinfo.h ?

#include <sys/sysinfo.h> 
#include <stdio.h> 
void main() { 
    printf ("You have %d processors.\n", get_nprocs()); 
} 

Way ulteriori informazioni possono essere trovate sulla pagina man

$ man 3 get_nprocs 
+1

"Queste funzioni sono estensioni GNU" in base a tale pagina man. La domanda riguardava C/Linux in generale (che non sempre usa glibc), e idealmente POSIX. – Jesin