프로그래밍 방식으로 머신에서 코어 수 찾기 ++의 코어 수를

플랫폼 독립적 인 방식으로 머신이 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 ++에서는 이식 가능한 방법이 없습니다. 대신 다음 방법 중 하나 이상을 사용해야합니다 (적절한 #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];

답변

이 기능은 C ++ 11 표준의 일부입니다.

#include <thread>

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

구형 컴파일러의 경우 Boost.Thread 라이브러리를 사용할 수 있습니다 .

#include <boost/thread.hpp>

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

두 경우 모두, hardware_concurrency()CPU 코어 수와 하이퍼 스레딩 장치 수에 따라 하드웨어가 동시에 실행할 수있는 스레드 수를 반환합니다.


답변

OpenMP 는 많은 플랫폼 (Visual Studio 2005 포함)에서 지원되며

int omp_get_num_procs();

호출시 사용 가능한 프로세서 / 코어 수를 반환하는 함수입니다.


답변

어셈블리 언어 액세스 권한이있는 경우 CPUID 명령어를 사용하여 CPU에 대한 모든 종류의 정보를 얻을 수 있습니다. 운영 체제간에 이식 가능하지만 제조업체 별 정보를 사용하여 코어 수를 찾는 방법을 결정해야합니다. 다음 은 인텔 칩 에서 수행하는 방법을 설명하는 문서이며이 11 페이지 는 AMD 사양을 설명합니다.


답변

C 코드에서 (거의) 플랫폼 독립적 기능

#ifdef _WIN32
#include <windows.h>
#elif MACOS
#include <sys/param.h>
#include <sys/sysctl.h>
#else
#include <unistd.h>
#endif

int getNumCores() {
#ifdef WIN32
    SYSTEM_INFO sysinfo;
    GetSystemInfo(&sysinfo);
    return sysinfo.dwNumberOfProcessors;
#elif MACOS
    int nm[2];
    size_t len = 4;
    uint32_t count;

    nm[0] = CTL_HW; nm[1] = HW_AVAILCPU;
    sysctl(nm, 2, &count, &len, NULL, 0);

    if(count < 1) {
        nm[1] = HW_NCPU;
        sysctl(nm, 2, &count, &len, NULL, 0);
        if(count < 1) { count = 1; }
    }
    return count;
#else
    return sysconf(_SC_NPROCESSORS_ONLN);
#endif
}

답변

Linux에서는 / proc / cpuinfo 파일을 읽고 코어를 계산할 수 있습니다.


답변

“코어 수”는 특히 유용한 숫자가 아닐 수 있으므로 조금 더 한정해야 할 수도 있습니다. Intel HT, IBM Power5 및 Power6과 같은 멀티 스레드 CPU와 Sun의 Niagara / UltraSparc T1 및 T2를 가장 잘 계산하려면 어떻게 하시겠습니까? 더 흥미로운 점은 두 가지 수준의 하드웨어 스레딩 (감독자 및 사용자 수준)을 갖춘 MIPS 1004k입니다. 하드웨어에 수십 개의 CPU가 있지만 특정 OS가있는 하이퍼 바이저 지원 시스템으로 이동할 때 발생하는 상황은 말할 것도 없습니다. 몇 개만 봅니다.

로컬 OS 파티션에있는 논리 처리 장치 수를 알려주는 것이 가장 좋습니다. 하이퍼 바이저가 아닌 한 실제 머신을 보는 것을 잊어 버리십시오. 오늘날이 규칙에 대한 유일한 예외는 x86 육상이지만, 비가 상 머신의 끝은 빨라지고 있습니다 …