Ответ 1
Как уже упоминалось в комментариях, этот ответ полезен:
numCPU = sysconf( _SC_NPROCESSORS_ONLN );
Оставляя в качестве решения для людей, которые могут пропустить комментарии...
Я пишу небольшое приложение C, которое использует некоторые потоки для обработки данных. Я хочу знать количество процессоров на определенной машине, не используя system() и в сочетании с небольшим script.
Единственный способ, которым я могу думать, - разобрать /proc/cpuinfo. Любые другие полезные предложения?
Как уже упоминалось в комментариях, этот ответ полезен:
numCPU = sysconf( _SC_NPROCESSORS_ONLN );
Оставляя в качестве решения для людей, которые могут пропустить комментарии...
Почему бы не использовать sys/sysinfo.h?
#include <sys/sysinfo.h>
#include <stdio.h>
void main () {
printf ("You have %d processors.\n", get_nprocs ());
}
Путь дополнительной информации можно найти на странице руководства
$ man 3 get_nprocs
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.
Убедитесь, что вы запрашиваете то, что хотите - процессоры, ядра, гиперпотоки и т.д.
Ниже приведен код, который я использовал для вычисления количества ядер..... он может помочь вам
//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
#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;
}