Как мне узнать количество процессоров в C / Linux? - PullRequest
15 голосов
/ 22 апреля 2010

Я пишу небольшое приложение на C, которое использует несколько потоков для обработки данных. Я хочу знать количество процессоров на определенной машине без использования system () & в сочетании с небольшим скриптом.

Единственный способ, которым я могу придумать, - это проанализировать / proc / cpuinfo . Любые другие полезные предложения?

Ответы [ 5 ]

10 голосов
/ 13 марта 2014

Как уже упоминали другие в комментариях, этот ответ полезен:

numCPU = sysconf( _SC_NPROCESSORS_ONLN );

Оставляя в качестве решения для людей, которые могут пропустить комментарии ...

6 голосов
/ 11 февраля 2015

Почему бы не использовать sys / sysinfo.h?

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

Более подробную информацию можно найти на справочной странице

$ man 3 get_nprocs
4 голосов
/ 23 апреля 2010

Ниже был код, который я использовал для подсчета количества ядер ..... это может помочь вам

//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 содержит число ядер ........

Полагаю, это может вам помочь http://lists.gnu.org/archive/html/autoconf/2002-08/msg00126.html

4 голосов
/ 22 апреля 2010
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

Если у вас есть машина с sysfs, загляните в /sys/devices/system/cpu.

Убедитесь, что вы спрашиваете о том, что вы хотите - процессоры, ядра, гиперпотокии т. д.

0 голосов
/ 24 октября 2013
#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;
}
...