1. ホーム
  2. c++

[解決済み] プログラムによってマシンのコア数を求める

2022-03-19 10:48:54

質問

プラットフォームに依存しない方法で、C/C++からマシンのコア数を決定する方法はありますか?ない場合は、プラットフォーム(Windows/*nix/Mac)ごとに判断するのはどうでしょうか?

どのように解決するのか?

C++11

#include <thread>

//may return 0 when not able to detect
const auto processor_count = std::thread::hardware_concurrency();

参考 std::thread::hardware_concurrency


C++11以前のC++では、ポータブルな方法はありません。 代わりに、以下のメソッドのうちの 1 つまたは複数を使用する必要があります(適切な #ifdef という行があります)。

  • Win32

    SYSTEM_INFO sysinfo;
    GetSystemInfo(&sysinfo);
    int numCPU = sysinfo.dwNumberOfProcessors;
    
    
  • Linux、Solaris、AIX、Mac OS X >=10.4(Tiger以降)。

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