Search code examples
c++cmultithreadingmultiplatform

Programmatically find the number of cores on a machine


Is there a way to determine how many cores a machine has from C/C++ in a platform-independent way? If no such thing exists, what about determining it per-platform (Windows/*nix/Mac)?


Solution

  • C++11

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

    Reference: std::thread::hardware_concurrency


    In C++ prior to C++11, there's no portable way. Instead, you'll need to use one or more of the following methods (guarded by appropriate #ifdef lines):

    • Win32

      SYSTEM_INFO sysinfo;
      GetSystemInfo(&sysinfo);
      int numCPU = sysinfo.dwNumberOfProcessors;
      
    • Linux, Solaris, AIX and Mac OS X >=10.4 (i.e. Tiger onwards)

      int numCPU = sysconf(_SC_NPROCESSORS_ONLN);
      
    • FreeBSD, MacOS X, NetBSD, OpenBSD, etc.

      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 or iOS)

      NSUInteger a = [[NSProcessInfo processInfo] processorCount];
      NSUInteger b = [[NSProcessInfo processInfo] activeProcessorCount];