2010-04-22 13 views
13

Estoy escribiendo una pequeña aplicación en C que utiliza algunos subprocesos para procesar datos. Quiero saber la cantidad de procesadores en una determinada máquina, sin usar system() & en combinación con una pequeña secuencia de comandos.¿Cómo recupero la cantidad de procesadores en C/Linux?

La única forma en que puedo pensar es analizar /proc/cpuinfo. ¿Alguna otra sugerencia útil?

+6

Casi un subconjunto estricto de esta pregunta: http://stackoverflow.com/questions/150355/programmatically-find-the-number -of-cores-on-a-machine (la respuesta principal tiene un linux one-liner). Esa pregunta realmente dice C++, pero la respuesta es C también. –

+0

De hecho, gracias por sus comentarios Steve, pero ¿cuál es considerado el enfoque más portátil en el "mundo POSIX", si puedo llamarlo de esta manera? –

+3

No estoy seguro. Linux admite _SC_NPROCESSORS_ONLN, pero no es un mandato de POSIX. Suponiendo que otra respuesta es buena, el hecho de que utiliza un mecanismo completamente diferente y no POSIX en BSD sugiere que no hay una respuesta simple POSIX portátil. Además, encontré una advertencia en línea que _SC_NPROCESSORS_ONLN devuelve 1 en lugar de -1 para "No sé", que no es bueno si sigue siendo cierto. –

Respuesta

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 

Si tiene una máquina con sysfs, eche un vistazo a/sys/devices/system/cpu.

Asegúrese de que está pidiendo lo que quiere - CPU, núcleos, hyperthreads, etc.

3

El siguiente era el código que he utilizado para calcular el número de núcleos ..... que podría ayudarle

//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 los núcleos número ........

supongo que esto podría ayudarle a http://lists.gnu.org/archive/html/autoconf/2002-08/msg00126.html

+0

Eso no es portátil y no se 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

Como otros han mencionado en los comentarios, this respuesta es útil:

numCPU = sysconf(_SC_NPROCESSORS_ONLN); 

Dejando como una solución para las personas que podrían saltar por los comentarios ...

+0

Buena solución, pero parece una extensión de Linux para POSIX: http://pubs.opengroup.org/onlinepubs/9699919799/functions/sysconf.html –

6

Por qué no usar sys/sysinfo.h ?

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

camino más información se puede encontrar en la página del manual

$ man 3 get_nprocs 
+1

"Estas funciones son extensiones de GNU" de acuerdo con esa página de manual. La pregunta era sobre C/Linux en general (que no siempre usa glibc), e idealmente POSIX. – Jesin

Cuestiones relacionadas