在Linux中获取物理CPU数量。解析/ proc / cpuinfo

时间:2014-03-27 09:38:34

标签: c linux

我正在考虑使用C在Linux中获取物理CPU。我知道,我可以简单地执行此操作:

if(!(cpus = popen("cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
", "r")))
{
    // ...
}

但这不重要,当我没有安装grep时它就不会工作。我提出了另一个想法:

  1. 只需解析/proc/cpuinfo
  2. 计算物理ID的数量:

    if(sscanf(buff, "physical id     : %d", &physicalID) == 1)
        i++;
    
  3. 将它们保存到一个数组中:

    if(sscanf(buff, "physical id     : %d", &physicalID) == 1)
    {
        ids[i] = physicalID;
        i ++;
    }
    
  4. 检查数组中是否有不同的数字,如果是,请计算它们=它会给我一些物理套接字(CPU),对吧?

  5. 我做到了,但我不确定它是否永远是真的......那么如何管理内核,逻辑CPU并检查是否启用了超线程?如何使用/proc/cpuinfo

    执行此操作

2 个答案:

答案 0 :(得分:1)

lscpu返回了很多非常有用的关于cpus,套接字数量,内核数量,每个内核的线程数量(可以让你确定是否启用了高速缓存)的东西。 不知道它如何为ARM cpus等 HTH

答案 1 :(得分:0)

您的理解是正确的,但是您可能想要引用这个优秀的article 详细介绍了这个概念。

在旁注(正如你的问题提到只有C),C ++ 11标准在线程库中引入了一个优秀的API。它返回了硬件线程上下文的数量。它隐藏了所有上述信息(超线程,物理ID,逻辑ID)和所有信息,并提供相关信息。最重要的是它现在是标准的,所以这确保了可移植性。

#include<thread>
#include<iostream>
int main() {
    int ncore = std::thread::hardware_concurrency();
    std::cout<<"Number Of Core:"<<ncore<<std::endl;
}