假设Linux,并假设当前的shell 启动时可能受到taskset的限制,我可以编写一些代码来获取当前进程亲和力,如下所示
#include <vector>
#include <pthread.h>
#include <stdio.h>
int getNumberOfAvailableCores() {
pthread_t self = pthread_self();
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
int res = ::pthread_getaffinity_np(self, sizeof(cpuset), &cpuset);
int num_cores = 0;
if ( res!=0 ) return -1;
for (int j = 0; j < CPU_SETSIZE; j++) {
if (CPU_ISSET(j, &cpuset)) ++num_cores;
}
return num_cores;
}
int main() {
int num_cores = getNumberOfAvailableCores();
printf( "%d\n", num_cores );
return 0;
}
https://godbolt.org/z/TxT67WWT6个
但在我甚至没有安装编译器的机器上,有没有办法猜测可用内核的数量?
getconf _NPROCESSORS_ONLN
将返回在线处理器的数量,但不会考虑隔离的核心数量.GREG /proc/cpuinfo
或lscpu
也是如此.
我调查了/proc/self
个,但找不到一个干净利落的方法.