如何使用c编程获取linux上的内核数量?

时间:2015-07-14 09:36:55

标签: c linux cpu

我知道如何获取C中的逻辑核心数。

sysconf(_SC_NPROCESSORS_CONF);

这将在我的i3处理器上返回4。但实际上i3中只有2个核心。

如何获得物理核心数?

3 个答案:

答案 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