我知道如何获取C中的逻辑核心数。
sysconf(_SC_NPROCESSORS_CONF);
这将在我的i3处理器上返回4。但实际上i3中只有2个核心。
如何获得物理核心数?
答案 0 :(得分:5)
这是使用libcpuid的C解决方案。
cores.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;
}
这是一个使用Boost的C ++解决方案。
cores.cpp:
// use boost to get number of cores on the processor
// compile with : g++ -o cores cores.cpp -lboost_system -lboost_thread
#include <iostream>
#include <boost/thread.hpp>
int main ()
{
std::cout << "No. of Physical Core(s) : " << boost::thread::physical_concurrency() << std::endl;
std::cout << "No. of Logical Core(s) : " << boost::thread::hardware_concurrency() << std::endl;
return 0;
}
在我的桌面(i5 2310)上,它返回:
No. of Physical Core(s) : 4
No. of Logical Core(s) : 4
在我的笔记本电脑上(i5 480M):
No. of Physical Core(s) : 2
No. of Logical Core(s) : 4
意味着我的笔记本电脑处理器具有超线程技术
答案 1 :(得分:1)
您可能只是阅读并解析/proc/cpuinfo
伪文件(有关详细信息,请参阅proc(5);将该伪文件作为文本文件打开并逐行读取;在终端中尝试cat /proc/cpuinfo
。
优点是您只是解析(特定于Linux的)文本[伪]文件(不需要任何外部库,如Gengisdave's answer),缺点是您需要解析它(不是一个大问题,在循环中读取带有fgets
的80字节行,然后使用sscanf
并测试扫描的项目数....)
ht
行中flags:
的存在意味着您的CPU有hyper-threading。 CPU线程数由processor:
行数给出。物理核心的实际数量由cpu cores:
给出(所有这些都使用我机器上的4.1内核)。
我不确定您是否正确想要了解您拥有多少个物理核心。超线程可能实际上是有用的。你需要进行基准测试。
您可能在应用程序中使用用户使工作线程数(例如,线程池的大小) > -configurable 即可。即使在4核超线程处理器上,我也可能希望不超过3个正在运行的线程(因为我想将其他线程用于其他线程)。
答案 2 :(得分:1)
没有任何库:
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