如何使用c编程获得linux上的内核数?
我知道如何获得C语言中逻辑核的数量如何使用c编程获得linux上的内核数?,c,linux,cpu,C,Linux,Cpu,我知道如何获得C语言中逻辑核的数量 sysconf(_SC_NPROCESSORS_CONF); 这将在我的i3处理器上返回4。但实际上i3中只有两个内核 如何获取物理核心计数?这是一个使用C的解决方案 核心c: #include <stdio.h> #include <libcpuid.h> int main(void) { struct cpu_raw_data_t raw; struct cpu_id_t data; cpuid_get
sysconf(_SC_NPROCESSORS_CONF);
这将在我的i3处理器上返回4。但实际上i3中只有两个内核
如何获取物理核心计数?这是一个使用C的解决方案 核心c:
#include <stdio.h>
#include <libcpuid.h>
int main(void)
{
struct cpu_raw_data_t raw;
struct cpu_id_t data;
cpuid_get_raw_data(&raw);
cpu_identify(&raw, &data);
printf("No. of Physical Core(s) : %d\n", data.num_cores);
return 0;
}
在我的笔记本电脑(i5 480M)上时:
这意味着我的笔记本电脑处理器具有超线程技术您可以简单地读取和解析
/proc/cpuinfo
伪文件(有关详细信息,请参阅;将该伪文件作为文本文件打开,并逐行顺序读取;在终端中尝试cat/proc/cpuinfo
)
优点是您只需解析(Linux特定的)文本[pseudo-]文件(不需要任何外部库,如中),缺点是您需要解析它(没什么大不了的,在循环中使用fgets
读取80字节行,然后使用sscanf
并测试扫描的项目计数……)
flags:
行中的ht
存在表示您的CPU具有。CPU线程数由处理器:
行数给出。物理内核的实际数量由cpu内核给出:
(所有这些都使用我机器上的4.1内核)
我不确定你想了解你有多少物理核心是对的。超线程实际上可能很有用。您需要进行基准测试
您可能应该让应用程序中的工作线程数(例如线程池的大小)可以由用户配置。即使在4核超线程处理器上,我也可能希望运行的线程不超过3个(因为我想将其他线程用于其他用途)。没有任何库:
int main()
{
unsigned int eax=11,ebx=0,ecx=1,edx=0;
asm volatile("cpuid"
: "=a" (eax),
"=b" (ebx),
"=c" (ecx),
"=d" (edx)
: "0" (eax), "2" (ecx)
: );
printf("Cores: %d\nThreads: %d\nActual thread: %d\n",eax,ebx,edx);
}
输出:
Cores: 4
Threads: 8
Actual thread: 1
处理器代码是什么?许多Intel每个物理层有2个逻辑核。你可以有更多关于英特尔的信息spreadsheet@gengisdave有没有一种方法可以在C语言中得到物理核的数量?我不知道C的解决方案,在C++中,你可以使用<代码> Boo::To::不是物理内核。boost有两种方法,在C中,您必须解析
/proc/cpuinfo
(cpu内核:
行)或使用libcpuidthanks作为解决方案。。。。我只是一个初学者,你能告诉我如何将这个libcpuid集成到c中吗。我在Ubuntu上使用Xcode IDE,似乎没有Ubuntu/debian的软件包;如果有软件包,您可以使用apt cache search libcpuid进行搜索(您也需要-dev软件包);否则,您可以从源代码处编译它(有关说明,请参阅)
No. of Physical Core(s) : 2
No. of Logical Core(s) : 4
int main()
{
unsigned int eax=11,ebx=0,ecx=1,edx=0;
asm volatile("cpuid"
: "=a" (eax),
"=b" (ebx),
"=c" (ecx),
"=d" (edx)
: "0" (eax), "2" (ecx)
: );
printf("Cores: %d\nThreads: %d\nActual thread: %d\n",eax,ebx,edx);
}
Cores: 4
Threads: 8
Actual thread: 1