有没有一个API来获取Linux中可用的CPU数量?我的意思是,不使用/proc/cpuinfo或任何其他sys-node文件...
我发现这个实现使用sched.h:
int GetCPUCount()
{
cpu_set_t cs;
CPU_ZERO(&cs);
sched_getaffinity(0, sizeof(cs), &cs);
int count = 0;
for (int i = 0; i < 64; i++)
{
if (CPU_ISSET(i, &cs))
count++;
else
break;
}
return count;
}
但是,难道没有更高层次的使用公共库吗?
9条答案
按热度按时间kxeu7u2r1#
5uzkadbs2#
https://linux.die.net/man/3/get_nprocs
ncgqoxb03#
此代码(从here中提取)应能在Windows和 *NIX平台上运行。
emeijp434#
您在开头提到的
sched_affinity()
版本仍然比/proc/cpuinfo
和/或_SC_NPROCESSORS_ONLN
好,因为它只计算给定进程可用的CPU(某些CPU可能被外部进程调用的sched_setaffinity()
禁用)。唯一的变化是使用CPU_COUNT()
,而不是在循环中执行CPU_ISSET
。czq61nw15#
使用
/proc/cpuinfo
是最简洁、最可移植的解决方案。如果打开失败,你可以简单地假设1个cpu或2个cpu。为了微优化之外的目的(例如选择理想的线程数)而依赖于知道cpu数量的代码几乎肯定是在做一些愚蠢的事情。_SC_NPROCESSORS_ONLN
解决方案依赖于一个非标准的(glibc特定的)sysconf
扩展,这比/proc
的依赖性要大得多(所有的Linux系统都有/proc
,但有些系统有非glibc libcs或缺少_SC_NPROCESSORS_ONLN
的旧版本glibc)。zaqlnxep6#
个人针对最新英特尔CPU(一般不是x86,只是Intel)我使用
EAX=0Bh
cpuid
leaf。有关当前socket aka包中内核的详细信息,请参见Wikipedia。在多插槽系统上,这可能是系统范围内的物理/逻辑核数量的一半或四分之一。Intel在枚举CPU方面有a whitepaper,详细说明了在多插槽系统中要检查什么。此代码不执行此操作,它只检查一个子叶(ECX=1)。输出量:
或者,更简洁地说:
输出量:
koaltpgm7#
涉及
sysconf(...)
或get_nprocs()
的答案中没有一个是正确的,因为根据cpu关联性,处理器的数量限制为一个任务。您需要类似下面的内容来获取任务可用的处理器数:
d8tt03nd8#
在Linux(Ubuntu)上:
第一个
(假设当前进程具有默认的CPU关联。)
aamkag619#
扫描sys文件系统下cpu* 目录的另一种方法: