以编程的方式查找计算机上的内核数量

21 浏览
0 Comments

以编程的方式查找计算机上的内核数量

有没有一种跨平台的方式来从C/C++中确定机器有多少个核心? 如果不存在这样的东西,那么在每个平台上确定它(Windows / * nix / Mac)呢?

admin 更改状态以发布 2023年5月21日
0
0 Comments

这个功能是 C++11 标准的一部分。

#include 
unsigned int nthreads = std::thread::hardware_concurrency();

对于老的编译器,可以使用Boost.Thread库。

#include 
unsigned int nthreads = boost::thread::hardware_concurrency();

无论哪种情况,hardware_concurrency()返回硬件可以同时运行的线程数量,这取决于 CPU 核心数和超线程单元的数量。

0
0 Comments

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];
    

0