我正在考虑使用C在Linux中获取物理CPU。我知道,我可以简单地执行此操作:
if(!(cpus = popen("cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
", "r")))
{
// ...
}
但这不重要,当我没有安装grep
时它就不会工作。我提出了另一个想法:
/proc/cpuinfo
计算物理ID的数量:
if(sscanf(buff, "physical id : %d", &physicalID) == 1)
i++;
将它们保存到一个数组中:
if(sscanf(buff, "physical id : %d", &physicalID) == 1)
{
ids[i] = physicalID;
i ++;
}
检查数组中是否有不同的数字,如果是,请计算它们=它会给我一些物理套接字(CPU),对吧?
我做到了,但我不确定它是否永远是真的......那么如何管理内核,逻辑CPU并检查是否启用了超线程?如何使用/proc/cpuinfo
?
答案 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;
}