Подтвердить что ты не робот

Как получить количество процессоров на C/Linux?

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

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

4b9b3361

Ответ 1

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

numCPU = sysconf( _SC_NPROCESSORS_ONLN );

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

Ответ 2

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

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

Путь дополнительной информации можно найти на странице руководства

$ man 3 get_nprocs

Ответ 3

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.

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

Ответ 4

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

//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

Ответ 5

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