以编程的方式查找计算机上的内核数量
以编程的方式查找计算机上的内核数量
有没有一种跨平台的方式来从C/C++中确定机器有多少个核心? 如果不存在这样的东西,那么在每个平台上确定它(Windows / * nix / Mac)呢?
admin 更改状态以发布 2023年5月21日
这个功能是 C++11 标准的一部分。
#includeunsigned int nthreads = std::thread::hardware_concurrency();
对于老的编译器,可以使用Boost.Thread库。
#includeunsigned int nthreads = boost::thread::hardware_concurrency();
无论哪种情况,hardware_concurrency()
返回硬件可以同时运行的线程数量,这取决于 CPU 核心数和超线程单元的数量。
C++11
#include//may return 0 when not able to detect const auto processor_count = std::thread::hardware_concurrency();
参考: std::thread::hardware_concurrency
在C++11之前,没有便携的方法。相反,您需要使用以下一种或多种方法(由适当的 #ifdef
行保护):
-
Win32
SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo); int numCPU = sysinfo.dwNumberOfProcessors;
-
Linux、Solaris、AIX和Mac OS X >=10.4(即Tiger onwards)
int numCPU = sysconf(_SC_NPROCESSORS_ONLN);
-
FreeBSD、MacOS X、NetBSD、OpenBSD等
int mib[4]; int numCPU; std::size_t len = sizeof(numCPU); /* set the mib for hw.ncpu */ mib[0] = CTL_HW; mib[1] = HW_AVAILCPU; // alternatively, try HW_NCPU; /* get the number of CPUs from the system */ sysctl(mib, 2, &numCPU, &len, NULL, 0); if (numCPU < 1) { mib[1] = HW_NCPU; sysctl(mib, 2, &numCPU, &len, NULL, 0); if (numCPU < 1) numCPU = 1; }
-
HPUX
int numCPU = mpctl(MPC_GETNUMSPUS, NULL, NULL);
-
IRIX
int numCPU = sysconf(_SC_NPROC_ONLN);
-
Objective-C(Mac OS X >=10.5或iOS)
NSUInteger a = [[NSProcessInfo processInfo] processorCount]; NSUInteger b = [[NSProcessInfo processInfo] activeProcessorCount];